PK .Aoa,mimetypeapplication/epub+zipPK.AiTunesMetadata.plistM artistName Oracle Corporation book-info cover-image-hash 756151046 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 974476909 publisher-unique-id E10587-05 unique-id 239661227 genre Oracle Documentation itemName Oracle® Database JPublisher User's Guide, 11g Release 2 (11.2) releaseDate 2011-08-10T14:47:34Z year 2011 PK# RMPK.AMETA-INF/container.xml PKYuPK.AOEBPS/cover.htmO Cover

Oracle Corporation

PK[pTOPK.AOEBPS/title.htmm Oracle Database JPublisher User's Guide, 11g Release 2 (11.2)

Oracle® Database

JPublisher User's Guide

11g Release 2 (11.2)

E10587-05

August 2011


Oracle Database JPublisher User's Guide, 11g Release 2 (11.2)

E10587-05

Copyright © 1999, 2011, Oracle and/or its affiliates. All rights reserved.

Primary Author:  Tulika Das, Brian Wright

Contributing Authors:  Venkatasubramaniam Iyer, Janice Nygard, Thomas Pfaeffle, Ekkehard Rohwedder, P. Alan Thiesen

Contributor:  Quan Wang, Kuassi Mensah, Deepa Aswani, Prabha Krishna, Ellen Siegal

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

PK# Command-Line Options and Input Files

6 Command-Line Options and Input Files

This chapter describes the usage and syntax details of JPublisher option settings and input files to specify program behavior. It is organized into the following sections:

JPublisher Options

The following sections list and discuss JPublisher command-line options:

JPublisher Option Summary

Table 6-1 summarizes JPublisher options. For default values, the abbreviation, NA, means not applicable. The Category column refers to the corresponding conceptual area, indicating the section of this chapter where the option is discussed.

Table 6-1 Summary of JPublisher Options

Option NameDescriptionDefault ValueCategory

-access

Determines the access modifiers that JPublisher includes in generated method definitions.

public

Java code generation

-adddefaulttypemap

Appends an entry to the JPublisher default type map.

NA

Type maps

-addtypemap

Appends an entry to the JPublisher user type map.

NA

Type maps

-builtintypes

Specifies the data type mappings, jdbc or oracle, for built-in data types that are not numeric or large object (LOB).

jdbc

Data type mappings

-case

Specifies the case of Java identifiers that JPublisher generates.

mixed

Java code generation

-classpath

Adds to the Java classpath for JPublisher to resolve Java source and classes during translation and compilation.

Empty

Java environment

-compatible

Specifies a compatibility mode and modifies the behavior of -usertypes=oracle.

See Also: "JPublisher Backward-Compatibility Modes and Settings"

oradata

Backward compatibility

-compile

Determines whether to proceed with Java compilation or suppress it. This option also affects SQLJ translation for backward-compatibility modes.

true

Input/output

-compiler-executable

Specifies a Java compiler version, in case you want a version other than the default.

NA

Java environment

-context

Specifies the class that JPublisher uses for SQLJ connection contexts. This can be the DefaultContext class, a user-specified class, or a JPublisher-generated inner class.

DefaultContext

Connection

-defaulttypemap

Sets the default type map that JPublisher uses.

Refer to "JPublisher User Type Map and Default Type Map".

Type maps

-d

Specifies the root directory for placement of compiled class files.

Empty (all files directly present in the current directory)

Input/output

-dir

Specifies the root directory for placement of generated source files.

Empty (all files directly present in the current directory)

Input/output

-driver

Specifies the driver class that JPublisher uses for Java Database Connectivity (JDBC) connections to the database.

oracle.jdbc. OracleDriver

Connection

-encoding

Specifies the Java encoding of JPublisher input and output files.

The value of the system property file.encoding

Input/output

-endpoint

Specifies a Web service endpoint. This option is used in conjunction with the -proxywsdl option.

NA

Web services

-filtermodes

Filters code generation according to specified parameter modes.

NA

Java code generation

-filtertypes

Filters code generation according to specified parameter types.

NA

Java code generation

-generatebean

Ensures that generated code conforms to the JavaBeans specification.

false

Java code generation

-genpattern

Defines naming patterns for generated code.

NA

Java code generation

-gensubclass

Specifies whether and how to generate stub code for user subclasses.

true

Java code generation

-httpproxy

Specifies a proxy URL to resolve the URL of a Web Services Description Language (WSDL) document for access through a firewall. This option is used in conjunction with the -proxywsdl option.

NA

Web services

-input or -i

Specifies a file that lists the types and packages that JPublisher translates.

NA

Input files/items

-java

Specifies server-side Java classes for which JPublisher generates client-side classes.

NA

Input files/items

-lobtypes

Specifies the jdbc or oracle data type mapping that JPublisher uses for BLOB and CLOB types.

oracle

Data type mappings

-mapping

Specifies the mapping that generated methods support for object attribute types and method argument types.

Note: This option is deprecated in favor of the "XXXtypes" mapping options, but is supported for backward compatibility.

objectjdbc

Data type mappings

-methods

Determines whether JPublisher generates wrapper methods for stored procedures of translated SQL objects and PL/SQL packages. This option also determines whether JPublisher generates SQLJ classes or non-SQLJ classes, and whether it generates PL/SQL wrapper classes at all. There are settings to specify whether overloaded methods are allowed.

all

Java code generation

-numbertypes

Specifies the data type mappings, such as jdbc, objectjdbc, bigdecimal, or oracle, that JPublisher uses for numeric data types.

objectjdbc

Data type mappings

-omit_schema_names

Instructs JPublisher not to include the schema in SQL type name references in generated code.

Disabled (schema included in type names)

Java code generation

-outarguments

Specifies the holder type, such as arrays, Java API for XML-based Remote Procedure Call (JAX-RPC) holders, or function returns, for Java implementation of PL/SQL output parameters.

array

Java code generation

-overwritedbtypes

Specifies whether to ignore naming conflicts when creating SQL types.

true

PL/SQL code generation

-package

Specifies the name of the Java package into which JPublisher generates Java wrapper classes.

NA

Java code generation

-plsqlfile

Specifies a wrapper script to create and a dropper script to drop SQL conversion types for PL/SQL types and the PL/SQL package that JPublisher will use for generated PL/SQL code.

plsql_wrapper.sql, plsql_dropper.sql

PL/SQL code generation

-plsqlmap

Specifies whether to generate PL/SQL wrapper functions for stored procedures that use PL/SQL types.

true

PL/SQL code generation

-plsqlpackage

Specifies the PL/SQL package into which JPublisher generates PL/SQL code, such as call specifications, conversion functions, and wrapper functions.

JPUB_PLSQL_WRAPPER

PL/SQL code generation

-props or -p

Specifies a file that contains JPublisher options in addition to those listed on the command line.

NA

Input files/items

-proxyclasses

Specifies Java classes for which JPublisher generates wrapper classes and PL/SQL wrappers according to the -proxyopts setting. For Web services, you will typically use -proxywsdl instead, which uses -proxyclasses behind the scenes.

NA

Web services

-proxyopts

Specifies required layers of Java and PL/SQL wrappers and additional related settings.

Is used as input for the -proxywsdl and -proxyclasses options.

jaxrpc

Web services

-proxywsdl

Specifies the URL of a WSDL document for which Web services client proxy classes and associated Java wrapper classes are generated along with PL/SQL wrappers.

NA

Web services

-serializable

Specifies whether the code generated for object types implements the java.io.Serializable interface.

false

Java code generation

-sql or -s

Specifies object types and packages, or subsets of packages, for which JPublisher generates Java classes, and optionally subclasses and interfaces.

NA

Input files/items

-sqlj

Specifies SQLJ option settings for the JPublisher invocation of the SQLJ translator.

NA

SQLJ

-sqlstatement

Specifies SQL queries or data manipulation language (DML) statements for which JPublisher generates Java classes, and optionally subclasses and interfaces, with appropriate methods.

NA

Input files/items

-style

Specifies the name of a "style file" for Java-to-Java type mappings.

NA

Data type mappings

-sysuser

Specifies the name and password for a superuser account that can be used to grant permissions to execute wrappers that access Web services client proxy classes in the database.

NA

Web services

-tostring

Specifies whether to generate a toString() method for object types.

false

Java code generation

-typemap

Specifies the JPublisher type map.

Empty

Type maps

-types

Specifies object types for which JPublisher generates code.

Note: This option is deprecated in favor of -sql, but is supported for backward compatibility.

NA

Input files/items

-url

Specifies the URL that JPublisher uses to connect to the database.

jdbc:oracle:oci:@

Connection

-user or -u

Specifies an Oracle user name and password for connection.

NA

Connection

-usertypes

Specifies the jdbc or oracle type mapping that JPublisher uses for user-defined SQL types.

oracle

Data type mappings

-vm

Specifies a Java version, in case you want a version other than the default.

NA

Java environment


JPublisher Option Tips

Be aware of the following usage notes for JPublisher options:

  • JPublisher always requires the -user option or its shorthand equivalent -u.

  • Options are processed in the order in which they appear. Options from an INPUT file are processed at the point where the -input or -i option occurs. Similarly, options from a properties file are processed at the point where the -props or -p option occurs.

  • As a rule, if a particular option appears more than once, JPublisher uses the value from the last occurrence. However, this is not true for the following options, which are cumulative:

    -sql

    -types, which is deprecated

    -java

    -addtypemap or -adddefaulttypemap

    -style

  • In general, separate options and corresponding option values by an equal sign (=). However, when the following options appear on the command line, you can also use a space as a separator:

    -sql or -s, -user or -u, -props or -p, and -input or -i

  • With the -sqlj option, you must use a space instead of an equal sign, because SQLJ settings following the -sqlj option use equal signs. Consider the following example, where each entry after "-sqlj" is a SQLJ option:

    % jpub -user=scott -sql=PERSON:Person -sqlj -optcols=true
     -optparams=true -optparamdefaults=datatype1(size1),datatype2(size)
    Enter scott password: password
    
  • It is advisable to specify a Java package for generated classes with the -package option, either on the command line or in a properties file. For example, you could enter the following on the command line:

    % jpub -sql=Person -package=e.f ...
    

    Alternatively, you could enter the following in the properties file:

    jpub.sql=Person
    jpub.package=e.f
    ...
    

    These statements direct JPublisher to create the class Person in the Java package e.f, that is, to create the class e.f.Person.

  • If you do not specify a type or package in the INPUT file or on the command line, then JPublisher translates all types and packages in the user schema according to the options specified on the command line or in the properties file.

Notational Conventions

The JPublisher option syntax used in the following sections uses the following notational conventions:

  • Braces {...} enclose a list of possible values. Specify only one of the values within the braces.

  • A vertical bar | separates alternatives within braces.

  • Terms in italics are for user input. Specify an actual value or string.

  • Terms in boldface indicate default values.

  • Square brackets [...] enclose optional items. In some cases, however, square brackets or parentheses are part of the syntax and must be entered verbatim. In this case, this manual uses boldface: [...] or (...).

  • Ellipsis points ... immediately following an item, or items enclosed in brackets, mean that you can repeat the item any number of times.

  • Punctuation symbols other than those described in this section are entered as shown in this manual. These include "." and "@", for example.

Options for Input Files and Items to Publish

This section documents the following JPublisher options that specify key input, either JPublisher input files, such as INPUT files or properties files, or items to publish, such as SQL objects, PL/SQL packages, SQL queries, SQL DML statements, or server-side Java classes:

  • Options for input files: -input, -props

  • Options for items to publish: -java, -sql, -sqlstatement, -types

These options are discussed in alphabetic order.

File Containing Names of Objects and Packages to Translate

The -input option specifies the name of a file from which JPublisher reads the names of SQL or PL/SQL entities or server-side Java classes to publish, along with any related information or instructions. JPublisher publishes each item in the list. You can think of the INPUT file as a makefile for type declarations, which lists the types that need Java class definitions.

The syntax of the -input option is as follows:

-input=filename
-i filename

Both formats are synonymous. The second one is a convenient command-line shortcut.

In some cases, JPublisher may find it necessary to translate some additional classes that do not appear in the INPUT file. This is because JPublisher analyzes the types in the INPUT file for dependencies before performing the translation and translates other types as necessary.

If you do not specify any items to publish in an INPUT file or on the command line, then JPublisher translates all user-defined SQL types and PL/SQL packages declared in the database schema to which it is connected.

Declaration of Server-Side Java Classes to Publish

The -java option enables you to create client-side stub classes to access server-side classes. This is an improvement over earlier JPublisher releases in which calling Java stored procedures and functions from a database client required JDBC calls to associated PL/SQL wrappers.

The syntax of the -java option is as follows:

-java=class_or_package_list

The functionality of the -java option mirrors that of the -sql option. It creates a client-side Java stub class to access a server-side Java class, in contrast to creating a client-side Java class to access a server-side SQL object or PL/SQL package.

When using the -java option, specify a comma-delimited list of server-side Java classes or packages.


Note:

  • To use the -java option, you must also specify the -user and -url settings for a database connection.

  • It is advisable to use the same Java Development Kit (JDK) on the client as on the server.


For example:

-java=foo.bar.Baz,foo.baz.*

Or, to specify the client-side class name corresponding to Baz, instead of using the server-side name by default:

-java=foo.bar.Baz:MyBaz,foo.baz.*

This setting creates MyBaz and not foo.bar.MyBaz.

or:

-java=foo.bar.Baz:foo.bar.MyBaz,foo.baz.*

You can also specify a schema:

-java=foo.bar.Baz@SCOTT

If you specify the schema, then only that schema is searched. If you do not specify a schema, then the schema of the logged-in user, according to the -user option setting, is searched. This is the most likely scenario.

As an example, assume that you want to call the following method on the server:

public String oracle.sqlj.checker.JdbcVersion.to_string();

Use the following -java setting:

-java=oracle.sqlj.checker.JdbcVersion

Note:

If JPublisher cannot find a specified class in the schema, a specified schema or the schema of the logged-in user, then it uses the Class.forName() method to search for the class among system classes in the Java Virtual Machine (JVM), typically Java run-time environment (JRE) or JDK classes.

Code Generation for -java Option When you use the -java option, generated code uses the following API:

public class Client
{
   public static String getSignature(Class[]);
   public static Object invoke(Connection, String, String, 
                               String, Object[]);
   public static Object invoke(Connection, String, String, 
                               Class[], Object[]);
}

Classes for the API are located in the oracle.jpub.reflect package, so client applications must import this package.

For a setting of -java=oracle.sqlj.checker.JdbcVersion, JPublisher-generated code includes the following call:

Connection conn = ...;
String serverSqljVersion = (String)
           Client.invoke(conn, "oracle.sqlj.checker.JdbcVersion",
           "to_string", new Class[]{}, new Object[]{});

The Class[] array is for the method parameter types, and the Object[] array is for the parameter values. In this case, because to_string has no parameters, the arrays are empty.

Note the following:

  • Any serializable type, such as int[] or String[], can be passed as an argument.

  • The semantics of this API are different from the semantics for invoking Java stored procedures or functions through a PL/SQL wrapper, in the following ways:

    • Arguments cannot be OUT or IN OUT. Returned values must be part of the function result.

    • Exceptions are properly returned.

    • Method invocation uses invoker's rights. There is no tuning to obtain definer's rights.


      See Also:

      Oracle Database Java Developer's Guide for information about invoker's rights and definer's rights

Declaration of Server-Side Java Classes to Publish

The related options for publishing a server-side Java class are:

  • -dbajva=class_list
    
  • -proxyopts=single|multiple|static|arrayin|arrayout|arrayinout
    |arrayall|noload
    
  • -compatible=10.1
    
  • -sysuser=user/password
    
  • -plsqlfile=wrapper[,dropper]
    
  • -plsqlpackage=name
    

Oracle Database 10g release 1 (10.1) introduced the -java option to publish server-side Java classes. Oracle Database 10g release 2 (10.2) introduced a new approach toward server-side Java class publishing. The -dbjava option publishes a server-side Java class into PL/SQL, or into client-side Java class. The class_list specification is a comma-delimited list of server-side classes at the specified server. The class_list item is of the form classname[:name[#interface]]. It can also be a package name. Consider the option:

-dbajva=classname[:name[#interface]]

If name is not specified, then the server-side Java class, classname, is published into PL/SQL, else into the client-side Java class, name. If interface is specified, then the interface file is generated for the client-side Java class.

When used with -dbjava, the -proxyopts option indicates whether to map instance methods using a singleton instance or using multiple instances, and also whether to map methods with array parameters assuming arrays as IN, OUT, IN OUT, or all the modes. The -proxyopts=static setting specifies that only static methods should be published. The default setting, -proxyopts=single,arrayin, indicates that instance methods are called using a singleton instance and array parameters are considered as input. The -proxyopts=noload setting forbids JPublisher from loading the generated PL/SQL and Java stored procedure wrappers.

The -compatible=10.1 option makes -dbjava equivalent to -java.

Declaration of Server-Side Java Classes to Publish

The related options for publishing server-side Java class are:

  • -proxyclasses=class_or_jar_list
    
  • -proxyopts=single|multiple|static|arrayin|arrayout|arrayinout
    |arrayall
    
  • -plsqlfile=wrapper[,dropper]
    
  • -plsqlpackage=name
    

The -proxyclasses option is similar to -dbjava. While -dbjava requires that the classes to be published exist in the database, -proxyclasses requires that the classes appear in the classpath. Typically, by using -proxyclasses, you can load the exposed classes and the generated wrappers into the database later.

The -proxyclasses option generates only a PL/SQL wrapper. Unlike -dbjava, it will not generate client-side Java code for a server-side Java class. Also, unlike -dbjava, -proxyclasses does not load the generated Java stored procedure into the database.

You can use the -proxyclasses option to specify a comma-delimited list of Java classes, either loose classes or Java Archive (JAR) files, for which JPublisher creates PL/SQL wrappers. Depending on the situation, JPublisher can also create Java wrapper classes to afford access from PL/SQL. Each of the classes processed must have either public, static methods or, for classes in which you want to publish instance methods, a public zero-argument constructor.

To summarize, the following are generated for each class being processed, depending on the -proxyopts option settings:

  • A PL/SQL wrapper to allow access from PL/SQL. This is always generated.

  • A wrapper class to expose Java instance methods as static methods, if there are any instance methods to publish.

Instance methods must be exposed as static methods to allow access from PL/SQL. A wrapper class is also necessary if the wrapped class uses anything other than Java primitive types in the method calling sequences.

While using the -proxyclasses option directly, you can specify JAR files and Java classes that exist in the classpath. Classes and JAR files can be specified as follows:

  • Class name, such as foo.bar.Baz or foo.bar.Baz.class

  • Package name, such as foo.bar.*, for @server mode only

  • JAR or ZIP file name, such as foo/bar/baz.jar or Baz.zip

  • JAR or ZIP file name followed by parenthesized list of classes or packages, such as baz.jar (foo.MyClass1, foo.bar.MyClass2, foo1.*)

Settings for Java and PL/SQL Wrapper Generation

The -proxyopts option is used as input by the -dbjava, -proxywsdl, and -proxyclasses options and specifies JPublisher behavior in generating wrapper classes and PL/SQL wrappers for server-side Java classes.

The syntax of the -proxyopts option is as follows:

-proxyopts=setting1,setting2,...

This option uses the basic settings, which can be used individually or in combinations. In this discussion, processed classes are the classes that are wrapped by using the -dbjava, -proxywsdl, or -proxyclasses options.

Where Java wrapper classes are generated, the wrapper class for a class foo.bar.MyClass would be foo.bar.MyClassJPub, unless the package is overridden by a setting of the -package option.

You can use the basic -proxyopts settings as follows:

  • Use the static setting to specify the treatment of static methods of processed classes.

    With this setting, in the PL/SQL wrapper, a wrapper procedure is generated for each static method. Without this setting, static methods are ignored. For classes with only static methods, wrapper classes are not required for processed classes that use only Java primitive types in their method calling sequences.

  • Use the multiple or single setting to specify treatment of instance methods of processed classes, where you want instance methods exposed as static methods. In either case, for each processed class, JPublisher generates an intermediate Java class that wraps instance methods with static methods, in addition to generating a PL/SQL wrapper.

    Use the instance setting to specify treatment of instance methods of processed classes, where you want instance methods maintained as instance methods.

    These settings function as follows:

    • multiple

      For each processed class, the Java wrapper class has a static equivalent for each instance method through the use of handles, which identify instances of wrapped classes.

    • single

      Only a single default instance of each wrapped class is used during run time. For each processed class, the Java wrapper class has static wrapper methods for instance methods without requiring the use of handles. This is the singleton mechanism.

    • instance

      Instance methods are wrapped as instance methods in the Java wrapper class.


      Note:

      The instance setting is not appropriate for Web services.

    The instance methods are ignored if one of these settings or a jaxrpc or soap setting, which implies single, is not specified. For either of these settings, only classes that provide a public zero-argument constructor are processed. You can use both settings to generate wrapper classes of both styles.

  • Use the jaxrpc or soap setting to publish instance methods of Web services client proxy classes. These settings function as follows:

    • jaxrpc

      This is the default setting. It is a convenient setting for wrapping JAX-RPC client proxy classes, which is appropriate for use with Oracle Application Server 10g 10.0.1 and later releases. JPublisher creates a Java wrapper class for each processed class and also creates the PL/SQL wrapper. Client proxy classes do not have static methods to be published, and instance methods are published using the singleton mechanism by default. Therefore, when processing JAX-RPC client proxy classes, -proxyopts=jaxrpc implies -proxyopts=single. The jaxrpc setting also results in generation of special code that is specific to JAX-RPC clients.

    • soap

      This setting is equivalent to the jaxrpc setting, but is used for wrapping SOAP client proxy classes instead of JAX-RPC client proxy classes. This is appropriate for use with Oracle Application Server 10g 9.0.4 and earlier releases.

Here are some basic uses of the -proxyopts option:

-proxyopts=jaxrpc

-proxyopts=soap

-proxyopts=static

-proxyopts=static,instance

-proxyopts=single

-proxyopts=single,multiple

-proxyopts=static,multiple

The static,instance setting publishes static and instance methods. The single,multiple setting publishes only instance methods, using both the singleton mechanism and the handle mechanism. The static,multiple setting publishes static and instance methods, using the handle mechanism to expose instance methods as static methods.


Note:

It is typical to explicitly use the -proxyopts option with the -proxyclasses option than with the -proxywsdl option. For the use of -proxywsdl with 10.0.x releases of Oracle Application Server 10g, the default -proxyopts=jaxrpc setting is sufficient.

There are additional, advanced -proxyopts settings as well. The functionality of each setting is as follows:

  • noload

    Use this to indicate that the generated code need not be loaded into the database. By default, the generated code is loaded.

  • recursive

    Use this to indicate that when processing a class that extends another class, also create PL/SQL and Java wrappers, if appropriate, for inherited methods.

  • tabfun

    Use this with the jaxrpc or soap setting for JPublisher to generate PL/SQL table functions for the PL/SQL package for each of the wrapped Web services operations. This exposes data through database tables rather than stored procedures or functions.

    Do not use the -proxyopts=tabfun setting when the Web service operation contains array types as parameter types. In such cases, JPublisher generates PL/SQL stored procedure with SQL tables as parameter types. So, setting the -proxyopts=tabfun setting will result in compilation error for the generated PL/SQL wrapper.

  • deterministic

    Use this to indicate in the generated PL/SQL wrapper that the wrapped methods are deterministic. This would typically be used with the tabfun setting. Deterministic is a PL/SQL annotation.


    See Also:

    Oracle Database SQL Language Reference for information about DETERMINISTIC functions

  • main(0,...)

    Use this with the static setting to define the wrapper methods to be generated if there is a public void String main(String[]) method in the class. A separate method is generated for each number of arguments that you want to support. You can use commas or hyphens when indicating the number of arguments, as in the following examples:

    • main or main(0) produces a wrapper method only for zero arguments.

    • main(0,1) produces wrapper methods for zero arguments and one argument. This is the default setting.

    • main(0-3) produces wrapper methods for zero, one, two, and three arguments.

    • main(0,2-4) produces wrapper methods for zero, two, three, and four arguments.

    The maximum number of arguments in the wrapper method for the main() method is according to PL/SQL limitations.

The following example uses the jaxrpc basic setting by default. It also uses table functions and indicates that wrapped methods are deterministic:

-proxyopts=tabfun,deterministic

The following example explicitly sets the static mode, processing classes that are not client proxy classes, and specifies that the generated code should not be loaded into the database:

-proxyopts=static,noload

Input Properties File

The -props option specifies the name of a JPublisher properties file that specifies JPublisher option settings. JPublisher processes the properties file as if its contents were inserted in sequence on the command line where the -props option is specified.

The syntax of the -props option is as follows:

-props=filename
-p filename

Both formats are synonymous. The second one is provided as a convenient command-line shortcut.

If more than one properties file appears on the command line, then JPublisher processes them with the other command-line options, in the order in which they appear.


Note:

Encoding settings, either set through the JPublisher -encoding option or the Java file.encoding setting, do not apply to Java properties files. Properties files always use the 8859_1 encoding. This is a feature of Java in general, and not of JPublisher in particular. However, you can use Unicode escape sequences in a properties file.

Declaration of Object Types and Packages to Translate

The -sql option is used to specify the user-defined SQL types, such as objects or collections, or the PL/SQL packages that need to be published. Optionally, you can specify the user subclasses or interfaces that should be generated. You can publish all or a specific subset of a PL/SQL package.

The syntax of the -sql option is as follows:

-sql={toplevel|object_type_and_package_translation_syntax}
-s {toplevel|object_type_and_package_translation_syntax}

The two formats of this option, -sql and -s, are synonymous. The -s format is provided as a convenient command-line shortcut.

You can use the -sql option when you do not need the generality of an INPUT file. The -sql option lets you list one or more database entities declared in SQL that you want JPublisher to translate. Alternatively, you can use several -sql options in the same command line, or several jpub.sql options in a properties file.

You can mix user-defined type names and package names in the same -sql declaration. JPublisher can detect whether each item is an object type or a package. You can also use the -sql option with the keyword toplevel to translate all top-level PL/SQL subprograms in a schema. The toplevel keyword is not case-sensitive.

If you do not specify any types or packages to translate in the INPUT file or on the command line, then JPublisher translates all the types and packages in the schema to which you are connected. In this section, the -sql option is explained in terms of the equivalent INPUT file syntax.

You can use the any of the following syntax modes:

  • -sql=name_a

    JPublisher publishes name_a, naming the generated class according to the default settings. In an INPUT file, you specify this options as follows:

    SQL name_a
    
  • -sql=name_a:class_c

    JPublisher publishes name_a as the generated Java class class_c. In an INPUT file, you specify this options as follows:

    SQL name_a AS class_c
    
  • -sql=name_a:class_b:class_c

    In this case, name_a must represent an object type. JPublisher generates the Java class, class_b, and a stub class, class_c, that extends class_b. You provide the code for class_c, which is used to represent name_a in your Java code. In an INPUT file, you specify this options as follows:

    SQL name_a GENERATE class_b AS class_c
    
  • -sql=name_a:class_b#intfc_b

  • -sql=name_a:class_b:class_c#intfc_c

    You can use either of these syntax formats to have JPublisher generate a Java interface. This feature is particularly useful for Web services. In the first case, class_b represents name_a and implements intfc_b. In the second case, class_c represents name_a, extends class_b, and implements intfc_c.

    Specify an interface for either the generated class or the user subclass, but not both. In an INPUT file, this syntax is as follows:

      SQL name_a
        [GENERATE  class_b
                   [ implements intfc_b] ]
        [AS        class_c
                   [ implements intfc_c ] ]
        ...
    

Note:

  • Only SQL names that are not case-sensitive are supported on the JPublisher command line. If a user-defined type was defined in a case-sensitive way in SQL, using quotes, then you must specify the name in the JPublisher INPUT file instead of specifying the user-defined type, in quotes, on the command line.

  • If your desired class and interface names follow a pattern, you can use the -genpattern command-line option for convenience.


If you enter more than one item for translation, then the items must be separated by commas, without any white space. This example assumes that CORPORATION is a package and that EMPLOYEE and ADDRESS are object types:

-sql=CORPORATION,EMPLOYEE:OracleEmployee,ADDRESS:JAddress:MyAddress

JPublisher interprets this command as follows:

SQL CORPORATION 
SQL EMPLOYEE AS OracleEmployee 
SQL ADDRESS GENERATE JAddress AS MyAddress

JPublisher performs the following actions:

  • Creates a wrapper class for the CORPORATION package.

  • Translates the EMPLOYEE object type as OracleEmployee.

  • Generates an object reference class, OracleEmployeeRef.

  • Translates ADDRESS as JAddress, but generates code and references so that ADDRESS objects will be represented by the MyAddress class.

  • Generates a MyAddress stub, which extends JAddress, where you can write your custom code.

  • Generates an object reference class MyAddressRef.

If you want JPublisher to translate all the top-level PL/SQL subprograms in the schema to which JPublisher is connected, then enter the keyword toplevel following the -sql option. JPublisher treats the top-level PL/SQL subprograms as if they were in a package. For example:

-sql=toplevel

JPublisher generates a wrapper class, toplevel, for the top-level subprograms. If you want the class to be generated with a different name, you can declare the name as follows:

-sql=toplevel:MyClass 

Note that this is synonymous with the following INPUT file syntax:

SQL toplevel AS MyClass

Similarly, if you want JPublisher to translate all the top-level PL/SQL subprograms in some other schema, then enter:

-sql=schema_name.toplevel

In this example, schema_name is the name of the schema containing the top-level subprograms. In addition, there are features to publish only a subset of stored procedures in a PL/SQL package or at the top level, using the following syntax:

-sql=plsql_package(proc1+proc2+proc3+...)

Use a plus sign (+) between stored procedure names. Alternatively, for the SQL top level, use:

-sql=toplevel(proc1+proc2+proc3+...)

The following syntax is for a JPublisher INPUT file, where commas are used between stored procedure names:

SQL plsql_package (proc1, proc2, proc3, ...) AS ...

Note:

  • In an INPUT file, put a stored procedure name in quotes if it is case-sensitive. For example, "proc1". JPublisher assumes that names that are not in quotes are not case-sensitive.

  • Case-sensitive names are not supported on the JPublisher command line.

  • Specified stored procedure names can end in the wildcard character, "%". The specification "myfunc%", for example, matches all stored procedures that have their name starting with myfunc, such as myfunc1.


You can also specify the subset according to stored procedure names and argument types by using the following syntax:

myfunc(sqltype1, sqltype2, ...)

In this case, only those stored procedures that match in name and the number and types of arguments will be published. For example:

-sql=mypackage(myfunc1(NUMBER, CHAR)+myfunc2(VARCHAR2))

Declaration of SQL Statements to Translate

The -sqlstatement option enables you to publish SELECT, INSERT, UPDATE, or DELETE statements as Java methods. JPublisher generates SQLJ classes for this functionality.

The syntax of the -sqlstatement option is as follows:

-sqlstatement.class=ClassName:UserClassName#UserInterfaceName
-sqlstatement.methodName=sqlStatement
-sqlstatement.return={both|resultset|beans}

Use -sqlstatement.class to specify the Java class in which the method will be published. In addition to the JPublisher-generated class, you can optionally specify a user subclass of the generated class, a user interface for the generated class or subclass, or both. Functionality for subclasses and interfaces is the same as for the -sql option. If you also use the JPublisher -package option, then the class you specify will be in the specified package. The default class is SQLStatements.

Use -sqlstatement.methodName to specify the desired Java method name and the SQL statement. For a SELECT statement, use -sqlstatement.return to specify whether JPublisher should generate a method that returns a generic java.sql.ResultSet instance, a method that returns an array of JavaBeans, or both. Generic implies that the column types of the result set are unknown or unspecified.

For queries, however, the column types are actually known. This provides the option of returning specific results through an array of beans. The name of the method returning ResultSet will be methodName(). The name of the method returning JavaBeans will be methodNameBeans().


Note:

If your desired class and interface names follow a pattern, then you can use the -genpattern option for convenience.

JPublisher INPUT file syntax is as follows:

SQLSTATEMENTS_TYPE ClassName AS UserClassName
                             IMPLEMENTS UserInterfaceName
SQLSTATEMENTS_METHOD aSqlStatement AS methodName

Here is a set of sample settings:

-sqlstatement.class=MySqlStatements
-sqlstatement.getEmp="select ename from emp
                      where ename=:{myname VARCHAR}"
-sqlstatement.return=both

These settings result in the generated code shown in "Generated Code: SQL Statement".

In addition, be aware that a style file specified through the -style option is relevant to the -sqlstatement option. If a SQL statement uses an Oracle data type X, which corresponds to a Java type Y, and type Y is mapped to a Java type Z in the style file, then methods generated as a result of the -sqlstatement option will use Z, and not Y.

For SELECT or DML statement results, you can use a style file to map the results to javax.xml.transform.Source, oracle.jdbc.rowset.OracleWebRowSet, or org.w3c.dom.Document.

Declaration of Object Types to Translate

The -types option lets you list one or more individual object types that you want JPublisher to translate. The syntax of the -types option is as follows:

-types=type_translation_syntax

Note:

The -types option is currently supported for compatibility, but it is deprecated. Use the -sql option instead.

You can use the -types option, for SQL object types only and when you do not need the generality of an INPUT file. Except for the fact that the -types option does not support PL/SQL packages, it is identical to the -sql option.

If you do not enter any types or packages to translate in the INPUT file or on the command line, then JPublisher translates all the types and packages in the schema to which you are connected. The command-line syntax lets you indicate three possible type translations.

  • -types=name_a

    JPublisher interprets this syntax as:

    TYPE name_a
    
  • -types=name_a:name_b

    JPublisher interprets this syntax as:

    TYPE name_a AS name_b
    
  • -types=name_a:name_b:name_c

    JPublisher interprets this syntax as:

    TYPE name_a GENERATE name_b AS name_c
    

TYPE, TYPE...AS, and TYPE...GENERATE...AS commands have the same functionality as SQL, SQL...AS, and SQL...GENERATE...AS syntax.

Enter -types=... on the command line, followed by one or more object type translations that you want JPublisher to perform. If you enter more than one item, then the items must be separated by commas without any white space. For example, if you enter:

-types=CORPORATION,EMPLOYEE:OracleEmployee,ADDRESS:JAddress:MyAddress

JPublisher interprets this command as:

TYPE CORPORATION
TYPE EMPLOYEE AS OracleEmployee
TYPE ADDRESS GENERATE JAddress AS MyAddress

Connection Options

This section documents options related to the database connection that JPublisher uses. The options are discussed in the alphabetic order.

SQLJ Connection Context Classes

The -context option specifies the connection context class that JPublisher uses, and possibly declares, for SQLJ classes that JPublisher produces. The syntax of the -context option is as follows:

-context={generated|DefaultContext|user_defined}

The -context=DefaultContext setting is the default and results in any JPublisher-generated SQLJ classes using the SQLJ default connection context class, sqlj.runtime.ref.DefaultContext, for all connection contexts. This is sufficient for most uses.

Alternatively, you can specify any user-defined class that implements the standard sqlj.runtime.ConnectionContext interface and exists in the classpath. The specified class will be used for all connection contexts.


Note:

With a user-defined class, instances of that class must be used for output from the getConnectionContext() method or for input to the setConnectionContext() method. Refer to "Connection Contexts and Instances in SQLJ Classes", for information about these methods.

The -context=generated setting results in an inner class declaration for the _Ctx connection context class in all SQLJ classes generated by JPublisher. So, each class uses its own SQLJ connection context class. This setting may be appropriate for Oracle8i compatibility mode, but it is otherwise not recommended. Using the DefaultContext class or a user-defined class avoids the generation of additional connection context classes. You can specify the -context option on the command line or in a properties file.

Notes for -context Usage in Backward-Compatibility Modes

If you use a backward-compatibility mode and use .sqlj files and the SQLJ translator directly, then a -context=DefaultContext setting gives you greater flexibility if you translate and compile your .sqlj files in separate steps, translating with the SQLJ -compile=false setting. If you are not using JDK 1.2-specific types, such as java.sql.BLOB, CLOB, Struct, Ref, or Array, then you can compile the resulting .java files under JDK 1.1, JDK 1.2, or later. This is not the case with the -context=generated setting, because SQLJ connection context classes in JDK 1.1 use java.util.Dictionary instances for object type maps, while SQLJ connection context classes in JDK 1.2 or later use java.util.Map instances.

A benefit of using the -context=generated setting, if you are directly manipulating .sqlj files, is that it permits full control over the way the SQLJ translator performs online checking. Specifically, you can check SQL user-defined types and PL/SQL packages against an appropriate exemplar database schema. However, because JPublisher generates .sqlj files from an existing schema, the generated code is already verified as correct through construction from that schema.

The Default datasource Option

You can use -datasource to specify the default data source for publishing SQL, PL/SQL, AQ, and server-side Java classes. With -datasource set, if the JDBC connection is not explicitly set by the application at run time, then the generated code will look up the specified Java Naming and Directory Interface (JNDI) location to get the data source and further get the JDBC connection from that data source.

The syntax of the -datasource option is as follows:

-datasource=jndi_location

JDBC Driver Class for Database Connection

The -driver option specifies the driver class that JPublisher uses for JDBC connections to the database. The syntax of this option is as follows:

-driver=driver_class_name

The default setting is:

-driver=oracle.jdbc.OracleDriver

This setting is appropriate for any Oracle JDBC driver.

Connection URL for Target Database

You can use the -url option to specify the URL of the database to which you want to connect. The syntax of the -url option is as follows:

-url=URL

The default setting is:

-url=jdbc:oracle:oci:@

To specify the JDBC Thin driver, use a setting of the following form:

-url=jdbc:oracle:thin:@host:port/servicename

In this syntax, host is the name of the host on which the database is running, port is the port number, and servicename is the name of the database service.


Note:

The use of system identifiers (SIDs) has been deprecated since Oracle Database 10g, but it is still supported for backward compatibility. Their use is of the form host:port:sid.

For Oracle JDBC Oracle Call Interface (OCI) driver, use oci in the connection string in any new code. For backward compatibility, however, oci8 is still accepted for Oracle8i drivers.


User Name and Password for Database Connection

JPublisher requires the -user option, which specifies an Oracle user name and password, so that it can connect to the database. If you do not enter the -user option, then JPublisher prints an error message and stops execution.

The syntax of the -user option is as follows:

-user=username/password
-u username/password

Both formats are equivalent. The second one is provided as a convenient command-line shortcut.

For example, the following command directs JPublisher to connect to the database with the user name scott:

% jpub -user=scott -input=demoin -dir=demo -mapping=oracle -package=corp
Enter scott password: password

Options for Data Type Mappings

The following options control the data type mappings that JPublisher uses to translate object types, collection types, object reference types, and PL/SQL packages to Java classes:

  • The -usertypes option controls JPublisher behavior for user-defined types, in conjunction with the -compatible option for oracle mapping. Specifically, it controls whether JPublisher implements the Oracle ORAData interface or the standard SQLData interface in generated classes, and whether JPublisher generates code for collection and object reference types.

  • The -numbertypes option controls data type mappings for numeric types.

  • The -lobtypes option controls data type mappings for the BLOB, CLOB, and BFILE types.

  • The -builtintypes option controls data type mappings for non-numeric, non-LOB, and predefined SQL and PL/SQL types.

These four options are known as the type-mapping options.

For an object type, JPublisher applies the mappings specified by the type-mapping options to the object attributes and the arguments and results of any methods included with the object. The mappings control the types that the generated accessor methods support. For example, they support the types the getXXX() methods return and the setXXX() methods take.

For a PL/SQL package, JPublisher applies the mappings to the arguments and results of the methods in the package. For a collection type, JPublisher applies the mappings to the element type of the collection.

In addition, there is a subsection here for the -style option, which you can use to specify Java-to-Java type mappings, typically to support Web services. This involves an extra JPublisher step. A SQL type is mapped to a Java type that is not supported by Web services, in the JPublisher-generated base class. Then this Java type is mapped to a Java type that is supported by Web services, in the JPublisher-generated user subclass.

Mappings for Built-In Types

The -builtintypes option controls data type mappings for all the built-in data types except the LOB types, which are controlled by the -lobtypes option, and the different numeric types, which are controlled by the -numbertypes option. The syntax of the -builtintypes option is as follows:

-builtintypes={jdbc|oracle}

Table 6-2 lists the data types affected by the -builtintypes option and shows their Java type mappings for -builtintypes=oracle and -builtintypes=jdbc, which is the default.

Table 6-2 Mappings for Types Affected by the -builtintypes Option

SQL Data TypeOracle Mapping TypeJDBC Mapping Type

CHAR, CHARACTER, LONG, STRING, VARCHAR, VARCHAR2

oracle.sql.CHAR

java.lang.String

RAW, LONG RAW

oracle.sql.RAW

byte[]

DATE

oracle.sql.DATE

java.sql.Timestamp

TIMESTAMP

TIMESTAMP WITH TZ

TIMESTAMP WITH LOCAL TZ

oracle.sql.TIMESTAMP

oracle.sql.TIMESTAMPTZ

oracle.sql.TIMESTAMPLTZ

java.sql.Timestamp


Mappings for LOB Types

The -lobtypes option controls data type mappings for LOB types. The syntax of the -lobtypes option is as follows:

-lobtypes={jdbc|oracle}

Table 6-3 shows how these types are mapped for -lobtypes=oracle, which is the default, and for -lobtypes=jdbc.

Table 6-3 Mappings for Types Affected by the -lobtypes Option

SQL Data TypeOracle Mapping TypeJDBC Mapping Type

CLOB

oracle.sql.CLOB

java.sql.Clob

BLOB

oracle.sql.BLOB

java.sql.Blob

BFILE

oracle.sql.BFILE

oracle.sql.BFILE



Note:

  • BFILE is an Oracle-specific SQL type, so there is no standard java.sql.Bfile Java type.

  • NCLOB is an Oracle-specific SQL type. It denotes an NCHAR form of use of a CLOB and is represented as an instance of oracle.sql.NCLOB in Java.

  • The java.sql.Clob and java.sql.Blob interfaces were introduced in the JDK 1.2 versions.


Mappings for Numeric Types

The -numbertypes option controls data type mappings for numeric SQL and PL/SQL types. The syntax of the -numbertypes option is as follows:

-numbertypes={jdbc|objectjdbc|bigdecimal|oracle}

The following choices are available:

  • In JDBC mapping, most numeric data types are mapped to Java primitive types, such as int and float, and DECIMAL and NUMBER are mapped to java.math.BigDecimal.

  • In Object JDBC mapping, which is the default, most numeric data types are mapped to Java wrapper classes, such as java.lang.Integer and java.lang.Float. DECIMAL and NUMBER are mapped to java.math.BigDecimal.

  • In BigDecimal mapping, all numeric data types are mapped to java.math.BigDecimal.

  • In Oracle mapping, all numeric data types are mapped to oracle.sql.NUMBER.

Table 6-4 lists the data types affected by the -numbertypes option and shows their Java type mappings for -numbertypes=jdbc and -numbertypes=objectjdbc, which is the default.

Table 6-4 Mappings for Types Affected by the -numbertypes Option

SQL Data TypeJDBC Mapping TypeObject JDBC Mapping Type

BINARY_INTEGER, INT, INTEGER, NATURAL, NATURALN, PLS_INTEGER, POSITIVE, POSITIVEN, SIGNTYPE

int

java.lang.Integer

SMALLINT

int

java.lang.Integer

REAL

float

java.lang.Float

DOUBLE PRECISION, FLOAT

double

java.lang.Double

DEC, DECIMAL, NUMBER, NUMERIC

java.math.BigDecimal

java.math.BigDecimal


Mappings for User-Defined Types

The -usertypes option controls whether JPublisher implements the Oracle ORAData interface or the standard SQLData interface in generated classes for user-defined types. The syntax of the -usertypes option is as follows:

-usertypes={oracle|jdbc}

When -usertypes=oracle, which is the default, JPublisher generates ORAData classes for object, collection, and object reference types.

When -usertypes=jdbc, JPublisher generates SQLData classes for object types. JPublisher does not generate classes for collection or object reference types in this case. You must use java.sql.Array for all collection types and java.sql.Ref for all object reference types.


Note:

  • The -usertypes=jdbc setting requires JDK 1.2 or later, because the SQLData interface is a JDBC 2.0 feature.

  • With certain settings of the -compatible option, a -usertypes=oracle setting results in classes that implement the deprecated CustomDatum interface instead of ORAData.


Mappings for All Types

The -mapping option specifies mapping for all data types, so offers little flexibility between types. The syntax of the -mapping option is as follows:

-mapping={jdbc|objectjdbc|bigdecimal|oracle}

Note:

This option is deprecated in favor of the more specific type mapping options: -usertypes, -numbertypes, -builtintypes, and -lobtypes. However, it is still supported for backward compatibility.

The -mapping=oracle setting is equivalent to setting all the type mapping options to oracle. The other -mapping settings are equivalent to setting -numbertypes equal to the value of -mapping and setting the other type mapping options to their defaults. This is summarized in Table 6-5.

Table 6-5 Relation of -mapping Settings to Other Mapping Option Settings

-mapping Setting-builtintypes=-numbertypes=-lobtypes=-usertypes=

-mapping=oracle

oracle

oracle

oracle

oracle

-mapping=jdbc

jdbc

jdbc

oracle

oracle

-mapping=objectjdbc (default)

jdbc

objectjdbc

oracle

oracle

-mapping=bigdecimal

jdbc

bigdecimal

oracle

oracle



Note:

Options are processed in the order in which they appear on the command line. Therefore, if the -mapping option precedes one of the specific type mapping options, -builtintypes, -lobtypes, -numbertypes, or -usertypes, then the specific type mapping option overrides the -mapping option for the relevant types. If the -mapping option follows one of the specific type mapping options, then the specific type mapping option is ignored.

Style File for Java-to-Java Type Mappings

JPublisher style files allow you to specify Java-to-Java type mappings. One use for this is to ensure that generated classes can be used in Web services. You use the -style option to specify the name of a style file. You can use the -style option multiple times. The settings accumulate in order. The syntax of the -style option is as follows:

-style=stylename

Typically, Oracle supplies the style files, but there may be situations in which you would edit or create your own. To use the Oracle style file for Web services in Oracle Database 11g, for example, use the following setting:

-style=webservices10

Type Map Options

JPublisher code generation is influenced by entries in the JPublisher user type map or default type map, primarily to make signatures with PL/SQL types accessible to JDBC. A type map entry has one of the following formats:

-type_map_option=opaque_sql_type:java_type
-type_map_option=numeric_indexed_by_table:java_numeric_type[max_length] 
-type_map_option=char_indexed_by_table:java_char_type[max_length](elem_size) 
-type_map_option=plsql_type:java_type:sql_type:sql_to_plsql_func:plsql_to_sql_func

In the type map syntax, sql_to_plsql_func and plsql_to_sql_func are for functions that convert between SQL and PL/SQL. Note that [...] and (...) are part of the syntax. Also note that some operating systems require you to quote command-line options that contain special characters.

The related options, which are discussed in alphabetic order in the following sections, are -addtypemap, -adddefaulttypemap, -defaulttypemap, and -typemap. The difference between -addtypemap and -typemap is that -addtypemap appends entries to the user type map, while -typemap replaces the existing user type map with the specified entries. Similarly, -adddefaulttypemap appends entries to the default type map, while -defaulttypemap replaces the existing default type map with the specified entries.

Here are some sample type map settings, from a properties file that uses the -defaulttypemap and -adddefaulttypemap options:

jpub.defaulttypemap=SYS.XMLTYPE:oracle.xdb.XMLType
jpub.adddefaulttypemap=BOOLEAN:boolean:INTEGER:
SYS.SQLJUTL.INT2BOOL:SYS.SQLJUTL.BOOL2INT
jpub.adddefaulttypemap=INTERVAL DAY TO SECOND:String:CHAR:
SYS.SQLJUTL.CHAR2IDS:SYS.SQLJUTL.IDS2CHAR
jpub.adddefaulttypemap=INTERVAL YEAR TO MONTH:String:CHAR:
SYS.SQLJUTL.CHAR2IYM:SYS.SQLJUTL.IYM2CHAR

Be aware that you must avoid conflicts between the default type map and user type map.

Adding an Entry to the Default Type Map

Use the -adddefaulttypemap option to append an entry or a comma-delimited list of entries to the JPublisher default type map. In addition, JPublisher uses this option internally. The syntax of this option is:

-adddefaulttypemap=list_of_typemap_entries

Additional Entry to the User Type Map

Use the -addtypemap option to append an entry or a comma-delimited list of entries to the JPublisher user type map. The syntax of this option is:

-addtypemap=list_of_typemap_entries

Default Type Map for JPublisher

JPublisher uses the -defaulttypemap option internally to set up predefined type map entries in the default type map. The syntax of this option is:

-defaulttypemap=list_of_typemap_entries

The difference between the -adddefaulttypemap option and the -defaulttypemap option is that -adddefaulttypemap appends entries to the default type map, while -defaulttypemap replaces the existing default type map with the specified entries. To clear the default type map, use the following setting:

-defaulttypemap=

You may want to do this to avoid conflicts between the default type map and the user type map, for example.


See Also:

"JPublisher User Type Map and Default Type Map" for additional information, including a caution about conflicts between the type maps.

Replacement of the JPublisher Type Map

Use the -typemap option to specify an entry or a comma-delimited list of entries to set up the user type map. The syntax of this option is:

-typemap=list_of_typemap_entries

The difference between the -typemap option and the -addtypemap option is that -typemap replaces the existing user type map with the specified entries and -addtypemap appends entries to the user type map. To clear the user type map, use the following setting.

-typemap=

You may want to do this to avoid conflicts between the default type map and the user type map, for example.

Java Code-Generation Options

This section documents options that specify JPublisher characteristics and behavior for Java code generation. For example, there are options to accomplish the following:

  • Filter generated code according to parameter modes or parameter types

  • Ensure that generated code conforms to the JavaBeans specification

  • Specify naming patterns

  • Specify how stubs are generated for user subclasses

  • Specify whether generated code is serializable

The following options are described in alphabetical order: -access, -case, -codegen, -filtermodes, -filtertypes, -generatebean, -genpattern, -gensubclass, -methods, -omit_schema_names, -outarguments, -package, -serializable, and -tostring.

Method Access

The -access option determines the access modifier that JPublisher includes in generated constructors, attribute setter and getter methods, member methods on object wrapper classes, and methods on PL/SQL packages. The syntax of this option is:

-access={public|protected|package}

JPublisher uses the possible option settings as follows:

  • public

    Methods are generated with the public access modifier. This is the default option setting.

  • protected

    Methods are generated with the protected access modifier.

  • package

    The access modifier is omitted, so generated methods are local to the package.

You may want to use a setting of -access=protected or -access=package if you want to control the usage of the generated JPublisher wrapper classes. For example, when you provide customized versions of the wrapper classes as subclasses of the JPublisher-generated classes, but do not want to provide access to the generated superclasses.

You can specify the -access option on the command line or in a properties file.


Note:

Wrapper classes for object references and VARRAY and nested table types are not affected by the value of the -access option.

Case of Java Identifiers

For class or attribute names that you do not specify in an INPUT file or on the command line, the -case option affects the case of Java identifiers that JPublisher generates, including class names, method names, attribute names embedded within getXXX() and setXXX() method names, and arguments of generated method names. The syntax of this option is:

-case={mixed|same|lower|upper}

Table 6-6 describes the possible values for the -case option.

Table 6-6 Values for the -case Option

-case Option ValueDescription

mixed (default)

The first letter of every word unit of a class name or of every word unit after the first word unit of a method name is in uppercase. All other characters are in lowercase. An underscore (_), a dollar sign ($), or any character illegal in Java constitutes a word unit boundary and is removed without warning. A word unit boundary also occurs after get or set in a method name.

same

JPublisher does not change the case of letters from the way they are represented in the database. Underscores and dollar signs are retained. JPublisher removes any other character illegal in Java and issues a warning message.

upper

JPublisher converts lowercase letters to uppercase and retains underscores and dollar signs. It removes any other character illegal in Java and issues a warning message.

lower

JPublisher converts uppercase letters to lowercase and retains underscores and dollar signs. It removes any other character illegal in Java and issues a warning message.


For class or attribute names that you specify through JPublisher options or the INPUT file, JPublisher retains the case of the letters in the specified name and overrides the -case option.

Code Generation Type

The -codegen option determines whether the generated Java code uses SQLJ runtime or JDBC runtime. The syntax of this option is:

-codegen=jdbc|sqlj

The default value is sqlj.

The setting -codegen=jdbc indicates that JPublisher generates Java code using JDBC runtime. Generation of Java code purely relying on JDBC runtime is a new feature of JPublisher 11g release. The setting -codegen=sqlj indicates that JPublisher generates Java code using SQLJ runtime. This is the default behavior of JPublisher 11g release. All the earlier JPublisher releases use only SQLJ runtime to generate Java code.

Method Filtering According to Parameter Modes

In some cases, particularly for generating code for Web services, not all parameter modes are supported in method signatures or attributes for the target usage of your code. The -filtermodes option enables you to filter generated code according to parameter modes. The syntax of this option is:

-filtermodes=list_of_modes_to_filter_out_or_filter_in

You can specify the following for the -filtermodes option:

  • in

  • out

  • inout

  • return

Start the option setting with a 1 to include all possibilities by default, which would mean no filtering. Then list specific modes or types each followed by a minus sign (-), indicating that the mode or type should be excluded. Alternatively, start with a 0 to include no possibilities by default, which would mean total filtering, then list specific modes or types each followed by a plus sign (+), indicating that the mode or type should be allowed.

The following examples would have the same result, allowing only methods that have parameters of the in or return mode. Separate the entries by commas.

-filtermodes=0,in+,return+

-filtermodes=1,out-,inout-

Method Filtering According to Parameter Types

In some cases, particularly for generating code for Web services, not all parameter types are supported in method signatures or attributes for the target usage of your code. The -filtertypes option enables you to filter generated code according to parameter types. The syntax of this option is:

-filtertypes=list_of_types_to_filter_out_or_filter_in

You can specify the following settings for the -filtertypes option:

  • Any qualified Java type name

    Specify package and class, such as java.sql.SQLData, oracle.sql.ORAData.

  • .ORADATA

    This setting indicates any ORAData or SQLData implementations.

  • .STRUCT, .ARRAY, .OPAQUE, .REF

    Each of these settings indicates any types that implement ORAData or SQLData with the corresponding _SQL_TYPECODE specification.

  • .CURSOR

    This setting indicates any SQLJ iterator types and java.sql.ResultSet.

  • .INDEXBY

    This setting indicates any indexed-by table types.

  • .ORACLESQL

    This setting indicates all oracle.sql.XXX types.

Start the option setting with a 1 to include all possibilities by default, indicating no filtering, then list specific modes or types each followed by a minus sign (-), indicating that the mode or type should be excluded. Alternatively, start with a 0 to include no possibilities by default, indicating total filtering, then list specific modes or types each followed by a plus sign (+), indicating that the mode or type should be allowed.

This first example filters out only .ORADATA and .ORACLESQL. The second example filters everything except .CURSOR and .INDEXBY:

-filtertypes=1,.ORADATA-,.ORACLESQL-

-filtertypes=0,.CURSOR+,.INDEXBY+

The .STRUCT, .ARRAY, .OPAQUE, and .REF settings are subcategories of the .ORADATA setting. Therefore, you can have specifications, such as the following, which filters out all ORAData and SQLData types except those with a typecode of STRUCT:

-filtertypes=1,.ORADATA-,.STRUCT+

Alternatively, to allow ORAData or SQLData types in general, with the exception of those with a typecode of ARRAY or REF:

-filtertypes=0,.ORADATA+,.ARRAY-,.REF-

Code Generation Adherence to the JavaBeans Specification

The -generatebean option is a flag that you can use to ensure that generated classes follow the JavaBeans specification. The syntax of this option is:

-generatebean={true|false}

The default setting is -generatebean=false. With the -generatebean=true setting, some generated methods are renamed so that they are not assumed to be JavaBean property getter or setter methods. This is accomplished by prefixing the method names with an underscore (_). For example, for classes generated from SQL table types, VARRAY, or indexed-by table, method names are changed as follows.

Method names are changed from:

public int getBaseType() throws SQLException;
public int getBaseTypeName() throws SQLException;
public int getDescriptor() throws SQLException;

to:

public int _getBaseType() throws SQLException;
public String _getBaseTypeName() throws SQLException; 
public ArrayDecscriptor _getDescriptor() throws SQLException; 

The changes in return types are necessary because the JavaBeans specification says that a getter method must return a bean property, but getBaseType(), getBaseTypeName(), and getDescriptor() do not return a bean property.

Class and Interface Naming Pattern

It is often desirable to follow a certain naming pattern for Java classes, user subclasses, and interfaces generated for user-defined SQL types or packages. The -genpattern option, which you can use in conjunction with the -sql or -sqlstatement option, enables you to define such patterns conveniently and generically. The syntax of this option is:

-genpattern=pattern_specifications

Consider the following explicit command-line options:

-sql=PERSON:PersonBase:PersonUser#Person
-sql=STUDENT:StudentBase:StudentUser#Student
-sql=GRAD_STUDENT:GradStudentBase:GradStudentUser#GradStudent

The following pair of options is equivalent to the preceding set of options:

-genpattern=%1Base:%1User#%1
-sql=PERSON,STUDENT,GRAD_STUDENT

By definition, %1 refers to the default base names that JPublisher would create for each SQL type. By default, JPublisher would create the Person Java type for the PERSON SQL type, the Student Java type for the STUDENT SQL type, and the GradStudent Java type for the GRAD_STUDENT SQL type. So %1Base becomes PersonBase, StudentBase, and GradStudentBase, respectively. Similar results are produced for %1User.

If the -sql option specifies the output names, then %2, by definition, refers to the specified names. For example, the following pair of options has the same effect as the earlier pair:

-genpattern=%2Base:%2User#%2
-sql=PERSON:Person,STUDENT:Student,GRAD_STUDENT:GradStudent

Note:

This is the pattern expected for Web services. Specify an output name and use that as the interface name, and append Base for the generated class and User for the user subclass.

The following example combines the -genpattern option with the -sqlstatement option:

-sqlstatement.class=SqlStmts -genpattern=%2Base:%2User:%2

These settings are equivalent to the following:

-sqlstatement.class=SqlStmtsBase:SqlStmtsUser#SqlStmts

Generation of User Subclasses

The value of the -gensubclass option determines whether JPublisher generates initial source files for user-provided subclasses and, if so, what format these subclasses should have. The syntax of this option is:

-gensubclass={true|false|force|call-super}

For -gensubclass=true, which is the default, JPublisher generates code for the subclass only if it finds that no source file is present for the user subclass. The -gensubclass=false setting results in JPublisher not generating any code for user subclasses.

For -gensubclass=force, JPublisher always generates code for user subclasses. It overwrites any existing content in the corresponding .java and .class files if they already exist. Use this setting with caution.

The setting -gensubclass=call-super is equivalent to -gensubclass=true, except that JPublisher generates slightly different code. By default, JPublisher generates only constructors and methods necessary for implementing an interface, for example, the ORAData interface. JPublisher indicates how superclass methods or attribute setter and getter methods can be called, but places this code inside comments. With the call-super setting, all getters, setters, and other methods are generated.

The idea is that you can specify this setting if you use Java development tools based on class introspection. Only methods relating to SQL object attributes and SQL object methods are of interest, and JPublisher implementation details remain hidden. In this case you can point the tool at the generated user subclass.

You can specify the -gensubclass option on the command line or in a properties file.

Generation of Package Classes and Wrapper Methods

The -methods option determines whether:

  • JPublisher generates wrapper methods for methods, or stored procedures in SQL object types and PL/SQL packages.

  • Overloaded method names are allowed.

  • Methods will attempt to reestablish a JDBC connection if an SQLException is caught.

The syntax for the -methods option is:

-methods={all|none|named|always,overload|unique,noretry|retry}

For -methods=all, which is the default setting among the first group of settings, JPublisher generates wrapper methods for all the methods in the SQL object types and PL/SQL packages it processes. This results in generation of a SQLJ class if the underlying SQL object or package actually defines methods and if not, a non-SQLJ class. Prior to Oracle Database 10g, SQLJ classes were always generated for the all setting.

For -methods=none, JPublisher does not generate wrapper methods. In this case, JPublisher does not generate classes for PL/SQL packages, because they would not be useful without wrapper methods.

For -methods=named, JPublisher generates wrapper methods only for the methods explicitly named in the INPUT file.

The -methods=always setting also results in wrapper methods being generated. However, for backward compatibility with Oracle8i and Oracle9i JPublisher versions, this setting always results in SQLJ classes being generated for all SQL object types, regardless of whether the types define methods.


Note:

For backward compatibility, JPublisher also supports the setting true as equivalent to all, the setting false as equivalent to none, and the setting some as equivalent to named.

Among the overload and unique settings, -methods=overload is the default and specifies that method names in the generated code can be overloaded, such as the following:

int foo(int);
int foo(String);

Alternatively, the -methods=unique setting specifies that all method names must be unique. This is required for Web services. Consider the following functions:

function foo (a VARCHAR2(40)) return VARCHAR2;
function foo ( x int, y int) return int;

With the default -methods=overload setting, these functions are published as follows:

String foo(String a);
java.math.BigDecimal foo(java.math.BigDecimal x, java.math.BigDecimal y);

With the -methods=unique setting, these functions are published using a method-renaming mechanism based on the first letter of the return type and argument types, as shown in the following example:

String foo(String a);
java.math.BigDecimal fooBBB(java.math.BigDecimal x, java.math.BigDecimal y);

With the -methods=retry setting, JPublisher generates constructors with DataSource arguments and extra code for each method published. A JDBC operation in a method is enclosed within a try...catch block. If an SQLException is raised when the method is processed, then the extra code will attempt to reestablish the JDBC connection and process the SQL operation again. If the attempt to reconnect fails, then the original SQLException is thrown again.

For -methods=retry, JPublisher generates code different from that generated for -methods=noretry, in two respects:

  • An additional constructor, which takes a DataSource object as parameter, is generated. The DataSource object is used to get a new connection at operation invocation time.

  • A new JDBC connection is requested if an SQLException is thrown.

The -methods=retry setting takes effect only for PL/SQL stored procedures, SQL statements, AQ, and Web services call-ins for Java classes.


Note:

The use of oracle.jdbc.pool.OracleDataSource requires JDK 1.3 or later.

To specify a setting of all, none, named, or always at the same time as you specify a setting of overload or unique and a setting for retry or noretry, use a comma to separate the settings. This is shown in the following example:

-methods=always,unique,retry

You can specify the -methods option on the command line or in a properties file.

Omission of Schema Name from Name References

In publishing user-defined SQL types, such as objects and collections, when JPublisher references the type names in Java wrapper classes, it generally qualifies the type names with the database schema name, such as SCOTT.EMPLOYEE for the EMPLOYEE type in the SCOTT schema.

However, by specifying the -omit_schema_names option, you instruct JPublisher not to qualify SQL type names with schema names. The syntax of this option is:

-omit_schema_names

When this option is specified, names are qualified with a schema name only under the following circumstances:

  • You declare the user-defined SQL type in a schema other than the one to which JPublisher is connected. A type from another schema always requires a schema name to identify it.

  • You declare the user-defined SQL type with a schema name on the command line or in an INPUT file. The use of a schema name with the type name on the command line or INPUT file overrides the -omit_schema_names option.

Omitting the schema name makes it possible for you to use classes generated by JPublisher when you connect to a schema other than the one used when JPublisher is invoked, as long as the SQL types that you use are declared identically in the two schemas.

ORAData and SQLData classes generated by JPublisher include a static final String field that names the user-defined SQL type matching the generated class. When the code generated by JPublisher is processed, the SQL type name in the generated code is used to locate the SQL type in the database. If the SQL type name does not include the schema name, then the type is looked up in the schema associated with the current connection when the code generated by JPublisher is processed. If the SQL type name includes the schema name, then the type is looked up in that schema.

When the -omit_schema_names option is enabled, JPublisher generates the following code in the Java wrapper class for a SQL object type and similar code to wrap a collection type:

 public Datum toDatum(Connection c) throws SQLException
    {
      if (__schemaName != null)
      {
        return _struct.toDatum(c, __schemaName + "." + _SQL_NAME);
      }
      return _struct.toDatum(c, typeName);
    }
    private String __schemaName = null;
    public void __setSchemaName(String schemaName) { __schemaName = schemaName; }
  }
  

The __setSchemaName() method enables you to explicitly set the schema name at run time so that SQL type names can be qualified by schema even if JPublisher was run with the -omit_schema_names option enabled. Being qualified by schema is necessary if a SQL type needs to be accessed from another schema.


Note:

Although this option acts as a boolean option, you cannot specify -omit_schema_names=true or -omit_schema_names=false. Specify -omit_schema_names to enable it, and do nothing to leave it disabled.

Holder Types for Output Arguments

There are no OUT or IN OUT designations in Java, but values can be returned through holders. In JPublisher, you can specify one of three alternatives for holders:

  • Arrays, which is the default

  • JAX-RPC holder types

  • Function returns

The -outarguments option enables you to specify the mechanism to use, through a setting of array, holder, or return, respectively. This feature is particularly useful for Web services. The syntax of this option is:

-outarguments={array|holder|return}

Name for Generated Java Package

The -package option specifies the name of the Java package that JPublisher generates. The name appears in a package declaration in each generated class. The syntax for this option is:

-package=package_name

If you use the -dir and -d options, the directory structure in which JPublisher places the generated files reflects the package name as well as the -dir and -d settings.


Note:

  • If there are conflicting package settings between a -package option setting and a package setting in the INPUT file, the precedence depends on the order in which the -input and -package options appear on the command line. The -package setting takes precedence if that option is after the -input option. Otherwise, the INPUT file setting takes precedence.

  • If you do not use the -dir and -d options, or if you explicitly give them empty settings, then JPublisher places all generated files directly in the current directory, with no package hierarchy, regardless of the -package setting.


Example 1  Consider the following command:

% jpub -dir=/a/b -d=/a/b -package=c.d -sql=PERSON:Person ...

JPublisher generates the files /a/b/c/d/Person.java and /a/b/c/d/Person.class.

In addition, the Person class includes the following package declaration:

package c.d;

Example 2 Now consider the following command:

% jpub -dir=/a/b -d=/a/b -package=c.d -sql=PERSON:Person -input=myinputfile

Assume that myinputfile includes the following:

SQL PERSON AS e.f.Person

In this case, the package information in the INPUT file overrides the -package option on the command line. JPublisher generates the files /a/b/e/f/Person.java and /a/b/e/f/Person.class, with the Person class including the following package declaration:

package e.f;

If you do not specify a package name, then JPublisher does not generate any package declaration. The output .java files are placed directly into the directory specified by the -dir option or into the current directory by default. The output .class files are placed directly into the directory specified by the -d option or into the current directory.

Sometimes JPublisher translates a type that you do not explicitly request, because the type is required by another type that is translated. For example, it may be an attribute of the requested type. In this case, the .java and .class files declaring the required type are also placed into the package specified on the command line, in a properties file or the INPUT file.

By contrast, JPublisher never translates packages or stored procedures that you do not explicitly request, because packages or stored procedures are never strictly required by SQL types or by other packages or stored procedures.

Serializability of Generated Object Wrapper Classes

The -serializable option specifies whether the Java classes that JPublisher generates for SQL object types implement the java.io.Serializable interface. The default setting is -serializable=false. The syntax for this option is:

-serializable={true|false}

Please note the following if you choose to set -serializable=true:

  • Not all object attributes are serializable. In particular, none of Oracle LOB types, such as oracle.sql.BLOB, oracle.sql.CLOB, or oracle.sql.BFILE, can be serialized. Whenever you serialize objects with such attributes, the corresponding attribute values are initialized to null after deserialization.

  • If you use object attributes of type java.sql.Blob or java.sql.Clob, then the code generated by JPublisher requires that the Oracle JDBC rowset implementation be available in the classpath. This is provided in the ocrs12.jar library at ORACLE_HOME/jdbc/lib. In this case, the underlying value of Clob and Blob objects is materialized, serialized, and subsequently retrieved.

  • Whenever you deserialize objects containing attributes that are object references, the underlying connection is lost, and you cannot issue setValue() or getValue() calls on the reference. For this reason, JPublisher generates the following method into your Java classes whenever you specify -serializable=true:

    void restoreConnection(Connection)
    

    After deserialization, call this method once for a given object or object reference to restore the current connection into the reference or, respectively, into all transitively embedded references.

Generation of toString() Method on Object Wrapper Classes

You can use the -tostring flag to tell JPublisher to generate an additional toString() method for printing out an object value. The output resembles SQL code you would use to construct the object. The default setting is false. The syntax for this option is:

-tostring={true|false}

Rename main Method

You can use -nomain=true to avoid generating Java methods with the signature main(String[]). This option applies to SQL publishing and server-side Java class publishing. The syntax for this option is:

-nomain[=true|false]

The -dbjava option automatically sets -nomain=true because of Java stored procedure limitation. In case a method with the signature main(String[]) is to be generated with the -nomain=true setting, then JPublisher will rename the method, for example, into main0(Stringp[]).

The default setting is:

-nomain=false

PL/SQL Code Generation Options

This section documents the following options that specify JPublisher behavior in generating PL/SQL code:

  • -overwritedbtypes

    Specifies whether naming conflicts are checked before creating SQL types.

  • -plsqlfile

    Specifies scripts to use in creating and dropping SQL types and PL/SQL packages.

  • -plsqlmap

    Specifies whether PL/SQL wrapper functions are generated

  • -plsqlpackage

    Specifies the name of the PL/SQL package in which JPublisher generates PL/SQL call specs, conversion functions, wrapper functions, and table functions.

These options are mostly used to support Java calls to stored procedures that use PL/SQL types. The options specify the creation and use of corresponding SQL types and the creation and use of PL/SQL conversion functions and PL/SQL wrapper functions that use the corresponding SQL types for input or output. This enables access through JDBC.



Generation of SQL types

JPublisher may generate new SQL types when publishing PL/SQL types and generating PL/SQL wrappers for server-side Java classes. The -overwritedbtypes option determines how JPublisher names the generated SQL types. The syntax for this option is:

-overwritedbtypes={true|false}

Prior to Oracle Database 10g release 2 (10.2), JPublisher checked the database for naming conflicts and chose a name, which was not already in use, for the generated SQL type. Since Oracle Database 10g release 2 (10.2), JPublisher generates SQL type names by default, regardless of the existing type names in the database. The -overwritedbtypes=true setting, which is the default, overwrites the existing types if the type name is the same as that of the generated SQL type. This enables JPublisher to generate exactly the same PL/SQL wrappers over different runs.

To ensure that JPublisher does not overwrite any type inside the database while executing the generated PL/SQL wrapper, you must explicitly specify -overwritedbtypes=false.

A frequently reported problem in releases prior to Oracle Database 10g release 2 (10.2) is that after the generated PL/SQL wrapper is processed, rerunning the JPublisher command generates a different set of SQL types. A workaround for this problem is to run the PL/SQL dropper script before the JPublisher command is rerun.

File Names for PL/SQL Scripts

The -plsqlfile option specifies the name of a wrapper script and a dropper script generated by JPublisher. The syntax for this option is:

-plsqlfile=plsql_wrapper_script,plsql_dropper_script

The wrapper script contains instructions to create SQL types to map to PL/SQL types and instructions to create the PL/SQL package that JPublisher uses for any PL/SQL wrappers or call specs, conversion functions, wrapper functions, and table functions. The dropper script contains instructions to drop these entities.

You must load the generated files into the database, using SQL*Plus, for example, and run the wrapper script to install the types and package in the database.

If the files already exist, then they are overwritten. If no file names are specified, then JPublisher writes to files named plsql_wrapper.sql and plsql_dropper.sql.

JPublisher writes a note about the generated scripts, such as the following:

J2T-138, NOTE: Wrote PL/SQL package JPUB_PLSQL_WRAPPER to
file plsql_wrapper.sql. Wrote the dropping script to file plsql_dropper.sql.

Generation of PL/SQL Wrapper Functions

The -plsqlmap option specifies whether JPublisher generates wrapper functions for stored procedures that use PL/SQL types. Each wrapper function calls the corresponding stored procedure and invokes the appropriate PL/SQL conversion functions for PL/SQL input or output of the stored procedure. Only the corresponding SQL types are exposed to Java. The syntax for this option is:

-plsqlmap={true|false|always}

The setting can be any of the following:

  • true

    This is the default. JPublisher generates PL/SQL wrapper functions only as needed. For any given stored procedure, if the Java code to call it and convert its PL/SQL types directly is simple enough and the PL/SQL types are used only as IN parameters or for the function return, then the generated code calls the stored procedure directly. It processes the PL/SQL input or output through the appropriate conversion functions.

  • false

    JPublisher does not generate PL/SQL wrapper functions. If it encounters a PL/SQL type in a signature that cannot be supported by direct call and conversion, then it skips generation of Java code for the particular stored procedure.

  • always

    JPublisher generates a PL/SQL wrapper function for every stored procedure that uses a PL/SQL type. This is useful for generating a proxy PL/SQL package that complements an original PL/SQL package, providing Java-accessible signatures for those functions or procedures that are inaccessible from Java in the original package.

Package for Generated PL/SQL Code

The -plsqlpackage option specifies the name of the PL/SQL package into which JPublisher places any generated PL/SQL code. This includes PL/SQL wrappers or call specifications, conversion functions to convert between PL/SQL and SQL types, wrapper functions to wrap stored procedures that use PL/SQL types, and table functions. The syntax for this option is:

-plsqlpackage=name_of_PLSQL_package

By default, JPublisher uses the package JPUB_PLSQL_WRAPPER.


Note:

You must create this package in the database by running the SQL script generated by JPublisher.

Package for PL/SQL Index-By Tables

Use -plsqlindextable=array or -plsqlindextable=int to specify that PL/SQL index-by table of numeric and character types be mapped to Java array. The syntax for this option is:

-plsqlindextable=array|custom|int

The int specification defines the capacity of the Java array. The default capacity is 32768. The -plsqlindextable=custom setting specifies that PL/SQL index-by table be mapped to custom JDBC types, such as a class implementing ORAData.

The default setting is:

-plsqlindextable=custom

Input/Output Options

This section documents options related to JPublisher input and output files and locations. These are listed in the order in which they are discussed:

  • -compile

    Use this option if you want to suppress compilation, and optionally, SQLJ translation, if JPublisher is in a backward-compatibility mode.

  • -dir

    Use this option to specify where the generated source files are placed.

  • -d

    Use this option to specify where the compiled class files are placed.

  • -encoding

    Use this option to specify the Java character encoding of the INPUT file that JPublisher reads and the .sqlj and .java files that JPublisher writes.

No Compilation or Translation

Use the -compile option to suppress the compilation of the generated .java files and, for backward-compatibility modes, to optionally suppress the translation of generated .sqlj files. The syntax for this option is:

-compile={true|false|notranslate}

With the default true setting, all generated classes are compiled into .class files. If you are in a backward-compatibility mode, then you can use the -compile=notranslate setting to suppress SQLJ translation and Java compilation of generated source files. This leaves you with .sqlj output from JPublisher, which you can translate and compile manually by using either the JPublisher -sqlj option or the SQLJ command-line utility directly. You can also use the -compile=false setting to proceed with SQLJ translation, but skip Java compilation. This leaves you with .java output from JPublisher, which you can compile manually.

If you are not in a backward-compatibility mode, such as if you use the default -compatible=oradata setting, then you can use a setting of -compile=false to skip compilation. In this scenario, the notranslate setting is not supported, because visible .sqlj files are not produced if you are not in a backward-compatibility mode.

Output Directories for Generated Source and Class Files

Use the -dir option to specify the root of the directory tree within which JPublisher places the .java source files or the .sqlj source files for backward-compatibility modes. The syntax for this option is:

-dir=directory_path
-d=directory_path

A setting of a period (.) explicitly specifies the current directory as the root of the directory tree. Similarly, use the -d option to specify the root of the directory tree within which JPublisher places compiled .class files, with the same functionality for a period (.) setting.

For each option with any nonempty setting, JPublisher also uses package information from the -package option or any package name included in an SQL option setting in the INPUT file. This information is used to determine the complete directory hierarchy for generated files.

For example, consider the following JPublisher command:

% jpub -user=scott -d=myclasses -dir=mysource -package=a.b.c  -sql=PERSON:Person,STUDENT:Student
Enter scott password: password

This results in the following output, relative to the current directory:

mysource/a/b/c/Person.java
mysource/a/b/c/PersonRef.java
mysource/a/b/c/Student.java
mysource/a/b/c/StudentRef.java

myclasses/a/b/c/Person.class
myclasses/a/b/c/PersonRef.class
myclasses/a/b/c/Student.class
myclasses/a/b/c/StudentRef.class

By default, source and class files are placed directly into the current directory, with no package hierarchy, regardless of the -package setting or any package specification in the INPUT file.

You can also explicitly specify this behavior with empty settings:

%jpub ... -d= -dir=

You can set these options on the command line or in a properties file.


Note:

SQLJ has -dir and -d options as well, with the same functionality. However, when you use the JPublisher -sqlj option to specify SQLJ settings, use the JPublisher -dir and -d options, which take precedence over any SQLJ -dir and -d settings.

Java Character Encoding

The -encoding option specifies the Java character encoding of the INPUT file that JPublisher reads and the source files that JPublisher writes. The default encoding is the value of the file.encoding system property or 8859_1 (ISO Latin-1), if this property is not set. The syntax for this option is:

-encoding=name_of_character_encoding

As a general rule, you do not have to set this option unless you specify an encoding for the SQLJ translator and Java compiler, which you can do with a SQLJ -encoding setting through the JPublisher -sqlj option. In this scenario, you should specify the same encoding for JPublisher as for SQLJ and the compiler.

You can use the -encoding option to specify any character encoding supported by your Java environment. If you are using the Sun Microsystems JDK, these options are listed in the native2ascii documentation, which you can find at the following URL:

http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/native2ascii.html


Note:

Encoding settings, either set through the JPublisher -encoding option or the Java file.encoding setting, do not apply to Java properties files, including those specified through the JPublisher -props option. Properties files always use the 8859_1 encoding. This is a feature of Java in general and not JPublisher in particular. However, you can use Unicode escape sequences in a properties file.

Options to Facilitate Web Services Call-Outs

This section documents options and related concepts for accessing Java classes from server-side Java or PL/SQL. In particular, these options may be used to access Web services client code from inside the database, referred to as Web services call-outs. This section comprises the following topics:

The following list is a summary of the options relevant to Web services call-outs and how they relate to each other:

  • -proxyclasses=class1,class2,...,classN

    This option specifies Java classes for which Java and PL/SQL wrappers will be generated. For Web services, this option is used behind the scenes by the -proxywsdl option and is set automatically to process generated client proxy classes.

    Alternatively, you can use this option directly, for general purposes, when you want to create Java and PL/SQL wrappers for Java classes.

    The -proxyclasses option takes the -proxyopts setting as input.

  • -proxyopts=setting1,setting2,...

    This option specifies JPublisher behavior in generating wrapper classes and PL/SQL wrappers. This is usually, but not necessarily, for Web services. For typical usage of the -proxywsdl option, the -proxyopts default setting is sufficient. If you directly use the -proxyclasses option, then you may want specific -proxyopts settings.

  • -proxywsdl=WSDL_URL

    Use this option to generate Web services client proxy classes and appropriate Java and PL/SQL wrappers, given the WSDL document at the specified URL.

    The -proxywsdl option uses the -proxyclasses option behind the scenes and takes the -proxyopts setting as input.

  • -endpoint=Web_services_endpoint

    Use this option in conjunction with the -proxywsdl option to specify the Web services endpoint.

  • -httpproxy=proxy_URL

    Where the WSDL document is accessed through a firewall, use this option to specify a proxy URL to use in resolving the URL of the WSDL document.

  • -sysuser=superuser_name/superuser_password

    Use this option to specify the name and password for the superuser account used to grant permissions for the client proxy classes to access Web services using HTTP.


Note:

  • The features described here require the dbwsclient.jar library to be installed in Oracle Database 11g.

  • Several previously existing JPublisher options are used in conjunction with wrapper generation as discussed here: -dir, -d, -plsqlmap, -plsqlfile, -plsqlpackage, and -package. You can also specify a database connection through the -user and -url options so that JPublisher can load generated entities into the database.


WSDL Document for Java and PL/SQL Wrapper Generation

The syntax for the -proxywsdl option is:

-proxywsdl=WSDL_URL

This option is used as follows:

% jpub -proxywsdl=META-INF/HelloService.wsdl ...

Given the Web services WSDL document at the specified URL, JPublisher directs the generation of Web services client proxy classes and generates appropriate Java and PL/SQL wrappers for Web services call-outs from the database. Classes to generate and process are determined from the WSDL document. JPublisher automatically sets the -proxyclasses option, uses the -proxyopts setting as input, and executes the following steps:

  1. Invokes Oracle Database Web services assembler tool to produce Web services client proxy classes based on the WSDL document. These classes use Oracle Database Web services client run time to access the Web services specified in the WSDL document.

  2. Creates Java wrapper classes for the Web services client proxy classes as appropriate or necessary. For each proxy class that has instance methods, a wrapper class is necessary to expose the instance methods as static methods. Even if there are no instance methods, a wrapper class is necessary if methods of the proxy class use anything other than Java primitive types in their calling sequences.

  3. Creates PL/SQL wrappers for the generated classes, to make them accessible from PL/SQL. PL/SQL supports only static methods, so this step requires the wrapping of instance methods by static methods, This is performed in the previous step.

  4. Loads generated code into the database assuming you have specified -user and -url settings and JPublisher has established a connection, unless you specifically bypass loading through the -proxyopts=noload setting.


Note:

When using -proxywsdl:
  • You must use the -package option to determine the package for generated Java classes.

  • For -proxyopts, the default jaxrpc setting is sufficient for use with 10.0.x releases of Oracle Application Server 10g. This setting uses the singleton mechanism for publishing instance methods of the Web services client proxy classes. For use with the 9.0.4 release of Oracle Application Server 10g or with earlier releases, set -proxyopts=soap.


The -endpoint option is typically used in conjunction with the -proxywsdl option.

Web Services Endpoint

You can use the -endpoint option in conjunction with the -proxywsdl option to specify the Web services endpoint. The endpoint is the URL to which the Web service is deployed and from which the client accesses it. The syntax for this option is:

-endpoint=Web_services_endpoint

Use this option as follows:

% jpub -proxywsdl=META-INF/HelloService.wsdl ...
       -endpoint=http://localhost:8888/javacallout/javacallout

With this command, the Java wrapper class generated by JPublisher includes the following code:

      ((Stub)m_port0)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, 
                     "http://localhost:8888/javacallout/javacallout");

Without the -endpoint option, there would instead be the following commented code:

      // Specify the endpoint and then uncomment the following statement:
      // ((Stub)m_port0)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, 
      //                "<endpoint not provided>");

If you do not specify the endpoint in the JPublisher command line, then you must manually alter the generated wrapper class to uncomment this code and specify the appropriate endpoint.

Proxy URL for WSDL

If a WSDL document used for Web services call-outs is accessed through a firewall, use the -httpproxy option in conjunction with the -proxywsdl option to specify a proxy URL to use in resolving the URL of the WSDL document. The syntax for this option is:

-httpproxy=proxy_URL

For example:

% jpub ... -httpproxy=http://www-proxy.oracle.com:80

Superuser for Permissions to Run Client Proxies

Use the -sysuser option to specify the name and password of a superuser account. This account is used in running the JPublisher-generated PL/SQL script that grants permissions that allow client proxy classes to access Web services using HTTP. The syntax for this option is:

-sysuser=superuser_name/superuser_password

For example:

-sysuser=sys/change_on_install

Without a -sysuser setting, JPublisher does not load the generated script granting permissions. Instead, it asks you to execute the script separately.

If the -url setting specifies a thin driver, then you must set up a password file for SYS, which authorizes logon as SYS, through the thin driver. To set up a password file, you must:

  1. Add the remote_login_passwordfile option to the database parameter file. You must use either of the following settings:

    remote_login_passwordfile=shared
    
    remote_login_passwordfile=exclusive
    
  2. Create a password file, if you have not already created one. You can do this by running the following command, where ORACLE_HOME/dbs/ is an existing directory:

    orapwd file="ORACLE_HOME/dbs/orapwlsqlj1" entries=100 force=y
    Enter password: password
    
  3. Grant remote logon privileges to a user. This can be done as follows:

    % sqlplus /nolog
    SQL> CONN / AS sysdba
    Connected.
    SQL> GRANT sysdba TO scott;
    Grant succeeded.
    

See Also:

Oracle Database JDBC Developer's Guide for details of setting up a remote SYS logon

Option to Access SQLJ Functionality

This section documents the -sqlj option, which you can use to pass SQLJ options to the SQLJ translator through the JPublisher command line.

Settings for the SQLJ Translator

In Oracle Database 11g, SQLJ translation is automatic by default when you run JPublisher. Translation is transparent, with no visible .sqlj files resulting from JPublisher code generation.

However, you can still specify SQLJ settings for the JPublisher invocation of the SQLJ translator by using the JPublisher -sqlj option. The syntax for this option is:

-sqlj=sqlj_options

For example:

% jpub -user=scott -sqlj -optcols=true -optparams=true -optparamdefaults=datatype1(size1),datatype2(size)
Enter scott password: password

Note:

  • There is no equal sign (=) following -sqlj.

  • All other JPublisher options must precede the -sqlj option. Any option setting following -sqlj is taken to be a SQLJ option and is passed to the SQLJ translator. In the preceding example, -optcols, -optparams, and -optparamdefaults are SQLJ options.


You can also run JPublisher solely to translate .sqlj files that have already been produced explicitly, such as if you run JPublisher with the -compatible=sqlj setting, which skips the automatic SQLJ translation step and results in .sqlj output files from JPublisher. In this case, use no JPublisher options other than -sqlj. This is a way to accomplish manual SQLJ translation if the sqlj front-end script or executable is unavailable.

The commands following -sqlj are equivalent to the command you would give to the SQLJ translator utility directly. Here is an example:

% jpub -sqlj -d=outclasses -warn=none -encoding=SJIS Foo.sqlj

This is equivalent to the following, if the SQLJ command-line translator is available:

% sqlj -d=outclasses -warn=none -encoding=SJIS Foo.sqlj

Note:

  • As an alternative to specifying SQLJ option settings through the -sqlj option, you can specify them in the sqlj.properties file that JPublisher supports.

  • The -compiler-executable option, if set, is passed to the SQLJ translator to specify the Java compiler that the translator will use to compile Java code.


Backward Compatibility Option

This section documents the -compatible option, which you can use to specify any of the following:

  • The interface for JPublisher to implement in generated classes

  • Whether JPublisher should skip SQLJ translation, resulting in visible .sqlj output files

  • A backward-compatibility mode to use JPublisher output in an Oracle9i or Oracle8i environment

Backward-Compatible Oracle Mapping for User-Defined Types

The -compatible option has two modes of operation:

  • Through a setting of oradata or customdatum, you can explicitly specify an interface to be implemented by JPublisher-generated custom Java classes.

  • Through a setting of sqlj, 8i, both8i, or 9i, you can specify a backward-compatibility mode.

You can select either of the two modes, but not both.

The syntax for this option is:

-compatible={oradata|customdatum|both8i|8i|9i|10.1|sqlj}

Using -compatible to Specify an Interface

If -usertypes=oracle, then you have the option of setting -compatible=customdatum, to implement the deprecated CustomDatum interface in your generated classes for user-defined types, instead of the default ORAData interface. CustomDatum was replaced by ORAData in Oracle9i Database, but is still supported for backward compatibility.

The default setting to use the ORAData interface is oradata. If you set -usertypes=jdbc, then a -compatible setting of customdatum or oradata is ignored.

If you use JPublisher in a pre-Oracle9i Database environment, in which the ORAData interface is not supported, then the CustomDatum interface is used automatically if -usertypes=oracle. You will receive an informational warning if -compatible=oradata, but the generation will take place.

Using -compatible to Specify a Backward-Compatibility Mode

Use the sqlj, 10.1, 9i, 8i, or both8i setting to specify a backward-compatibility mode.

The -compatible=sqlj setting instructs JPublisher to skip SQLJ translation and instead produce .sqlj files that you can work with directly. The sqlj setting has no effect on the generated code itself. To translate the resulting .sqlj files, you can use the SQLJ translator directly, if available, or use the JPublisher -sqlj option.

The -compatibility=10.1 setting specifies Oracle Database 10g release 1 (10.1) compatibility mode. In this mode, the JPublisher option -dbjava acts the same as -java in Oracle Database 10g release 1 (10.1).

The -compatibility=9i setting specifies Oracle9i compatibility mode. In this mode, JPublisher generates .sqlj files with the same code as would be generated by Oracle9i version.

The -compatible=8i setting specifies Oracle8i compatibility mode. This mode uses the CustomDatum interface, generating .sqlj files with the same code that would be generated by Oracle8i versions of JPublisher. The 8i setting is equivalent to setting several individual JPublisher options for backward compatibility to Oracle8i. For example, behavior of method generation is equivalent to that for -methods=always, and generation of connection context declarations is equivalent to that for -context=generated.

The -compatible=both8i setting is for an alternative Oracle8i compatibility mode. With this setting, wrapper classes are generated to implement both the ORAData and CustomDatum interfaces. Code is generated as it would have been by Oracle8i version of JPublisher. This setting is generally preferred over the -compatible=8i setting, because support for ORAData is required for programs running in the middle tier, such as in Oracle Application Server. However, using ORAData requires an Oracle9i release 1 (9.0.1) or later JDBC driver.


Note:

In any compatibility mode that results in the generation of visible .sqlj files, remember that if you are generating Java wrapper classes for a SQL type hierarchy and any of the types contains stored procedures, then, by default, JPublisher generates .sqlj files for all the SQL types, and not just the types that have stored procedures.

Java Environment Options

This section discusses JPublisher options that you can use to determine the Java environment:

  • The -classpath option specifies the Java classpath that JPublisher and SQLJ use to resolve classes during translation and compilation.

  • The -compiler-executable option specifies the Java compiler for compiling the code generated by JPublisher.

  • The -vm option specifies the JVM through which JPublisher is invoked.

In a UNIX environment, the jpub script specifies the location of the Java executable that runs JPublisher. This script is generated at the time you install your database or application server instance. If the jpub script uses a Java version prior to JDK 1.4, then some JPublisher functionality for Web services, such as call-outs and mapping to the SYS.XMLType, are unavailable.

Classpath for Translation and Compilation

Use the -classpath option to specify the Java classpath for JPublisher to use in resolving Java source and classes during translation and compilation. The syntax for this option is:

-classpath=path1:path2:...:pathN

The following command shows an example of its usage, adding new paths to the existing classpath:

% jpub -user=scott -sql=PERSON:Person,STUDENT:Student -classpath=.:$ORACLE_HOME/jdbc/lib/ocrs12.jar:$CLASSPATH
Enter scott password: password

Note:

SQLJ also has a -classpath option. If you use the SQLJ -classpath option, following the JPublisher -sqlj option, then that setting is used for the classpath for translation and compilation, and any JPublisher -classpath option setting is ignored. It is more straightforward to use only the JPublisher -classpath option.

Java Compiler

Use the -compiler-executable option if you want Java code generated by JPublisher to be compiled by anything other than the compiler that JPublisher would use by default on your system. Specify the path to an alternative compiler executable file. The syntax for this option is:

-compiler-executable=path_to_compiler_executable

Java Version

Use the -vm option if you want to use a JVM other than the JVM that JPublisher would use by default on your system. Specify the path to an alternative Java executable file. The syntax for this option is:

-vm=path_to_JVM_executable

As an example, assume that JDK 1.4 is installed on a UNIX system at the location JDK14, relative to the current directory. Run JPublisher with the following command to use the JDK 1.4 JVM and compiler when publishing Web services client proxy classes:

% jpub -vm=JDK14/bin/java -compiler-executable=JDK14/bin/java -proxywsdl=hello.wsdl

SQLJ Migration Options

Starting from Oracle Database 10g release 2 (10.2), JPublisher provides the following command-line options to support migrating SQLJ to JDBC applications:

  • -migrate

    This option enables you to turn on SQLJ migration. The syntax for setting this option is as follows:

    -migrate[=true|false]
    

    The -migrate and -migrate=true settings are equivalent. Both these settings indicate that JPublisher should migrate SQLJ programs specified on the command line to JDBC programs. The -migrate=false turns off the migration mode, and SQLJ programs are translated and compiled into a Java program that possibly depends on the SQLJ run time. By default, if this option is not specified, then JPublisher acts like -migrate=false.

  • -migconn

    This option enables you to specify the default JDBC connection used by the migrated code. The default JDBC connection replaces the default DefaultContext instance in the SQLJ run time. The syntax for setting this option is as follows:

    -migconn=getter:getter,setter:setter
    -migconn=name[[:datasource|modifier][,modifier]*]
    

    In the first syntax, the getter and setter settings specify the getter and setter methods for the default connection. For example:

    -migconn=getter:Test.getDefConn,setter:Test.setDefConn
    

    In the second syntax, the name setting specifies the default JDBC connection. The optional datasource setting provides a JNDI data source location for initializing the default JDBC connection. The modifier settings add the modifiers for the default connection variable. You can specify more than one modifier by using multiple modifier settings. Examples of the usage of the second syntax are as follows:

    -migconn=_defaultConn:public,static
    -migconn=Test._defaultConn
    -migconn=Test._defaultConn:jdbc/MyDataSource
    -migconn=_defaultConn:public,static,final
    
  • -migrsi

    This option enables you to specify an interface for all ResultSet iterator classes. The syntax for setting this option is as follows:

    -migrsi=java_interface_name
    

    For example:

    -migrsi=ResultSetInterface
    
  • -migsync

    This option enables you to mark static variables as synchronized. The syntax for setting this option is as follows:

    -migsync[=true|false]
    

    The -migsync and -migsync=true settings mark static variables generated for migration purpose as synchronized. If you do not want the variables to be marked as synchronized, then set -migsync=false. By default, JPublisher acts like -migsync=true.

  • -migdriver

    This option enables you to specify the JDBC driver registered by the migrated code. The syntax for setting this option is as follows:

    -migdriver=class_name|no
    

    For example:

    -migdriver=oracle.jdbc.driver.OracleDriver
    

    By default, JPublisher acts like -migdriver=oracle.jdbc.driver.OracleDriver. If you do not want the driver registration code to be generated during migration, then set this option as follows:

    -migdriver=no
    
  • -migcodegen

    This option enables you to specify whether the migrated code depends on an Oracle JDBC driver or a generic JDBC driver. The syntax for setting this option is as follows:

    -migcodegen=oracle|jdbc
    

    The default behavior is -migcodegen=oracle, indicating that Oracle-specific JDBC APIs are used in the migrated code.

  • -migserver

    This option enables you to specify whether to migrate the program to be used on the server. The syntax for setting this option is as follows:

    -migserver
    

JPublisher Input Files

The following sections describe the structure and contents of JPublisher input files:

Properties File Structure and Syntax

A properties file is an optional text file in which you can specify frequently used options. Specify the name of the properties file on the JPublisher command line with the -props option.


Note:

-props is the only option that you cannot specify in a properties file.

On each line in a properties file, enter only one option with its associated value. Enter each option setting with the following prefix, including the period:

jpub.

The jpub. prefix is case-sensitive. White space is permitted only directly in front of jpub.. Any other white space within the option line is significant.

Alternatively, JPublisher permits you to specify options with a double-dash (--), which is the syntax for SQL comments, as part of the prefix:

-- jpub.

A line that does not start with either of the prefixes shown is simply ignored by JPublisher.

In addition, you can use line continuation to spread a JPublisher option over several lines in the properties file. A line to be continued must have a backslash character (\) as the last character, immediately after the text of the line. Any leading space or double dash (--) on the line that follows the backslash is ignored. Consider the following sample entries:

/* The next three lines represent a JPublisher option
   jpub.sql=SQL_TYPE:JPubJavaType:MyJavaType,\
            OTHER_SQL_TYPE:OtherJPubType:MyOtherJavaType,\
            LAST_SQL_TYPE:My:LastType
*/
-- The next two lines represent another JPublisher option
-- jpub.addtypemap=PLSQL_TYPE:JavaType:SQL TYPE\
--                :SQL_TO_PLSQL_FUNCTION:PLSQL_TO_SQL_FUNCTION

Using this functionality, you can embed JPublisher options in SQL scripts, which may be useful when setting up PL/SQL-to-SQL type mappings.

JPublisher reads the options in the properties file in order, as if its contents were inserted on the command line at the point where the -props option is located. If you specify an option more than once, then the last value encountered by JPublisher overrides previous values, except for the following options, which are cumulative:

  • jpub.sql (or the deprecated jpub.types)

  • jpub.java

  • jpub.style

  • jpub.addtypemap

  • jpub.adddefaulttypemap

For example, consider the following command:

% jpub -user=scott -sql=employee -mapping=oracle -case=lower -package=corp -dir=demo
Enter scott password: password

Now consider the following:

% jpub -props=my_properties

This command is equivalent to the first example if you assume that my_properties has a definition such as the following:

-- jpub.user=scott/tiger
// jpub.user=cannot_use/java_line_comments
jpub.sql=employee
/*
jpub.mapping=oracle
*/
Jpub.notreally=a jpub option
   jpub.case=lower
jpub.package=corp
    jpub.dir=demo

You must include the jpub. prefix at the beginning of each option name. If you enter anything other than white space or double dash (--) before the option name, then JPublisher ignores the entire line.

The preceding example illustrates that white space before jpub. is okay. It also shows that the jpub. prefix must be all lowercase, otherwise it is ignored. Therefore the following line from the preceding example will be ignored:

Jpub.notreally=a jpub option

INPUT File Structure and Syntax

Specify the name of the INPUT file on the JPublisher command line with the -input option. This file identifies SQL user-defined types and PL/SQL packages that JPublisher should translate. It also controls the naming of the generated classes and packages. Although you can use the -sql command-line option to specify user-defined types and packages, an INPUT file allows you a finer degree of control over how JPublisher translates them.

If you do not specify types or packages to translate in an INPUT file or on the command line, then JPublisher translates all user-defined types and PL/SQL packages in the schema to which it connects.

Understanding the Translation Statement

The translation statement in the INPUT file identifies the names of the user-defined types and PL/SQL packages that you want JPublisher to translate. Optionally, the translation statement can also specify a Java name for the type or package, a Java name for attribute identifiers, and whether there are any extended classes.

One or more translation statements can appear in the INPUT file. The structure of a translation statement is as follows:

( SQL name
| SQL [schema_name.]toplevel  [(name_list)]
| TYPE type_name)
[GENERATE java_name_1]
[AS java_name_2] 
[TRANSLATE  
     database_member_name AS simple_java_name
 { , database_member_name AS simple_java_name}* 
]

The following sections describe the components of the translation statement.

SQL name | TYPE type_name Enter SQL name to identify a SQL type or a PL/SQL package that you want JPublisher to translate. JPublisher examines the name, determines whether it is for a user-defined type or a PL/SQL package, and processes it appropriately. If you use the reserved word toplevel in place of name, JPublisher translates the top-level subprograms in the schema to which JPublisher is connected.

Instead of SQL, it is permissible to enter TYPE type_name if you are specifying only object types. However, the TYPE syntax is deprecated.

You can enter name as schema_name.name to specify the schema to which the SQL type or package belongs. If you enter schema_name.toplevel, JPublisher translates the top-level subprograms in schema schema_name. In conjunction with TOPLEVEL, you can also supply name_list, which is a comma-delimited list of names to be published, enclosed in parentheses. JPublisher considers only top-level functions and procedures that match this list. If you do not specify this list, JPublisher generates code for all top-level subprograms.


Note:

If a user-defined type is defined in a case-sensitive way in SQL, then you must specify the name in quotes. For example:
SQL "CaseSenstiveType" AS CaseSensitiveType

Alternatively, you can also specify a schema name that is not case-sensitive:

SQL SCOTT."CaseSensitiveType" AS CaseSensitiveType

You can also specify a case-sensitive schema name:

SQL "Scott"."CaseSensitiveType" AS CaseSensitiveType

The AS clause is optional.

Avoid situations where a period (".") is part of the schema name or the type name itself.


GENERATE java_name_1 AS java_name_2 The AS clause specifies the name of the Java class that represents the SQL user-defined type or PL/SQL package being translated.

When you use the AS clause without a GENERATE clause, JPublisher generates the class in the AS clause and maps it to the SQL type or PL/SQL package.

When you use both the GENERATE clause and the AS clause for a SQL user-defined type, the GENERATE clause specifies the name of the Java class that JPublisher generates, which is referred to as the base class. The AS clause specifies the name of a Java class that extends the generated base class, which is referred to as the user subclass. JPublisher produces an initial version of the user subclass, and you will typically add code for your desired functionality. JPublisher maps the SQL type to the user subclass, and not to the base class. If you later run the same JPublisher command to republish the SQL type, then the generated class is overwritten, but the user subclass is not.

The java_name_1 and java_name_2 can be any legal Java names and can include package identifiers. The case of the Java names overrides the -case option.

TRANSLATE database_member_name AS simple_java_name This clause optionally specifies a different name for an attribute or method. The database_member_name is the name of an attribute of a SQL object type or the name of a method of an object type or PL/SQL package. The attribute or method is to be translated to simple_java_name, which can be any legal Java name. The case of the Java name overrides the -case option. This name cannot have a package name.

If you do not use TRANSLATE...AS to rename an attribute or method, or if JPublisher translates an object type not listed in the INPUT file, then JPublisher uses the database name of the attribute or method as the Java name. If applicable, the Java name is modified according to the setting of the -case option. Reasons why you may want to rename an attribute or method include:

  • The name contains characters other than letters, digits, and underscores.

  • The name conflicts with a Java keyword.

  • The type name conflicts with another name in the same scope. This can happen, for example, if the program uses two types with the same name from different schemas.

Remember that your attribute names will appear embedded within getXXX() and setXXX() method names, so you may want to capitalize the first letter of your attribute names. For example, if you enter:

TRANSLATE FIRSTNAME AS FirstName

JPublisher generates a getFirstName() method and a setFirstName() method. In contrast, if you enter:

TRANSLATE FIRSTNAME AS firstName

JPublisher generates a getfirstName() method and a setfirstName() method.


Note:

The Java keyword null has special meaning when used as the target Java name for an attribute or method, such as in the following example:
TRANSLATE FIRSTNAME AS null

When you map a SQL method to null, JPublisher does not generate a corresponding Java method in the mapped Java class. When you map a SQL object attribute to null, JPublisher does not generate the getter and setter methods for the attribute in the mapped Java class.


Package Naming Rules in the INPUT File  You can specify a package name by using a fully qualified class name in the INPUT file. If you use a simple, unqualified class name in the INPUT file, then the fully qualified class name includes the package name from the -package option. This is demonstrated in the following examples:

  • Assume the following in the INPUT file:

    SQL A AS B
    

    And assume the setting -package=a.b. In this case, a.b is the package and a.b.B is the fully qualified class name.

  • Assume that you enter the following in the INPUT file and there is no -package setting:

    SQL A AS b.C
    

    The package is b, and b.C is the fully qualified class name.


Note:

If there are conflicting package settings between a -package option setting and a package setting in the INPUT file, then the precedence depends on the order in which the -input and -package options appear on the command line. The -package setting takes precedence if that option is after the -input option, else the INPUT file setting takes precedence.

Translating Additional Types It may be necessary for JPublisher to translate additional types that are not listed in the INPUT file. This is because JPublisher analyzes the types in the INPUT file for dependencies before performing the translation and translates any additional required types.

Consider the example in "Sample JPublisher Translation". Assume that the object type definition for EMPLOYEE includes an attribute called ADDRESS, and ADDRESS is an object with the following definition:

CREATE OR REPLACE TYPE address AS OBJECT
(
    street     VARCHAR2(50),
    city       VARCHAR2(50),
    state      VARCHAR2(30),
    zip        NUMBER
);

In this case, JPublisher would first translate ADDRESS, because that would be necessary to define the EMPLOYEE type. In addition, ADDRESS and its attributes would all be translated in the same case, because they are not specifically mentioned in the INPUT file. A class file would be generated for Address.java, which would be included in the package specified on the command line.

JPublisher does not translate PL/SQL packages you do not request, because user-defined types or other PL/SQL packages cannot have dependencies on PL/SQL packages.

Sample Translation Statement

To better illustrate the function of the INPUT file, consider an updated version of the example in "Sample JPublisher Translation".

Consider the following command:

% jpub -user=scott -input=demoin -numbertypes=oracle -usertypes=oracle -dir=demo -d=demo -package=corp -case=same
Enter scott password: password

And assume that the INPUT file demoin contains the following:

SQL employee AS Employee 
TRANSLATE NAME AS Name HIRE_DATE AS HireDate

The -case=same option specifies that generated Java identifiers maintain the same case as in the database, except where you specify otherwise. Any identifier in a CREATE TYPE or CREATE PACKAGE declaration is stored in uppercase in the database unless it is quoted. In this example, the -case option does not apply to the EMPLOYEE type, because EMPLOYEE is specified to be translated as the Java class Employee.

For attributes, attribute identifiers not specifically mentioned in the INPUT file remain in uppercase, but JPublisher translates NAME and HIRE_DATE as Name and HireDate, as specified.

The translated EMPLOYEE type is written to the following files, relative to the current directory, for UNIX systems in this example, reflecting the -package, -dir, and -d settings:

demo/corp/Employee.java
demo/corp/Employee.class

INPUT File Precautions

This section describes possible INPUT file error conditions that JPublisher will currently not report. There is also a section for reserved terms.

Requesting the Same Java Class Name for Different Object Types

If you request the same Java class name for two different object types, the second class overwrites the first without warning. Consider that the INPUT file contains:

type PERSON1 as Person
type PERSON2 as Person

JPublisher creates the Person.java file for PERSON1 and then overwrites it for the PERSON2 type.

Requesting the Same Attribute Name for Different Object Attributes

If you request the same attribute name for two different object attributes, JPublisher generates getXXX() and setXXX() methods for both attributes without issuing a warning message. The question of whether the generated class is valid in Java depends on whether the two getXXX() methods with the same name and the two setXXX() methods with the same name have different argument types so that they may be unambiguously overloaded.

Specifying Nonexistent Attributes

If you specify a nonexistent object attribute in the TRANSLATE clause, then JPublisher ignores it without issuing a warning message.

Consider the following example from an INPUT file:

type PERSON translate X as attr1

A situation in which X is not an attribute of PERSON does not cause JPublisher to issue a warning message.

JPublisher Reserved Terms

Do not use any of the following reserved terms as SQL or Java identifiers in the INPUT file.

AS 
GENERATE 
IMPLEMENTS 
SQLSTATEMENTS_TYPE 
SQLSTATEMENTS_METHOD 
SQL 
TRANSLATE 
TOPLEVEL 
TYPE 
VERSION
PKD}7PK.AOEBPS/intro.htm Introduction to JPublisher

1 Introduction to JPublisher

This chapter provides an overview of the JPublisher utility, a summary of JPublisher operations, and a sample translation. It covers the following topics:

Overview of JPublisher

JPublisher is a utility that generates Java classes to represent database entities, such as SQL objects and PL/SQL packages, in a Java client program. It also provides support for publishing from SQL, PL/SQL, and server-side Java to Web services and enabling the invocation of external Web services from inside the database. JPublisher is written in Java.

JPublisher can create classes to represent the following database entities types:

  • User-defined SQL objects

  • Object references

  • User-defined SQL collections

  • PL/SQL packages

  • Server-side Java classes

  • SQL queries and data manipulation language (DML) statements

JPublisher enables you to specify and customize the mapping of these entities to Java classes in a strongly typed paradigm.


Note:

The term, strongly typed, indicates that a particular Java type is associated with a particular user-defined SQL type, such as an object type. For example, a Person class is associated with a corresponding PERSON SQL type. In addition, there is a corresponding Java type for each attribute of the SQL object type.

The utility generates the accessor methods, getXXX() and setXXX(), for each attribute of an object type. If the object type has stored procedures, then JPublisher can generate wrapper methods to invoke the stored procedures. In this scenario, a wrapper method is a Java method that invokes a stored procedure, which runs in Oracle Database.

JPublisher can also generate classes for PL/SQL packages. These classes have wrapper methods to call the stored procedures in a PL/SQL package.

Instead of directly using JPublisher-generated classes, you can:

  • Extend the generated classes. This process is straightforward. JPublisher generates initial versions of the subclasses, to which you can add any desired functionality.

  • Write your own Java classes. This approach is flexible, but time-consuming and error-prone.

  • Use generic, weakly typed classes of the oracle.sql package to represent object, object reference, and collection types. If these classes meet your requirements, then you do not need JPublisher. Use this approach if you need to generically process any SQL object, collection, reference, or OPAQUE type.

In addition, JPublisher simplifies access to PL/SQL types from Java. You can use predefined or user-defined mappings between PL/SQL and SQL types, as well as use PL/SQL conversion functions between such types. With these mappings in place, JPublisher can automatically generate all the required Java and PL/SQL code. It also enables you to publish server-side Java classes to client-side Java classes, allowing your application to make direct calls to Java classes in the database.

Several features enable the exposure of Java classes, which are generated from publishing SQL, PL/SQL, or server-side Java entities, as Web services.

JPublisher Initial Considerations

The following sections provide an overview of JPublisher features and requirements. It also describes and how JPublisher uses SQLJ in its code generation:

New Features in Oracle Database 11g Release 2 JPublisher

There are no new features in this release of JPublisher.

General Requirements for JPublisher

This section describes the basic requirements for JPublisher. It also discusses situations with less stringent requirements.

When you use the JPublisher utility, you must also have classes for the Oracle SQLJ implementation, the Oracle JDBC implementation, and a Sun Microsystems JDK, among other things.

To use all features of JPublisher, you must have the following installed and set in the appropriate environment variables, as applicable:

  • Oracle Database 11g

  • JPublisher invocation script or executable

    The jpub script for UNIX systems or the jpub.exe program for Microsoft Windows must be in your file path. These are typically in ORACLE_HOME/bin, or ORACLE_HOME/sqlj/bin for manual downloads. With proper setup, if you type just jpub on the command line, you will see information about common JPublisher options and input settings.

  • JPublisher and SQLJ translator classes

    These classes are in the translator.jar library, typically in ORACLE_HOME/sqlj/lib.


    Note:

    The translator library is also automatically loaded into the database in translator-jserver.jar.

  • SQLJ run time classes

    The SQLJ run-time library is runtime12.jar for JDK 1.5 and later. It is typically located in ORACLE_HOME/sqlj/lib. It includes JPublisher client-side run-time classes, particularly oracle.jpub.reflect.Client, and JPublisher server-side run-time classes, particularly oracle.jpub.reflect.Server. These classes are used for Java call-ins to the database.

  • Oracle Database 11g or Oracle Database 10g JDBC drivers

    If you are using JPublisher 11g with Oracle 11g JDBC, then the supported JDK versions are only JDK 1.5 and 1.6. However, if you are using JPublisher 11g with Oracle JDBC 10g driver, then you can also use JDK version 1.4.x. Oracle JDBC library is ojdbc14.jar for JDK 1.4, ojdbc5*.jar for JDK 1.5, and ojdbc6*.jar for JDK 1.6. It is typically located in ORACLE_HOME/jdbc/lib. Each JDBC library also includes the JPublisher run-time classes in the oracle.jpub.runtime package.

  • Web services classes

    These classes are included in the dbwsa.jar and dbwsclient.jar libraries, which are typically located in ORACLE_HOME/sqlj/lib.


    Note:

    These .jar files are not included in JPublisher distribution, but are included in the database Web services call-out utility, which can be downloaded from http://www.oracle.com/technetwork/database/database-083829.html.

  • Additional PL/SQL packages and Java Archive (JAR) files in the database, as needed

    There are packages and JAR files that must be in the database if you use JPublisher features for Web services call-ins, Web services call-outs, support for PL/SQL types, or support for invocation of server-side Java classes. Some of these packages and files are preloaded, but some must be loaded manually.

  • aurora.zip

    When publishing a Web services client using -proxywsdl or publishing server-side Java classes using -dbjava, JPublisher may load generated Java wrapper into the database. In this case, the ORACLE_HOME/lib/aurora.zip file is required. On Microsoft Windows, add this file to CLASSPATH. On Unix systems, the jpub script picks up aurora.zip automatically. If the aurora.zip file is not available, then you can turn off the JPublisher loading behavior by specifying -proxyopt=noload on the command line.

  • JDK version 1.4 or later

    For Web services call-outs or to map SYS.XMLType for Web services, you need JDK 1.4 or later.

Installing JPublisher

In order to install JPublisher, you must install SQLJ in your system. Perform the following steps to install SQLJ:

  1. Download and unzip the Oracle Database 11g Client CD.

  2. Execute Oracle Universal Installer by running the setup.exe file.

    The Welcome window appears as shown in Figure 1-8.

    Figure 1-1 Oracle Universal Installer Welcome Screen

    Description of Figure 1-1 follows
    Description of "Figure 1-1 Oracle Universal Installer Welcome Screen"

  3. Click Next.

    The Select Installation Type window appears as shown in Figure 1-2.

    Figure 1-2 Oracle Universal Installer Select Installation Type Screen

    Description of Figure 1-2 follows
    Description of "Figure 1-2 Oracle Universal Installer Select Installation Type Screen"

  4. Select Custom as the installation type and click Next.

    The Install Location window appears as shown in Figure 1-3.

    Figure 1-3 Oracle Universal Installer Install Location Screen

    Description of Figure 1-3 follows
    Description of "Figure 1-3 Oracle Universal Installer Install Location Screen"

  5. Verify whether your Oracle Database Home is correct or not and click Next.

    The Product-Specific Prerequisite Checks window appears as shown in Figure 1-4.

    Figure 1-4 Oracle Universal Installer Product-Specific Prerequisite Check Screen

    Description of Figure 1-4 follows
    Description of "Figure 1-4 Oracle Universal Installer Product-Specific Prerequisite Check Screen"

  6. The installer verifies that your system meets the pre-requisites. Click Next after the verification is complete.

    The Available Product Components window appears as shown in Figure 1-5.

    Figure 1-5 Oracle Universal Installer Available Product Components Screen

    Description of Figure 1-5 follows
    Description of "Figure 1-5 Oracle Universal Installer Available Product Components Screen"

  7. Select Oracle SQLJ from the Components column in the Oracle Client section and click Next.

    The Summary window appears.

    Figure 1-6 Oracle Universal Installer Summary Screen

    Description of Figure 1-6 follows
    Description of "Figure 1-6 Oracle Universal Installer Summary Screen"

  8. Review your selections, and then click Install.

    The Install window appears displaying the progress.

    Figure 1-7 Oracle Universal Installer Install Screen

    Description of Figure 1-7 follows
    Description of "Figure 1-7 Oracle Universal Installer Install Screen"

  9. Click Exit and then click Yes.

Verifying JPublisher Installation

Depending on the JPublisher features that you need to use, some or all of the following PL/SQL packages and JAR files must be present in the database:

  • The SQLJUTL package, to support PL/SQL types

  • The SQLJUTL2 package, to support invocation of server-side Java classes

  • The UTL_DBWS package, to support Web services call-outs

  • The dbwsclient.jar file, to support the Java API for XML-based Remote Procedure Call (JAX-RPC) or Simple Object Access Protocol (SOAP) client proxy classes for Web services call-outs from Oracle Database 11g or Oracle Database 10g.

  • JAR files to support SOAP client proxy classes for Web services call-outs from Oracle9i or Oracle8i Database

    For Web services call-outs from Oracle9i Database or Oracle8i Database, there is no JAR file similar to dbwsclient.jar. You must load several JAR files instead. Also note that JPublisher does not yet support JAX-RPC client proxy classes in Oracle9i or Oracle8i.


Note:

  • Starting from Oracle Database 10g, the sqljutl.jar is preloaded in the database and you get built-in support for Web services call-ins. The sqljutl.jar file that was required to load manually in Oracle9i Database and Oracle8i Database, is not shipped anymore.

  • The UTL_DBWS package and the dbwsclient.jar file are associated with each other, and both support the same set of features.


This section covers the following topics:

Verifying or Installing the SQLJUTL and SQLJUTL2 Packages

In Oracle Database 11g, the PL/SQL packages SQLJUTL and SQLJUTL2 are automatically installed in the database SYS schema. To verify the installation, try to describe the packages as follows:

SQL> describe sys.sqljutl
SQL> describe sys.sqljutl2

If JPublisher displays a message similar to the following, then the packages are missing:

Warning: Cannot determine what kind of type is <schema>.<type.> You likely need
to install SYS.SQLJUTL. The database returns: ORA-06550: line 1, column 7:
PLS-00201: identifier 'SYS.SQLJUTL' must be declared

To install the SQLJUTL and SQLJUTL2 packages, you must install one of the following files in the SYS schema:

  • ORACLE_HOME/sqlj/lib/sqljutl.sql for Oracle9i, Oracle Database 10g, or Oracle Database 11g

  • ORACLE_HOME/sqlj/lib/sqljutl8.sql for Oracle8i

Verifying or Installing the UTL_DBWS Package

In Oracle Database 11g release 2 (11.2), the UTL_DBWS PL/SQL package is not automatically installed in the database SYS schema due to security reasons. You must install this package by running the utl_dbws_decl.sql and utl_dbws_body.sql scripts included as callout utilities available on the following OTN page:

http://www.oracle.com/technetwork/database/database-083829.html

To verify the installation, try to describe the package as follows:

SQL> describe sys.utl_dbws

Verifying or Loading the dbwsclient.jar File

In Oracle Database 11g, the following file must be loaded into the database for Web services call-outs:

ORACLE_HOME/sqlj/lib/dbwsclient.jar

It is not preloaded, but you can verify whether it is already loaded by running the following query in the SYS schema:

SQL>  select status, object_type from all_objects where
      dbms_java.longname(object_name)='oracle/jpub/runtime/dbws/DbwsProxy$1';

The following result indicates that the file is already loaded:

STATUS  OBJECT_TYPE
------- -------------------
VALID   JAVA CLASS
VALID   SYNONYM

If it not loaded, then you can use the loadjava utility to load it as shown in the following example:

% loadjava -oci8 -u sys -r -v -f -s 
           -grant public dbwsclient.jar
Password: password

Note:

Before loading this file, verify that java_pool_size is set to at least 80 MB and shared_pool_size is set to at least 96 MB.

Loading JAR Files For Web Services Call-Outs in Oracle9i or Oracle8i

For Web services call-outs from an Oracle9i or Oracle8i database, use SOAP client proxy classes. For this, you must load a number of JAR files into the database. This can be accomplished with the following command:

% loadjava -u sys -r -v -s -f -grant public 
           ORACLE_HOME/soap/lib/soap.jar 
           ORACLE_HOME/dms/lib/dms.jar 
           J2EE_HOME/lib/servlet.jar 
           J2EE_HOME/lib/ejb.jar 
           J2EE_HOME/lib/mail.jar
Password: password

You can obtain these files from an Oracle Application Server installation. You would presumably run Web services in conjunction with Oracle Application Server Containers for J2EE (OC4J).


Note:

  • The JAX-RPC client proxy classes are not yet supported in Oracle9i or Oracle8i.

  • Before loading this file, verify that java_pool_size is set to at least 80 MB and shared_pool_size is set to at least 96 MB.


Setting Up Password File for Remote SYS Login

By default, if the -user and -sysuser options are set while publishing Web services client using -proxywsdl or publishing server-side Java classes using -dbjava, then JPublisher will load the generated Java and PL/SQL wrappers into the database. When the -url setting specifies a JDBC Thin driver, the loading process requires the database password file to be set up properly. You can set up the password file by performing the following steps:

  1. On the command line, enter the following command:

    orapwd file=$ORACLE_HOME/dbs/orapw entries=5
    Enter password: password
    

    In the preceding command, yourpass is the password of your choice.

  2. From SQL*Plus, connect to the database as SYSDBA, as follows:

    CONNECT / AS SYSDBA
    

    Change the password of SYS to the password set in the previous step, as follows:

    PASSWORD SYS
           Changing password for SYS
           New password: password
           Retype new password: password
    
  3. Edit the init.ora file and add the following line to it:

    REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
    

    This enables remote login as SYSDBA.

Alternatively, with the password file set up, you can manually load JPublisher generated PL/SQL wrapper and Java wrapper into the database. To turn off automatic loading by JPublihser, specify -proxyopt=noload on the command line.

JPublisher Usage of the SQLJ Implementation

This section covers the following topics:

Overview of SQLJ Usage

Oracle SQLJ translator and run-time libraries are supplied with the JPublisher product. The JPublisher utility uses the Oracle SQLJ implementation by generating SQLJ code as an intermediate step in most circumstances, such as the creation of wrapper methods. The wrapper methods are created either for classes representing PL/SQL packages or for classes representing SQL object types that define PL/SQL stored procedures. In these cases, JPublisher uses Oracle SQLJ translator during compilation and Oracle SQLJ run time during program execution.

In Oracle Database 11g, the usage of SQLJ by JPublisher is transparent by default. SQLJ source files that JPublisher generates are automatically translated and deleted, unless you specify otherwise in the JPublisher settings. This automatic translation saves you the effort of explicitly translating the files. The resulting .java files, which use the SQLJ functionality, and the associated .class files produced by compilation, define the SQLJ classes. These classes use the Oracle SQLJ run-time application programming interfaces (APIs) while running. Generated classes that do not use the SQLJ run time are referred to as non-SQLJ classes. Non-SQLJ classes are generated when JPublisher creates classes for SQL types that do not have stored procedures or when JPublisher is specifically set to not generate wrapper methods.

In Oracle Database 11g, it is possible to pass options to the SQLJ translator through the JPublisher -sqlj option.

JPublisher is included in translator.jar, which also contains the SQLJ translator library. JPublisher generated classes may rely on runtime12.jar, which is the SQLJ run-time library for Java Development Kit (JDK) 1.5 and later.

Overview of SQLJ Concepts

A SQLJ program is a Java program containing embedded SQL statements that comply with the International Standardization Organization (ISO) standard SQLJ Language Reference syntax. SQLJ source code contains a mixture of standard Java source, SQLJ class declarations, and SQLJ executable statements with embedded SQL operations.

SQLJ was chosen because it uses simplified code for database access as compared to JDBC code. In SQLJ, a SQL statement is embedded in a single #sql statement, but several JDBC statements may be required for the same operation.

This section briefly defines the following key concepts of SQLJ:

  • Connection contexts

    A SQLJ connection context object is a strongly typed database connection object. You can use each connection context class for a particular set of interrelated SQL entities. This means that all the connections you define using a particular connection context class will use tables, views, and stored procedures that have names and data types in common. In theory, the advantage in tailoring connection context classes to sets of SQL entities is in the degree of online semantics-checking that is permitted during SQLJ translation. JPublisher does not use online semantics-checking when it invokes the SQLJ translator, but you can use this feature if you choose to work with .sqlj files directly.

    The sqlj.runtime.ref.DefaultContext connection context class is used by default. The SQLJ default context is a default connection object and an instance of this class. The DefaultContext class or any custom connection context class implements the standard sqlj.runtime.ConnectionContext interface. You can use the JPublisher -context option to specify the connection context class that JPublisher instantiates for database connections.

  • Iterators

    A SQLJ iterator is a strongly typed version of a JDBC result set and is associated with the underlying database cursor. SQLJ iterators are used for taking query results from a SELECT statement. The strong typing is based on the data type of each query column.

  • Execution contexts

    A SQLJ execution context is an instance of the standard sqlj.runtime.ExecutionContext class and provides a context in which SQL operations are run. An execution context instance is associated either implicitly or explicitly with each SQL operation that is run through SQLJ code.

Backward-Compatibility Modes Affecting SQLJ Source Files

In Oracle8i Database and Oracle9i Database, JPublisher produces .sqlj source files as visible output, which you can translate by using the SQLJ command-line interface.


Note:

On UNIX systems, you can access the SQLJ command-line interface by running the sqlj script. In Microsoft Windows, you use sqlj.exe.

In Oracle Database 11g, JPublisher supports several backward-compatibility settings through the -compatible option. This option enables you to work with generated .sqlj files in a similar fashion. Some of the -compatible option settings are as follows:

  • -compatible=sqlj

    This forces JPublisher skip the step of translating .sqlj files. You must translate the .sqlj files explicitly. To translate the files, you can either run JPublisher using only the -sqlj option or you can run the SQLJ translator directly through its own command-line interface.

  • -compatible=9i

    This sets JPublisher to Oracle9i compatibility mode. In this mode, JPublisher generates .sqlj files with the same code as in Oracle9i versions. This enables you to work directly with .sqlj files.

  • -compatible=8i or -compatible=both8i

    This sets JPublisher to Oracle8i compatibility mode. JPublisher then generates .sqlj files with the same code as in Oracle8i versions. As with Oracle9i compatibility mode, this mode enables you to work directly with .sqlj files.

Oracle8i and Oracle9i compatibility modes, particularly the former, result in significant differences in the code that JPublisher generates. If your only goal is to work directly with the .sqlj files, then use the sqlj setting.

Situations for Reduced Requirements

If you do not use certain features of JPublisher, then your requirements may be less stringent. Some of the situations for reduced requirements are as follows:

  • If you never generate classes that implement the Oracle-specific oracle.sql.ORAData interface or the deprecated oracle.sql.CustomDatum interface, then you can use a non-Oracle JDBC driver and connect to a non-Oracle database. However, JPublisher must be able to connect to Oracle Database.


    Note:

    Oracle does not test or support configurations that use non-Oracle components.

  • If you instruct JPublisher to not generate wrapper methods by setting -methods=false, or if your object types do not define any methods, then JPublisher will not generate wrapper methods or produce any SQLJ classes. In these circumstances, there is no SQLJ translation step and the SQLJ translator is not required.

  • If you do not use JPublisher functionality to enable Web services call-outs, then you do not need dbwsa.jar or dbwsclient.jar to be loaded in the database.

JPublisher Limitations

You must be aware of the following limitations when you use JPublisher:

  • JPublisher support for PL/SQL RECORD and indexed-by table types is limited. An intermediate wrapper layer is used to map a RECORD or an indexed-by-table argument to a SQL type that JDBC supports. In addition, JPublisher cannot fully support the semantics of indexed-by tables. An indexed-by table is similar in structure to a Java hashtable, but information is lost when JPublisher maps this to a SQL TABLE type.

  • If you use an INPUT file to specify type mappings, then note that some potentially disruptive error conditions do not result in error or warning messages from JPublisher. Additionally, there are reserved terms that you are not permitted to use as SQL or Java identifiers.

  • The -omit_schema_names JPublisher option has a boolean logic, but does not use the same syntax as other boolean options. You can use this option to instruct JPublisher to not use schema names to qualify SQL names that are referenced in wrapper classes. By default, JPublisher uses schema names to qualify SQL names. To disable the use of schema names, enter the -omit_schema_names option on the command line, but do not attempt to set -omit_schema_names=true or -omit_schema_names=false.


Note:

This chapter refers to the input file specified by the -input option as the INPUT file to distinguish from any other kinds of input files.

What JPublisher Can Publish

You can use JPublisher to publish:

  • SQL user-defined types

  • PL/SQL packages

  • Server-side Java classes

  • SQL queries or DML statements

  • Proxy classes and wrappers for Web services call-outs

  • Oracle Streams AQ

JPublisher Mappings and Mapping Categories

The following sections provide a basic overview of JPublisher mappings and mapping categories:

JPublisher Mappings for User-Defined Types and PL/SQL Types

JPublisher provides mappings from the following to Java classes:

  • User-defined SQL types

  • PL/SQL types

Representing User-Defined SQL Types Through JPublisher

You can use an Oracle-specific implementation, a standard implementation, or a generic implementation in representing user-defined SQL types, such as objects, collections, object references, and OPAQUE types, in your Java program.

Following is a summary of these three approaches:

  • Use classes that implement the Oracle-specific ORAData interface.

    JPublisher generates classes that implement the oracle.sql.ORAData interface. The ORAData interface supports SQL objects, object references, collections, and OPAQUE types in a strongly typed way. That is, for each specific object, object reference, collection, or OPAQUE type in the database, there is a corresponding Java type.

  • Use classes that implement the standard SQLData interface, as described in the JDBC specification.

    JPublisher generates classes for SQL object types that implement the java.sql.SQLData interface. When you use the SQLData interface, all object reference types are represented generically as java.sql.Ref and all collection types are represented generically as java.sql.Array. In addition, when using SQLData, there is no mechanism for representing OPAQUE types.

  • Use oracle.sql.* classes.

    You can use the oracle.sql.* classes to represent user-defined types generically. The oracle.sql.STRUCT class represents all object types, the oracle.sql.ARRAY class represents all the variable array (VARRAY) and nested table types, the oracle.sql.REF class represents all the object reference types, and the oracle.sql.OPAQUE class represents all OPAQUE types. These classes are immutable in the same way that java.lang.String is.

    Choose this option for code that processes objects, collections, references, or OPAQUE types in a generic way. Unlike classes implementing ORAData or SQLData, oracle.sql.* classes are not strongly typed.


Note:

You can create your own classes, but this is not recommended. If you create your own classes or generate classes for an inheritance hierarchy of object types, then your classes must be registered using a type map.

In addition to strong typing, JPublisher-generated classes that implement ORAData or SQLData have the following advantages:

  • The classes are customized, rather than generic. You access attributes of an object using getXXX() and setXXX() methods named after the particular attributes of the object. Note that you must explicitly update the object in the database if there are any changes to its data.

  • The classes are mutable. You can modify attributes of an object or elements of a collection. An exception is that ORAData classes representing object reference types are not mutable, because an object reference does not have any subcomponents that can be modified. You can, however, use the setValue() method of a reference object to change the database value that the reference points to.

  • You can generate Java wrapper classes that are serializable or that have the toString() method to print out the object along with its attribute values.

Compared to classes that implement SQLData, classes that implement ORAData are fundamentally more efficient, because ORAData classes avoid unnecessary conversions to native Java types.

Using Strongly Typed Object References for ORAData Implementations

For Oracle ORAData implementations, JPublisher always generates strongly typed object reference classes, in contrast to using the weakly typed oracle.sql.REF class. This is to provide greater type safety and to mirror the behavior in SQL, in which object references are strongly typed. The strongly typed classes, for example, the PersonRef class for references to the PERSON object, are wrappers for the oracle.sql.REF class.

In these strongly typed REF wrappers, a getValue() method produces an instance of the SQL object that is referenced as of an instance of the corresponding Java class. In the case of inheritance, the method produces an instance of a subclass of the corresponding Java class.

For example, if there is a PERSON object type in the database with a corresponding Person Java class, then there will also be a PersonRef Java class. The getValue() method of the PersonRef class would return a Person instance containing the data for a PERSON object in the database. In addition, JPublisher also generates a static cast() method on the PersonRef class. This permits you to convert other typed references to a PersonRef instance.

Whenever a SQL object type has an attribute that is an object reference, the Java class corresponding to the object type would have an attribute that is an instance of a Java class corresponding to the appropriate reference type. For example, if there is a PERSON object with a MANAGER REF attribute, then the corresponding Person Java class will have a ManagerRef attribute.

Using PL/SQL Types Through JPublisher

JDBC does not support PL/SQL-specific types, such as the BOOLEAN type and PL/SQL RECORD types that are used in stored procedures or functions. JPublisher provides the following workarounds for PL/SQL types:

  • JPublisher has a type map that you can use to specify the mapping for a PL/SQL type unsupported by JDBC.

  • For PL/SQL RECORD types or indexed-by tables types, you have the choice of JPublisher automatically creating a SQL object type or SQL collection type, respectively, as an intermediate step in the mapping.

With either workaround, JPublisher creates PL/SQL conversion functions or uses predefined conversion functions that are typically found in the SYS.SQLJUTL package to convert between a PL/SQL type and a corresponding SQL type. The conversion functions can be used in generated Java code that calls a stored procedure directly, or JPublisher can create a wrapper function around the PL/SQL stored procedure, where the generated Java code calls the wrapper function, which calls the conversion functions. Either way, only SQL types are exposed to JDBC.

JPublisher Mapping Categories

JPublisher offers different categories of data type mappings from SQL to Java. Each type mapping option has at least two possible values: jdbc or oracle. The -numbertypes option has two additional alternatives: objectjdbc and bigdecimal. The following sections describe these mappings categories.

JDBC Mapping

In JDBC mapping:

  • Most numeric data types are mapped to Java primitive types, such as int and float.

  • The DECIMAL and NUMBER type are mapped to the java.math.BigDecimal.

  • Large object (LOB) type and other non-numeric built-in types are mapped to the standard JDBC types, such as java.sql.Blob and java.sql.Timestamp.

For object types, JPublisher generates SQLData classes. Because predefined data types that are Oracle extensions, such as BFILE and ROWID, do not have JDBC mappings, only the oracle.sql.* mapping is supported for these types.

The Java primitive types used in the JDBC mapping do not support NULL values and do not guard against integer overflow or floating-point loss of precision. If you are using the JDBC mapping and you attempt to call an accessor method to get an attribute of a primitive type whose value is NULL, then an exception is thrown. If the primitive type is short or int, then an exception is thrown if the value is too large to fit in a short or int variable.

Object JDBC Mapping

In Object JDBC mapping, most numeric data types are mapped to Java wrapper classes, such as java.lang.Integer and java.lang.Float, and DECIMAL and NUMBER are mapped to java.math.BigDecimal. This differs from the JDBC mapping, which does not use primitive types.

Object JDBC is the default mapping for numeric types. When you use the Object JDBC mapping, all your returned values are objects. If you attempt to get an attribute whose value is NULL, then a NULL object is returned. The Java wrapper classes used in the Object JDBC mapping do not guard against integer overflow or floating-point loss of precision. If you call an accessor method to get an attribute that maps to java.lang.Integer, then an exception is thrown if the value is too large to fit.

BigDecimal Mapping

In BigDecimal mapping, all numeric data types are mapped to java.math.BigDecimal. This supports NULL values and large values.

Oracle Mapping

In Oracle mapping, the numeric, LOB, or other built-in types are mapped to classes in the oracle.sql package. For example, the DATE type is mapped to oracle.sql.DATE and all numeric types are mapped to oracle.sql.NUMBER. For object, collection, and object reference types, JPublisher generates ORAData classes.

Because the Oracle mapping uses no primitive types, it can represent a NULL value as a Java null in all cases. Also, it can represent the largest numeric values that can be stored in the database, because it uses the oracle.sql.NUMBER class for all numeric types.

JPublisher Input and Output

To publish database entities, JPublisher connects to the database and retrieves descriptions of SQL types, PL/SQL packages, or server-side Java classes that you specify on the command line or in an INPUT file. By default, JPublisher connects to the database by using the JDBC Oracle Call Interface (OCI) driver, which requires an Oracle client installation, including Oracle Net Services and required support files. If you do not have an Oracle client installation, then JPublisher can use Oracle JDBC Thin driver.

JPublisher generates a Java class for each SQL type or PL/SQL package that it translates and each server-side Java class that it processes. Generated classes include code required to read and write objects in the database. When you deploy the generated JPublisher classes, your JDBC driver installation includes all the necessary run-time files. If JPublisher generates wrapper methods for stored procedures, then the classes that it produces use the SQLJ run time during execution. In this case, you must also have the SQLJ run-time library runtime12.jar.

When you call a wrapper method on an instance of a class that was generated for a SQL object, the SQL value for the corresponding object is sent to the server along with any IN or IN OUT arguments. Then the method is invoked, and the new object value is returned to the client along with any OUT or IN OUT arguments. Note that this results in a database round trip. If the method call only performs a simple state change on the object, then there will be better performance if you write and use equivalent Java that affects the state change locally.

The number of classes that JPublisher produces depends on whether you request ORAData classes or SQLData classes.

To publish external Web services for access from inside a database, JPublisher accesses a specified Web Service Description Language (WSDL) document and directs the generation of appropriate client proxy classes. It then generates wrapper classes, as necessary, and PL/SQL wrappers to allow Web services call-outs from PL/SQL.

The following subsections provide more detail:

Input to JPublisher

You can specify input options on the command line and in a JPublisher properties file. In addition to producing Java classes for the translated entities, JPublisher writes the names of the translated objects and packages to the standard output.

You can use a file known as the JPublisher INPUT file to specify the SQL types, PL/SQL packages, or server-side Java classes that JPublisher should publish. It also controls the naming of the generated packages and classes.

To use a properties file to specify option settings, specify the name of the properties file on the command line by using the -props option. JPublisher processes a properties file as if its contents were inserted in sequence on the command line at the point of the -props option. For additional flexibility, properties files can also be SQL script files in which the JPublisher directives are embedded in SQL comments.

Output from JPublisher

This section describes JPublisher output for user-defined object types, user-defined collection types, OPAQUE types, PL/SQL packages, server-side Java classes, SQL queries or DML statements, and AQs and streams.


Note:

Be aware that when JPublisher publishes a database entity, such as a SQL type or PL/SQL package, it also generates classes for any types that are referenced by the entity. For example, if a stored procedure in a PL/SQL package that is being published uses a SQL object type as an argument, then a class will be generated to map to that SQL object type.

Java Output for User-Defined Object Types

For a user-defined object type, when you run JPublisher and request ORAData classes, JPublisher creates the following:

  • An object class that represents instances of Oracle object type in your Java program

    For each object type, JPublisher generates a type.java file for the class code. For example, JPublisher generates Employee.java for Oracle object type EMPLOYEE.

  • A stub subclass (optional)

    It is named as specified in your JPublisher settings. You can modify the generated stub subclass for custom functionality.

  • An interface for the generated class or subclass to implement (optional)

  • A related reference class for object references

    JPublisher generates a typeRef.java file for the REF class associated with the object type. For example, JPublisher generates the EmployeeRef.java file for references of Oracle object type EMPLOYEE.

  • Java classes for any object or collection or OPAQUE attributes nested directly or indirectly within the top-level object

    This is necessary so that attributes can be materialized in Java whenever an instance of the top-level class is materialized. If an attribute type, such as a SQL OPAQUE type or a PL/SQL type, has been premapped, then JPublisher uses the target Java type from the map.


Note:

For ORAData implementations, a strongly typed reference class is always generated, regardless of whether the SQL object type uses references.

If you request SQLData classes, then JPublisher does not generate the object reference class and classes for nested collection attributes or OPAQUE attributes.

Java Output for User-Defined Collection Types

When you run JPublisher for a user-defined collection type, you must request ORAData classes. JPublisher creates the following:

  • A collection class to act as a type definition that corresponds to Oracle collection type

    For each collection type JPublisher translates, it generates a type.java file. For nested tables, the generated class has methods to get and set the nested table as an entire array and to get and set individual elements of the table. JPublisher translates collection types when generating ORAData classes, but not when generating SQLData classes.

  • If the elements of the collection are objects, then a Java class for the element type and Java classes for any object or collection attributes nested directly or indirectly within the element type

    This is necessary so that object elements can be materialized in Java whenever an instance of the collection is materialized.

  • An interface that is implemented by the generated type (optional)


Note:

Unlike for object types, you do not have the option of generating user subclasses for collection types.

Java Output for OPAQUE Types

When you run JPublisher for an OPAQUE type, you must request ORAData classes. JPublisher creates a Java class that acts as a wrapper for the OPAQUE type, providing Java versions of the OPAQUE type methods as well as protected APIs to access the representation of the OPAQUE type in a subclass.

However, in most cases, Java wrapper classes for the SQL OPAQUE types are furnished by the provider of the OPAQUE types. For example, the oracle.xdb.XMLType class for the SYS.XMLTYPE SQL OPAQUE type. In such cases, ensure that the correspondence between the SQL type and the Java type is predefined to JPublisher through the type map.

Java Output for PL/SQL Packages

When you run JPublisher for a PL/SQL package, it creates a Java class with wrapper methods that invoke the stored procedures of the package on the server. IN arguments for the methods are transmitted from the client to the server, and OUT arguments and results are returned from the server to the client.

Java Output for Server-Side Java Classes and Web Services Call-Outs

When you run JPublisher for a server-side Java class used for general purposes, it creates the source code, type.java, for a client-side stub class that mirrors the server class. When you call the client-side methods, the corresponding server-side methods are called transparently.

For Web services call-outs, JPublisher typically generates wrapper classes for the server-side client proxy classes. These wrapper classes act as bridges to the corresponding PL/SQL wrappers. This is necessary to publish any proxy class instance method as a static method, because PL/SQL does not support instance methods.

Java Output for SQL Queries or DML Statements

When you run JPublisher for a SQL query or DML statement, it creates the following:

  • A Java class that implements the method that runs the SQL statement

  • A Java stub subclass, named as specified in your JPublisher settings (optional)

    You can modify this stub subclass for custom functionality.

  • A Java interface for the generated class or subclass to implement (optional)

Java Output for AQs and Streams

When you run JPublisher for an AQ or a topic, it creates the following:

  • A Java class for the queue or topic

  • A Java class for the payload type of the queue or topic

In the case of a stream, JPublisher generates a Java class for the stream. The payload is always SYS.ANYDATA, which is mapped to java.lang.Object.

PL/SQL Output

Depending on your usage, JPublisher may generate a PL/SQL package and associated PL/SQL scripts.

PL/SQL Package

JPublisher typically generates a PL/SQL package with PL/SQL code for any of the following:

  • PL/SQL call specifications for generated Java methods

  • PL/SQL conversion functions and wrapper functions to support PL/SQL types

  • PL/SQL table functions

Conversion functions, and optionally wrapper functions, are employed to map PL/SQL types used in the calling sequences of any stored procedures that JPublisher translates. The functions convert between PL/SQL types and corresponding SQL types, given that JDBC does not generally support PL/SQL types.

PL/SQL Scripts

JPublisher generates the following PL/SQL scripts:

  • A wrapper script to create the PL/SQL package and any necessary SQL types

  • A script to grant permission to run the wrapper script

  • A script to revoke permission to run the wrapper script

  • A script to drop the package and types created by the wrapper script

JPublisher Operation

This section discusses the following topics:

Overview of the Publishing Process: Generation and Use of Output

Figure 1-8 illustrates the basic steps for publishing specified SQL types, PL/SQL packages, or server-side Java classes. The steps are as follows:

  1. Run JPublisher with input from the command line, properties file, and INPUT file, as desired.

  2. JPublisher accesses the database to which it is attached to obtain definitions of SQL or PL/SQL entities that you specify for publishing.

  3. JPublisher generates .java or .sqlj source files, as appropriate, depending on whether wrapper methods are created for stored procedures.

  4. By default, JPublisher invokes the SQLJ translator, which is provided as part of JPublisher, to translate .sqlj files into .java files.

  5. For SQLJ classes, by default, the SQLJ translator invokes the Java compiler to compile.java files into.class files. For non-SQLJ classes, JPublisher invokes the Java compiler.

  6. JPublisher generates PL/SQL wrappers and scripts, as appropriate, in addition to the .class files. There is a script to create the PL/SQL wrapper package and any necessary SQL types, such as types to map to PL/SQL types, a script to drop these entities, and scripts to grant or revoke required privileges.

  7. In the case of proxy class generation through the -proxywsdl or -proxyclasses option, JPublisher can load generated PL/SQL wrappers and scripts into the database to which it is connected for execution in the database PL/SQL engine.

  8. By default, JPublisher loads generated Java classes for Web services call-outs into the database to which it is connected, for execution in Oracle JVM. JPublisher-generated classes other than those for Web services call-outs typically execute in a client or middle-tier JVM. You may also have your own classes, such as subclasses of JPublisher-generated classes, that would typically execute in a client or middle-tier JVM.

Figure 1-8 Translating and Using JPublisher-Generated Code

JPublisher operational flow. Link for description follows.
Description of "Figure 1-8 Translating and Using JPublisher-Generated Code"

JPublisher Command-Line Syntax

On most operating systems, you can start JPublisher from the command line by typing jpub followed by a series of option settings, as follows:

% jpub -option1=value1 -option2=value2 ...

JPublisher responds by connecting to the database and obtaining the declarations of the types or packages you specify. It then generates one or more custom Java classes and writes the names of the translated object types or PL/SQL packages to the standard output.

Here is an example of a single wraparound command that invokes JPublisher:

% jpub -user=scott -input=demoin -numbertypes=oracle -usertypes=oracle -dir=demo -d=demo -package=corp
Enter scott password: password

Enter the command on the command line, allowing it to wrap as necessary. This command directs JPublisher to connect to the database with the user name scott and password TIGER and to translate data types to Java classes, based on instructions in the INPUT file demoin. The -numbertypes=oracle option directs JPublisher to map object attribute types to Java classes supplied by Oracle, and the -usertypes=oracle option directs JPublisher to generate Oracle-specific ORAData classes. JPublisher places the classes that it generates in the corp package under the demo directory.


Note:

This chapter refers to the input file specified by the -input option as the INPUT file to distinguish from any other kinds of input files.

JPublisher also supports specification of .java files, or .sqlj files, if you are using SQLJ source files directly, on the JPublisher command line. In addition to any JPublisher-generated files, the specified files are translated and compiled. For example:

% jpub ...options... Myclass.java

Note:

  • No spaces are permitted around the equal sign (=) on the JPublisher command line.

  • If you run JPublisher without any command-line input, then it displays an option list and then terminates.


Sample JPublisher Translation

This section provides a sample JPublisher translation of a user-defined object type. At this point, do not worry about the details of the code JPublisher generates. You can find more information about JPublisher input and output files, options, data type mappings, and translation later in this manual.


Note:

For more examples, go to ORACLE_HOME/sqlj/demo/jpub in your Oracle Database installation.

Create the object type EMPLOYEE:

CREATE TYPE employee AS OBJECT
(
    name       VARCHAR2(30),
    empno      INTEGER,
    deptno     NUMBER,
    hiredate   DATE,
    salary     REAL
);

The INTEGER, NUMBER, and REAL types are all stored in the database as NUMBER types, but after translation they have different representations in the Java program, based on your setting of the -numbertypes option.

Assume JPublisher translates the types according to the following command entered on the command line:

% jpub -user=scott -dir=demo -numbertypes=objectjdbc -builtintypes=jdbc -package=corp -case=mixed -sql=Employee
Enter scott password: password

Note that JPublisher generates a non-SQLJ class, because the EMPLOYEE object type does not define any methods.

Because -dir=demo and -package=corp are specified on the JPublisher command line, the translated class Employee is written to Employee.java at the following location:

./demo/corp/Employee.java

Note:

This location is specific for a UNIX system.

The Employee.java class file would contain the code shown in the following example.


Note:

The details of the code JPublisher generates are subject to change. In particular, non-public methods, non-public fields, and all method bodies may be generated differently.

package corp;

import java.sql.SQLException;
import java.sql.Connection;
import oracle.jdbc.OracleTypes;
import oracle.sql.ORAData;
import oracle.sql.ORADataFactory;
import oracle.sql.Datum;
import oracle.sql.STRUCT;
import oracle.jpub.runtime.MutableStruct;

public class Employee implements ORAData, ORADataFactory
{
  public static final String _SQL_NAME = "SCOTT.EMPLOYEE";
  public static final int _SQL_TYPECODE = OracleTypes.STRUCT;

  protected MutableStruct _struct;

  private static int[] _sqlType =  { 12,4,2,91,7 };
  private static ORADataFactory[] _factory = new ORADataFactory[5];
  protected static final Employee _EmployeeFactory = new Employee(false);

  public static ORADataFactory getORADataFactory()
  { return _EmployeeFactory; }

  /* constructor */
  protected Employee(boolean init)
  { if(init) _struct = new MutableStruct(new Object[5], _sqlType, _factory); }
  public Employee()
  { this(true); }
  public Employee(String name, Integer empno, java.math.BigDecimal deptno,
                  java.sql.Timestamp hiredate, Float salary) 
   throws SQLException
  { this(true);
    setName(name);
    setEmpno(empno);
    setDeptno(deptno);
    setHiredate(hiredate);
    setSalary(salary);
  }

  /* ORAData interface */
  public Datum toDatum(Connection c) throws SQLException
  {
    return _struct.toDatum(c, _SQL_NAME);
  }

  /* ORADataFactory interface */
  public ORAData create(Datum d, int sqlType) throws SQLException
  { return create(null, d, sqlType); }
  protected ORAData create(Employee o, Datum d, int sqlType) throws SQLException
  {
    if (d == null) return null; 
    if (o == null) o = new Employee(false);
    o._struct = new MutableStruct((STRUCT) d, _sqlType, _factory);
    return o;
  }
  /* accessor methods */
  public String getName() throws SQLException
  { return (String) _struct.getAttribute(0); }

  public void setName(String name) throws SQLException
  { _struct.setAttribute(0, name); }

  public Integer getEmpno() throws SQLException
  { return (Integer) _struct.getAttribute(1); }

  public void setEmpno(Integer empno) throws SQLException
  { _struct.setAttribute(1, empno); }

  public java.math.BigDecimal getDeptno() throws SQLException
  { return (java.math.BigDecimal) _struct.getAttribute(2); }

  public void setDeptno(java.math.BigDecimal deptno) throws SQLException
  { _struct.setAttribute(2, deptno); }

  public java.sql.Timestamp getHiredate() throws SQLException
  { return (java.sql.Timestamp) _struct.getAttribute(3); }

  public void setHiredate(java.sql.Timestamp hiredate) throws SQLException
  { _struct.setAttribute(3, hiredate); }

  public Float getSalary() throws SQLException
  { return (Float) _struct.getAttribute(4); }

  public void setSalary(Float salary) throws SQLException
  { _struct.setAttribute(4, salary); }

}

Code Generation Notes 

  • JPublisher also generates object constructors based on the object attributes.

  • Additional private or public methods may be generated with other option settings. For example, the -serializable=true setting results in the object wrapper class implementing the interface java.io.Serializable and in the generation of private writeObject() and readObject() methods. In addition, the -tostring=true setting results in the generation of a public toString() method.

  • There is a protected _struct field in JPublisher-generated code for SQL object types. This is an instance of the oracle.jpub.runtime.MutableStruct internal class. It contains the data in original SQL format. In general, you should never reference this field directly. Instead, use the -methods=always or -methods=named setting, as necessary, to ensure that JPublisher produces setFrom() and setValueFrom() methods, and then use these methods when extending a class.

  • JPublisher generates SQLJ classes instead of non-SQLJ classes in the following circumstances:

    • The SQL object being published has methods, and the -methods=false setting is not specified.

    • A PL/SQL package, stored procedure, query, or DML statement is published, and the -methods=false setting is not specified.

    In addition:

    • If a SQLJ class is created for a type definition, then a SQLJ class is also created for the corresponding REF definition.

    • If a SQLJ class is created for a base class, then SQLJ classes are also created for any subclasses.

    This means that, in a backward-compatibility mode, JPublisher generates .sqlj files instead of .java files.

JPublisher also generates an EmployeeRef.java class. The source code is as follows:

package corp;

import java.sql.SQLException;
import java.sql.Connection;
import oracle.jdbc.OracleTypes;
import oracle.sql.ORAData;
import oracle.sql.ORADataFactory;
import oracle.sql.Datum;
import oracle.sql.REF;
import oracle.sql.STRUCT;

public class EmployeeRef implements ORAData, ORADataFactory
{
  public static final String _SQL_BASETYPE = "SCOTT.EMPLOYEE";
  public static final int _SQL_TYPECODE = OracleTypes.REF;

  REF _ref;

private static final EmployeeRef _EmployeeRefFactory = new EmployeeRef();

  public static ORADataFactory getORADataFactory()
  { return _EmployeeRefFactory; }
  /* constructor */
  public EmployeeRef()
  {
  }

  /* ORAData interface */
  public Datum toDatum(Connection c) throws SQLException
  {
    return _ref;
  }

  /* ORADataFactory interface */
  public ORAData create(Datum d, int sqlType) throws SQLException
  {
    if (d == null) return null;
    EmployeeRef r = new EmployeeRef();
    r._ref = (REF) d;
    return r;
  }

  public static EmployeeRef cast(ORAData o) throws SQLException
  {
     if (o == null) return null;
     try { return (EmployeeRef) getORADataFactory().create(o.toDatum(null),
           OracleTypes.REF); }
     catch (Exception exn)
     { throw new SQLException("Unable to convert "+o.getClass().getName()+" to
             EmployeeRef: "+exn.toString()); }
  }

  public Employee getValue() throws SQLException
  {
     return (Employee) Employee.getORADataFactory().create(
       _ref.getSTRUCT(), OracleTypes.REF);
  }

  public void setValue(Employee c) throws SQLException
  {
    _ref.setValue((STRUCT) c.toDatum(_ref.getJavaSqlConnection()));
  }
}

Note:

JPublisher also generates a public static cast() method to cast from other strongly typed references into a strongly typed reference instance.

PK_mPmPK.AOEBPS/codeex.htmOS Generated Code Examples

A Generated Code Examples

This appendix contains generated code examples that are explained in the following sections:

Generated Code: SQL Statement

This section contains a generated code example for a specified SQL statement, related to the discussion in "Declaration of SQL Statements to Translate".

The example is for the following sample settings of the -sqlstatement option:

-sqlstatement.class=MySqlStatements
-sqlstatement.getEmp="select ename from emp
                      where ename=:{myname VARCHAR}"
-sqlstatement.return=both

Note that for this example:

  • Code comments show #sql statements that correspond to the translated code shown.

  • The getEmpBeans() method, generated because of the -sqlstatement.return=both setting, returns an array of JavaBeans. Each element represents a row of the result set. The GetEmpRow class is defined for this purpose.

  • JPublisher generates a SQLJ class. The result set is mapped to a SQLJ iterator.

(For UPDATE, INSERT, or DELETE statements, code is generated both with and without batching for array binds.)

The translated SQLJ code that JPublisher would produce is:

public class MySqlStatements_getEmpRow 
{ 
 
  /* connection management */ 
 
  /* constructors */ 
  public MySqlStatements_getEmpRow() 
  { } 
 
  public String getEname() throws java.sql.SQLException 
  { return ename; } 
 
  public void setEname(String ename) throws java.sql.SQLException 
  { this.ename = ename; } 
 
  private String ename; 
} 
 
/*@lineinfo:filename=MySqlStatements*/
/*@lineinfo:user-code*/
/*@lineinfo:1^1*/
import java.sql.SQLException; 
import sqlj.runtime.ref.DefaultContext; 
import sqlj.runtime.ConnectionContext; 
import java.sql.Connection; 
import oracle.sql.*; 

public class MySqlStatements 
{ 

  /* connection management */ 
  protected DefaultContext __tx = null; 
  protected Connection __onn = null; 
  public void setConnectionContext(DefaultContext ctx) throws SQLException 
  { release(); __tx = ctx; } 
  public DefaultContext getConnectionContext() throws SQLException 
  { if (__tx==null) 
    { __tx = (__onn==null) ? DefaultContext.getDefaultContext() : 
                             new DefaultContext(__onn); } 
    return __tx; 
  }; 
  public Connection getConnection() throws SQLException 
  { return (__onn==null) ? ((__tx==null) ? null : __tx.getConnection()) : __onn; } 
  public void release() throws SQLException 
  { if (__tx!=null && __onn!=null) __tx.close(ConnectionContext.KEEP_CONNECTION); 
    __onn = null; __tx = null; 
  } 
 
  /* constructors */ 
  public MySqlStatements() throws SQLException 
  { __tx = DefaultContext.getDefaultContext(); } 
  public MySqlStatements(DefaultContext c) throws SQLException 
  { __tx = c; } 
  public MySqlStatements(Connection c) throws SQLException 
  {__onn = c; __tx = new DefaultContext(c); } 
/*@lineinfo:generated-code*/
/*@lineinfo:36^1*/ 

//  ************************************************************ 
//  SQLJ iterator declaration: 
//  ************************************************************ 

public static class getEmpIterator 
    extends sqlj.runtime.ref.ResultSetIterImpl 
    implements sqlj.runtime.NamedIterator 
{ 
  public getEmpIterator(sqlj.runtime.profile.RTResultSet resultSet) 
    throws java.sql.SQLException 
  { 
    super(resultSet); 
    enameNdx = findColumn("ename"); 
    m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet(); 
  } 
  private oracle.jdbc.OracleResultSet m_rs; 
  public String ename() 
    throws java.sql.SQLException 
  { 
    return m_rs.getString(enameNdx); 
  } 
  private int enameNdx; 
} 
 
//  ************************************************************ 
 
/*@lineinfo:user-code*/
/*@lineinfo:36^56*/ 
 
  public MySqlStatements_getEmpRow[] getEmpBeans (String myname) 
         throws SQLException 
  { 
    getEmpIterator iter; 
    /*@lineinfo:generated-code*/
    /*@lineinfo:43^5*/ 
//  ************************************************************ 
//  #sql [getConnectionContext()] 
//                     iter = { select ename from emp where ename=:myname }; 
//  ************************************************************ 
{ 
  // declare temps 
  oracle.jdbc.OraclePreparedStatement __sJT_st = null; 
  sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext(); 
  if (__sJT_c c==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX(); 
  sqlj.runtime.ExecutionContext.OracleContext __sJT_ec = 
        ((__sJT_cc.getExecutionContext()==null) ? 
        sqlj.runtime.ExecutionContext.raiseNullExecCtx() : 
        __sJT_cc.getExecutionContext().getOracleContext()); 
  try { 
   String theSqlTS = "select ename from emp where ename= :1"; 
   __sJT_st = __sJT_ec.prepareOracleStatement
                    (__sJT_cc,"0MySqlStatements",theSqlTS); 
   // set IN parameters 
   __sJT_st.setString(1,myname); 
   // execute query 
   iter = new MySqlStatements.getEmpIterator
             (new sqlj.runtime.ref.OraRTResultSet 
             (__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MySqlStatements",null)); 
  } finally { __sJT_ec.oracleCloseQuery(); } 
} 

//  ************************************************************ 
 
/*@lineinfo:user-code*/
/*@lineinfo:43^84*/ 
    java.util.Vector v = new java.util.Vector(); 
    while (iter.next()) 
    { 
       MySqlStatements_getEmpRow r = new MySqlStatements_getEmpRow(); 
       r.setEname(iter.ename()); 
       v.addElement(r); 
    } 
    MySqlStatements_getEmpRow[] __jPt_result = 
          new MySqlStatements_getEmpRow[v.size()]; 
    for (int i = 0; i < v.size(); i++) 
       __jPt_result[i] = (MySqlStatements_getEmpRow) v.elementAt(i); 
    return __jPt_result; 
  } 
 
  public java.sql.ResultSet getEmp (String myname) 
          throws SQLException 
  { 
    sqlj.runtime.ResultSetIterator iter; 
    /*@lineinfo:generated-code*/
    /*@lineinfo:62^5*/ 
 
//  ************************************************************ 
//  #sql [getConnectionContext()] iter = 
//                     { select ename from emp where ename=:myname }; 
//  ************************************************************ 
 
{ 
  // declare temps 
  oracle.jdbc.OraclePreparedStatement __sJT_st = null; 
  sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext(); 
  if (__sJT_c c==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX(); 
  sqlj.runtime.ExecutionContext.OracleContext __sJT_ec = 
              ((__sJT_cc.getExecutionContext()==null) ?
              sqlj.runtime.ExecutionContext.raiseNullExecCtx() :
              __sJT_cc.getExecutionContext().getOracleContext()); 
  try { 
   String theSqlTS = "select ename from emp where ename= :1"; 
   __sJT_st = __sJT_ec.prepareOracleStatement
                 (__sJT_cc,"1MySqlStatements",theSqlTS); 
   // set IN parameters 
   __sJT_st.setString(1,myname); 
   // execute query 
   iter = new sqlj.runtime.ref.ResultSetIterImpl
         (new sqlj.runtime.ref.OraRTResultSet
         (__sJT_ec.oracleExecuteQuery(),__sJT_st,"1MySqlStatements",null)); 
  } finally { __sJT_ec.oracleCloseQuery(); } 
} 
 
//  ************************************************************ 
 
/*@lineinfo:user-code*/
/*@lineinfo:62^84*/ 
    java.sql.ResultSet __jPt_result = iter.getResultSet(); 
    return __jPt_result; 
  } 
}
/*@lineinfo:generated-code*/ 

Generated Code: Server-Side Java Call-in

JPublisher supports the calling of Java methods in the database from a Java client outside the database. In Oracle Database 11g release 2 (11.2), the JPublisher -dbjava option is used for server-side Java invocation. Unlike the -java option, the -dbjava option supports non-serializable parameter or return types.

This section describes an example of server-side Java invocation. This section comprises:


Note:

You must have the 11g Release 2 (11.2) version of Oracle Database.

The Source Files

In this example, there are three source files to be created. These are:

  • A server-side Java class

  • A JavaBean used in the server-side Java class

  • An entry point Java class that invokes the methods in the published classes

The source code of these files is as follows:

Server-Side Java Class

The source code of the server-side Java class, Callin2.java, is as follows:

public class Callin2
{
  public static int testInt(int i)
  { return i; }
  public static int[] testInt(int[] i)
  { return i; }
  public static int[][] testInt(int[][] i)
  { return i; }
  public static Integer testInteger(Integer i)
  { return i; }
  public static Integer[] testInteger(Integer[] i)
  { return i; }
  public static Integer[][] testInteger(Integer[][] i)
  { return i; }

  // Test ORAData
  public static oracle.sql.NUMBER testNum(oracle.sql.NUMBER num)
  { return num; }
  public oracle.sql.NUMBER testInstNum(oracle.sql.NUMBER num)
  { return num; }
  public oracle.sql.NUMBER[] testInstNum(oracle.sql.NUMBER[] num)
  { return num; }
  public oracle.sql.NUMBER[][] testInstNum(oracle.sql.NUMBER[][] num)
  { return num; }

  // Test Beans
  public static Callin2Bean testBean()
  { return new Callin2Bean("mybean", new int[]{1,2}); }
  public static Callin2Bean testBean (Callin2Bean b)
  { return b; }
  public static Callin2Bean[] testBean (Callin2Bean[] b)
  { return b; }
  public static Callin2Bean[][] testBean (Callin2Bean[][] b)
  { return b; }
  public Callin2Bean testInstBean (Callin2Bean b)
  { return b; }
  public Callin2Bean[] testInstBean (Callin2Bean[] b)
  { return b; }
  public Callin2Bean[][] testInstBean (Callin2Bean[][] b)
  { return b; }

  // Test Serializable
  public static java.io.Serializable testSer()
  { return new String("test Serializable"); }
  public static java.io.Serializable testSer (java.io.Serializable b)
  { return b; }
  public static java.io.Serializable[] testSer (java.io.Serializable[] b)
  { return b; }
  public static java.io.Serializable[][] testSer (java.io.Serializable[][] b)
  { return b; }
  public java.io.Serializable testInstSer (java.io.Serializable b)
  { return b; }
  public java.io.Serializable[] testInstSer (java.io.Serializable[] b)
  { return b; }
  public java.io.Serializable[][] testInstSer (java.io.Serializable[][] b)
  { return b; }
}

JavaBean Used in the Server-Side Java Class

The source code of the JavaBean, Callin2Bean.java, used in the server-side Java class, Callin2.java, is as follows:

public class Callin2Bean 
{
  private String stringValue = "";
  private int[] numberValue;
  
  public Callin2Bean ()
  {
  }
 
  public Callin2Bean(String string_val, int[] number_val)
  {
    stringValue = string_val;
    numberValue = number_val;
  }
 
  public void setStringValue(String string_val)
  {
    stringValue = string_val;
  }
 
  public String getStringValue ()
  {
    return stringValue;
  }
 
  public void setNumberValue (int[] number_val)
  {
    numberValue = number_val;
  }
 
  public int[] getNumberValue ()
  {
    return numberValue;
  }
 
  public boolean equals(Object other)
  {
    if(other instanceof Callin2Bean)
    {
      Callin2Bean my_bean = (Callin2Bean)other;
      if ( stringValue.equals(my_bean.getStringValue()) && compareIntArray(numberValue, my_bean.getNumberValue()) )
      {
        return true;
      }
    }
    return false;
  }
 
  private boolean compareIntArray(int[] b1, int[] b2)
  {
    try
    { 
      if ((b1 == null) && (b2 == null))
        return true;
 
      if ((b1.length == 0) && (b2.length == 0))
        return true;
 
      if (b1.length != b2.length)
        return false;
      int x;
      for (x = 0; x < b1.length; x++)
      {
        if (b1[x] != b2[x])
          return false;
      }
      return true;
    }
    catch (Exception e)
    {
      return false;
    }
  }
}

Entry Point Java Class

The TestCallin2.java is the entry point Java class for this example. This class invokes the methods in the published class. The source code of the TestCallin2.java file is as follows:

public class TestCallin2
{
  public static void main(String[] args) throws Exception
  {
    java.sql.DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
    oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection) 
    //java.sql.DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:lsqlj1", "scott", "tiger");
    java.sql.DriverManager.getConnection("jdbc:oracle:oci8:@", "scott", "tiger");
 
   Callin2Client tkpu = new Callin2Client (conn);
 
   System.out.println("testInstNum() returned " + tkpu.testinstnum(new java.math.BigDecimal(1999)));
 
   TblNumber na = new TblNumber(new java.math.BigDecimal[]{new java.math.BigDecimal(2999)});
   System.out.println("testInstNum([]) returned " +
   tkpu.testinstnum(na).getArray()[0]);
 
   ObjCallin2bean mb = new ObjCallin2bean("mybean", na);
   System.out.println("testCallin2Bean() returned " + tkpu.testbean(mb).getStringValue());
   System.out.println("testCallin2Bean([]) returned " + 
tkpu.testbean(new TblObjCallin2bean(new ObjCallin2bean[]{mb})).getArray()[0].getStringValue());
 
   java.io.Serializable s = new java.util.Hashtable();
   ((java.util.Hashtable) s).put("bush", "cheny");
   ((java.util.Hashtable) s).put("kerry", "dean");
   java.io.Serializable[] s1 = new java.io.Serializable[]{s};
   java.io.Serializable[][] s2 = new java.io.Serializable[][]{s1};
   System.out.println("testSer() returned " + ((java.util.Hashtable) tkpu.testser(s)).get("kerry")); 
   System.out.println("testSer([]) returned " + ((java.util.Hashtable) tkpu.testser0(s1)[0]).get("kerry")); 
   System.out.println("testSer([][]) returned " + ((java.util.Hashtable) tkpu.testser1(s2)[0][0]).get("kerry")); 
  }
}

Note:

If you are connecting to the database using the JDBC Thin driver, then you must uncomment the first call to the getConnection() method in the preceding code and comment the second call to the getConnection() method, which includes a connect statement for an Oracle Call Interface (OCI) driver.

Publishing Server-Side Java Class

After you have created the required source files, you must publish these files. To publish the server-side Java classes, you must first load these files on to the database. Ensure that you load both Callin2.java and Callin2Bean.java. The command for loading the files is:

% loadjava -u scott -r -v -f Callin2.java Callin2Bean.java
Password: password

To publish these files, issue the following command:

% jpub -u scott -sysuser=sys/sys_password -dbjava=Callin2:Callin2Client -dir=tmp
Enter scott password: password

The JPublisher output is:

tmp/Callin2JPub.java
tmp/plsql_wrapper.sql
tmp/plsql_dropper.sql
SCOTT.TBL_NUMBER
SCOTT.TBL_TBL_NUMBER
SCOTT.OBJ_CALLIN2BEAN
SCOTT.TBL_OBJ_CALLIN2BEAN
SCOTT.TBL_TBL_OBJ_CALLI
SCOTT.JPUB_PLSQL_WRAPPER
Executing tmp/plsql_dropper.sql
Executing tmp/plsql_wrapper.sql
Loading Callin2JPub.java

The Generated Files

When you publish the server-side Java classes JPublisher generates a few Java classes and PL/SQL scripts. Some of these files are:

  • Callin2JPub.java

    This is the server-side Java wrapper class for Callin2.java.

  • Callin2Client.java

    This is the client-side Java class.

  • plsql_wrapper.sql

    This is the PL/SQL wrapper for the server-side Java class.

  • plsql_dropper.sql

    This is the PL/SQL script dropping the PL/SQL wrapper.

The other files generated by JPublisher are as follows:

  • TblNumber.java

    A client-side wrapper generated for int[].

  • TblTblNumber.java

    A client-side wrapper generated for int[][].

  • ObjCallin2bean.java

    A client-side wrapper generated for the server-side class Callin2Bean.

  • ObjCallin2beanRef.java

    A client-side wrapper generated for the server-side class Callin2Bean, used as a REF column in a table. This file is generated, but not used in the call-in scenario.

  • TblObjCallin2bean.java

    A client-side wrapper generated for Callin2Bean[].

  • TblTblObjCalli.java

    A client-side wrapper generated for Callin2Bean[][].

Testing the Published Files

After the files have been published, you can test the published classes by issuing the following commands:

% javac -classpath tmp:${CLASSPATH} -d tmp TestCallin2.java
% java -classpath tmp:${CLASSPATH} TestCallin2
PKUnwTSOSPK.AOEBPS/datamap.htm Data Type and Java-to-Java Type Mappings

3 Data Type and Java-to-Java Type Mappings

This chapter discusses the JPublisher support for data type mapping, including a section on JPublisher styles and style files for Java-to-Java type mappings. These style files are primarily used to provide Web services support. The chapter contains the following sections:

JPublisher Data Type Mappings

This section covers the JPublisher functionality for mapping from SQL and PL/SQL to Java in the following topics:

Overview of JPublisher Data Type Mappings

When you use the -builtintypes, -lobtypes, -numbertypes, and -usertypes type mapping options, you can specify one of the following settings for data type mappings:

  • oracle

  • jdbc

  • objectjdbc

  • bigdecimal


Note:

The objectjdbc and bigdecimal settings are for the -numbertypes options only.

These mappings affect the argument and result types that JPublisher uses in the methods it generates.

The class that JPublisher generates for an object type has the getXXX() and setXXX() accessor methods for the object attributes. The class that JPublisher generates for a VARRAY or nested table type has the getXXX() and setXXX() methods, which access the elements of the array or nested table. When generation of wrapper methods is enabled, the class that JPublisher generates for an object type or PL/SQL package has wrapper methods. These wrapper methods invoke server methods, or stored procedures, of the object type or package. The mapping options control the argument and result types that these methods use.

The Java Database Connectivity (JDBC) and Object JDBC mappings use familiar Java types that can be manipulated using standard Java operations. The Oracle mapping is the most efficient mapping. The oracle.sql types match Oracle internal data types as closely as possible so that little or no data conversion is required between the Java and SQL formats. You do not lose any information and have greater flexibility in how you process and unpack the data. If you are manipulating data or moving data within the database, then Oracle mappings for standard SQL types are the most convenient representations. For example, performing SELECT and INSERT operations from one existing table to another. When data format conversion is necessary, you can use methods in the oracle.sql.* classes to convert to Java native types.

SQL and PL/SQL Mappings to Oracle and JDBC Types

Table 3-1 lists the mappings from SQL and PL/SQL data types to Java types. You can use all the supported data types listed in this table as argument or result types for PL/SQL methods. You can also use a subset of the data types as object attribute types.

The SQL and PL/SQL Data Type column contains all possible data types.

Oracle Mapping column lists the corresponding Java types that JPublisher uses when all the type mapping options are set to oracle. These types are found in the oracle.sql package provided by Oracle and are designed to minimize the overhead incurred when converting Oracle data types to Java types.


See Also:

Oracle Database JDBC Developer's Guide for more information about the oracle.sql package

The JDBC Mapping column lists the corresponding Java types that JPublisher uses when all the type mapping options are set to jdbc. For standard SQL data types, JPublisher uses Java types specified in the JDBC specification. For SQL data types that are Oracle extensions, JPublisher uses the oracle.sql.* types. When you set the -numbertypes option to objectjdbc, the corresponding types are the same as in the JDBC Mapping column, except that primitive Java types, such as int, are replaced with their object counterparts, such as java.lang.Integer.


Note:

Type correspondences explicitly defined in the JPublisher type map, such as PL/SQL BOOLEAN to SQL NUMBER to Java boolean, are not affected by the mapping option settings.

A few data types are not directly supported by JPublisher, in particular those types that pertain only to PL/SQL. You can overcome these limitations by providing equivalent SQL and Java types, as well as PL/SQL conversion functions between PL/SQL and SQL representations. The annotations and subsequent sections explain these conversions further.

Table 3-1 SQL and PL/SQL Data Type to Oracle and JDBC Mapping Classes

SQL and PL/SQL Data TypeOracle MappingJDBC Mapping

CHAR, CHARACTER, LONG, STRING, VARCHAR, VARCHAR2

oracle.sql.CHAR

java.lang.String

NCHAR, NVARCHAR2

oracle.sql.NCHAR (note 1)

oracle.sql.NString (note 1)

NCLOB

oracle.sql.NCLOB (note 1)

oracle.sql.NCLOB (note 1)

RAW, LONG RAW

oracle.sql.RAW

byte[]

BINARY_INTEGER, NATURAL, NATURALN, PLS_INTEGER, POSITIVE, POSITIVEN, SIGNTYPE, INT, INTEGER

oracle.sql.NUMBER

int

DEC, DECIMAL, NUMBER, NUMERIC

oracle.sql.NUMBER

java.math.BigDecimal

DOUBLE PRECISION, FLOAT

oracle.sql.NUMBER

double

SMALLINT

oracle.sql.NUMBER

int

REAL

oracle.sql.NUMBER

float

DATE

oracle.sql.DATE

java.sql.Timestamp

TIMESTAMP

TIMESTAMP WITH TZ

TIMESTAMP WITH LOCAL TZ

oracle.sql.TIMESTAMP

oracle.sql.TIMESTAMPTZ

oracle.sql.TIMESTAMPLTZ

java.sql.Timestamp

INTERVAL YEAR TO MONTH

INTERVAL DAY TO SECOND

String (note 2)

String (note 2)

ROWID, UROWID

oracle.sql.ROWID

oracle.sql.ROWID

BOOLEAN

boolean (note 3)

boolean (note 3)

CLOB

oracle.sql.CLOB

java.sql.Clob

BLOB

oracle.sql.BLOB

java.sql.Blob

BFILE

oracle.sql.BFILE

oracle.sql.BFILE

Object types

Generated class

Generated class

SQLJ object types

Java class defined at type creation

Java class defined at type creation

OPAQUE types

Generated or predefined class (note 4)

Generated or predefined class (note 4)

RECORD types

Through mapping to SQL object type (note 5)

Through mapping to SQL object type (note 5)

Nested table, VARRAY

Generated class implemented using oracle.sql.ARRAY

java.sql.Array

Reference to object type

Generated class implemented using oracle.sql.REF

java.sql.Ref

REF CURSOR

java.sql.ResultSet

java.sql.ResultSet

Index-by tables

Through mapping to SQL collection (note 6)

Through mapping to SQL collection (note 6)

Scalar (numeric or character)

Index-by tables

Through mapping to Java array (note 7)

Through mapping to Java array (note 7)

User-defined subtypes

Same as for base type

Same as for base type


Data Type Mapping Notes The following notes correspond to the entries in the preceding table:

  1. The Java classes oracle.sql.NCHAR, oracle.sql.NCLOB, and oracle.sql.NString are not part of JDBC but are distributed with the JPublisher run time. JPublisher uses these classes to represent the NCHAR form of use of the corresponding classes, oracle.sql.CHAR, oracle.sql.CLOB, and java.lang.String.

  2. Mappings of SQL INTERVAL types to the Java String type are defined in the JPublisher default type map. Functions from the SYS.SQLJUTL package are used for the conversions.

  3. Mapping of PL/SQL BOOLEAN to SQL NUMBER and Java boolean is defined in the default JPublisher type map. This process uses conversion functions from the SYS.SQLJUTL package.

  4. Mapping of the SYS.XMLTYPE SQL OPAQUE type to the oracle.xdb.XMLType Java class is defined in the default JPublisher type map. For other OPAQUE types, the vendor typically provides a corresponding Java class. In this case, you must specify a JPublisher type map entry that defines the correspondence between the SQL OPAQUE type and the corresponding Java wrapper class. If JPublisher encounters an OPAQUE type that does not have a type map entry, then it generates a Java wrapper class for that OPAQUE type.

  5. To support a PL/SQL RECORD type, JPublisher maps the RECORD type to a SQL object type and then to a Java type corresponding to the SQL object type. JPublisher generates two SQL scripts. One script is to create the SQL object type and to create a PL/SQL package containing the conversion functions between the SQL type and the RECORD type. The other script is used to drop the SQL type and the PL/SQL package created by the first script.

  6. To support a PL/SQL index-by table type, JPublisher first maps the index-by table type into a SQL collection type and then maps it into a Java class corresponding to that SQL collection type. JPublisher generates two SQL scripts. One to create the SQL collection type and to create a PL/SQL package containing conversion functions between the SQL collection type and the index-by table type. The other to drop the collection type and the PL/SQL package created by the first script.

  7. If you use the JDBC driver to call PL/SQL stored procedures or object methods, then you have direct support for scalar index-by tables, also known as PL/SQL TABLE types. In this case, you must use a type map entry for JPublisher that specifies the PL/SQL scalar index-by table type and a corresponding Java array type. JPublisher can then automatically publish PL/SQL or object method signatures that use this scalar index-by type.

JPublisher User Type Map and Default Type Map

JPublisher has a user type map, which is controlled by the -typemap and -addtypemap options and starts out empty. It also has a default type map, which is controlled by the -defaulttypemap and -adddefaulttypemap options and starts with entries such as the following:

jpub.defaulttypemap=SYS.XMLTYPE:oracle.xdb.XMLType
jpub.adddefaulttypemap=BOOLEAN:boolean:INTEGER:
SYS.SQLJUTL.INT2BOOL:SYS.SQLJUTL.BOOL2INT
jpub.adddefaulttypemap=INTERVAL DAY TO SECOND:String:CHAR:
SYS.SQLJUTL.CHAR2IDS:SYS.SQLJUTL.IDS2CHAR
jpub.adddefaulttypemap=INTERVAL YEAR TO MONTH:String:CHAR:
SYS.SQLJUTL.CHAR2IYM:SYS.SQLJUTL.IYM2CHAR

These commands, which include some wraparound lines, indicate mappings between PL/SQL types, Java types, and SQL types. Where applicable, they also specify conversion functions to convert between PL/SQL types and SQL types.


See Also:

"Type Map Options"

JPublisher checks the default type map first. If you attempt in the user type map to redefine a mapping that is in the default type map, JPublisher generates a warning message and ignores the redefinition. Similarly, attempts to add mappings through -adddefaulttypemap or -addtypemap settings that conflict with previous mappings are ignored and generate warnings.

There are typically two scenarios for using the type maps:

  • Specify type mappings for PL/SQL data types that are unsupported by JDBC.

  • Avoid regenerating a Java class to map to a user-defined type. For example, assume you have a user-defined SQL object type, STUDENT, and have already generated a Student class to map to it. If you specify the STUDENT:Student mapping in the user type map, then JPublisher finds the Student class and uses it for mapping without regenerating it.

To use custom mappings, it is recommended that you clear the default type map, as follows:

-defaulttypemap=

Then use the -addtypemap option to put any required mappings into the user type map.

The predefined default type map defines a correspondence between the SYS.XMLTYPE SQL OPAQUE type and the oracle.xdb.XMLType Java wrapper class. In addition, it maps the PL/SQL BOOLEAN type to the Java boolean type and the SQL INTEGER type through two conversion functions defined in the SYS.SQLJUTL package. Also, the default type map provides mappings between the SQL INTERVAL type and the Java String type.

However, you may prefer mapping the PL/SQL BOOLEAN type to the Java object type Boolean to capture the SQL NULL values in addition to the true and false values. You can accomplish this by resetting the default type map, as shown by the following:

-defaulttypemap=BOOLEAN:Boolean:INTEGER:SYS.SQLJUTL.INT2BOOL:SYS.SQLJUTL.BOOL2INT

This changes the designated Java type from boolean to Boolean, as well as eliminating any other existing default type map entries. The rest of the conversion remains valid.

Example: Using the Type Map to Avoid Regeneration The following example uses the JPublisher type map to avoid the mapping of regenerated Java classes. Assume the following type declarations, noting that the CITY type is an attribute of the TRIP type:

SQL> CREATE TYPE city AS OBJECT (name VARCHAR2(20), state VARCHAR2(10));
/
SQL> CREATE OR REPLACE TYPE trip AS OBJECT (leave DATE, place city);
/

Now assume that you invoke JPublisher as follows:

% jpub -u scott -s TRIP:Trip
Enter scott password: password

The JPublisher output is:

SCOTT.TRIP
SCOTT.CITY

Only TRIP is specified for processing. However, the command produces the source files City.java, CityRef.java, Trip.java, and TripRef.java, because CITY is an attribute.

If you want to regenerate the classes for TRIP without regenerating the classes for CITY, then you can rerun JPublisher as follows:

% jpub -u scott -addtypemap=CITY:City -s TRIP:Trip SCOTT.TRIP
Enter scott password: password

As you can see from the output line, the CITY type is not reprocessed and, therefore, the City.java and CityRef.java files are not regenerated. This is because of the addition of the CITY:City relationship to the type map, which informs JPublisher that the existing City class is to be used for mapping.

JPublisher Logical Progression for Data Type Mappings

To map a given SQL or PL/SQL type to Java, JPublisher uses the following logical progression:

  1. Checks the type maps to see if the mapping is already specified.

  2. Checks the predefined Java mappings for SQL and PL/SQL types.

  3. Checks whether the data type to be mapped is a PL/SQL RECORD type or an index-by table type. If it is a PL/SQL RECORD type, JPublisher generates a corresponding SQL object type that it can then map to Java. If it is an index-by table type, JPublisher generates a corresponding SQL collection type that it can then map to Java.

  4. If none of steps 1 through 3 apply, then the data type must be a user-defined type. JPublisher generates an ORAData or SQLData class to map it according to the JPublisher option settings.

Object Attribute Types

You can use a subset of the SQL data types in Table 3-1 as object attribute types. The types that can be used are listed here:

  • CHAR, VARCHAR, VARCHAR2, CHARACTER

  • NCHAR, NVARCHAR2

  • DATE

  • DECIMAL, DEC, NUMBER, NUMERIC

  • DOUBLE PRECISION, FLOAT

  • INTEGER, SMALLINT, INT

  • REAL

  • RAW, LONG RAW

  • CLOB

  • BLOB

  • BFILE

  • NCLOB

  • Object type, OPAQUE type, SQLJ object type

  • Nested table, VARRAY type

  • Object reference type

JPublisher supports the following TIMESTAMP types as object attributes:

  • TIMESTAMP

  • TIMESTAMP WITH TIMEZONE

  • TIMESTAMP WITH LOCAL TIMEZONE


Note:

The Oracle JDBC implementation does not support the TIMESTAMP types.

REF CURSOR Types and Result Sets Mapping

If a PL/SQL stored procedure or function or a SQL query returns a REF CURSOR, then JPublisher generates a method, by default, to map the REF CURSOR to java.sql.ResultSet.

In addition, for a SQL query, but not for a REF CURSOR returned by a stored procedure or function, JPublisher generates a method to map the REF CURSOR to an array of rows. In this array, each row is represented by a JavaBean instance.

In addition, with a setting of -style=webservices-common, if the following classes are available in the classpath, then JPublisher generates methods to map the REF CURSOR to the following types:

  • javax.xml.transform.Source

  • oracle.jdbc.rowset.OracleWebRowSet

  • org.w3c.dom.Document


Note:

  • The dependency of having the class in the classpath in order to generate the mapping is specified by a CONDITION statement in the style file. The CONDITION statement lists required classes.

  • The webservices9 and webservices10 style files include webservices-common, but override these mappings. Therefore, JPublisher will not produce these mappings with a setting of -style=webservices9 or -style=webservices10.


If required, you must perform the following actions to ensure that JPublisher can find the classes:

  1. Ensure that the libraries translator.jar, runtime12.jar, and ojdbc5.jar are in the classpath. These files contain JPublisher and SQLJ translator classes, SQLJ run time classes, and JDBC classes, respectively.

  2. Use Java Development Kit (JDK) 1.4, for mapping to Source. This class is not defined in earlier JDK versions.

  3. Add ORACLE_HOME/jdbc/lib/rowset-jsr114.jar to the classpath, for mapping to OracleWebRowSet.

  4. Add ORACLE_HOME/lib/xmlparsev2.jar to the classpath, for mapping to Document.

Consider the following PL/SQL stored procedure:

TYPE curtype1 IS REF CURSOR RETURN emp%rowtype;
FUNCTION get1 RETURN curtype1;

If the OracleWebRowSet class is found in the classpath during publishing, but Document and Source are not, then JPublisher generates the following methods for the get1 function:

public oracle.jdbc.rowset.OracleWebRowSet get1WebRowSet()
                                 throws java.sql.SQLException;
public java.sql.ResultSet get1() throws java.sql.SQLException;

The names of methods returning Document and Source would be get1XMLDocument() and get1XMLSource(), respectively.

Disabling Mapping to Source, OracleWebRowSet, or Document

There is currently no JPublisher option to explicitly enable or disable mapping to Source, OracleWebRowSet, or Document. The only condition in the webservices-common style file is whether the classes exist in the classpath. However, you can copy and edit your own style file if you want more control over how JPublisher maps REF CURSOR. The following code is an excerpt from the webservices-common file that has been copied and edited as an example. Descriptions of the edits follow the code.

BEGIN_TRANSFORMATION
MAPPING
SOURCETYPE java.sql.ResultSet
TARGETTYPE java.sql.ResultSet
RETURN
%2 = %1;
END_RETURN;
END_MAPPING

MAPPING
#CONDITION oracle.jdbc.rowset.OracleWebRowSet
SOURCETYPE java.sql.ResultSet
TARGETTYPE oracle.jdbc.rowset.OracleWebRowSet
TARGETSUFFIX WebRowSet
RETURN
%2 = null;
if (%1!=null)
{
  %2 = new oracle.jdbc.rowset.OracleWebRowSet();
  %2.populate(%1);
}
END_RETURN
END_MAPPING
 
#MAPPING
#CONDITION org.w3c.dom.Document oracle.xml.sql.query.OracleXMLQuery
#SOURCETYPE java.sql.ResultSet
#TARGETTYPE org.w3c.dom.Document
#TARGETSUFFIX XMLDocument
#RETURN
#%2 = null;
#if (%1!=null)
#  %2= (new oracle.xml.sql.query.OracleXMLQuery
#                                 (_getConnection(), %1)).getXMLDOM();
#END_RETURN
#END_MAPPING

MAPPING
CONDITION org.w3c.dom.Document oracle.xml.sql.query.OracleXMLQuery
          javax.xml.transform.Source javax.xml.transform.dom.DOMSource
SOURCETYPE java.sql.ResultSet
TARGETTYPE javax.xml.transform.Source
TARGETSUFFIX XMLSource
RETURN
%2 = null;
if (%1!=null)
  %2= new javax.xml.transform.dom.DOMSource
      ((new oracle.xml.sql.query.OracleXMLQuery
       (new oracle.xml.sql.dataset.OracleXMLDataSetExtJdbc(_getConnection(),
       (oracle.jdbc.OracleResultSet) %1))).getXMLDOM());
END_RETURN
END_MAPPING
END_TRANSFORMATION

Assume that you copy this file into myrefcursormaps.properties. There are four MAPPING sections intended for mapping REF CURSOR to ResultSet, OracleWebRowSet, Document, and Source according to the SOURCETYPE and TARGETTYPE entries. For this example, lines are commented out using the "#" character to accomplish the following:

  • The CONDITION statement is commented out for the OracleWebRowSet mapping. Because of this, JPublisher will generate a method for this mapping regardless of whether OracleWebRowSet is in the classpath.

  • The entire MAPPING section is commented out for the Document mapping. JPublisher will not generate a method for this mapping.

Run JPublisher with the following options to use your custom mappings:

% jpub -u scott -style=myrefcursormaps -s MYTYPE:MyType
Enter scott password: password

Connection in JDBC Mapping

With the -usertypes=jdbc setting, JPublisher generates SQLData for a SQL object type. The underlying JDBC connection for a SQLData instance is not automatically set by the JDBC driver. Therefore, before accessing attributes in a SQLData instance, you must set a JDBC connection using the setConnectionContext() method.

Consider Address is a SQLData class generated by JPublisher with -usertypes=jdbc. The following code segment accesses the attribute of an Address instance. Note that the setConnectionContext call explicitly initializes the underlying JDBC connection.

...
ResultSet rset = stmt.executeQuery();
Address address = (Address) rset.getObject(1);
address.setConnectionContext(new sqlj.runtime.ref.DefaultContext(connection));
String addr = address.getAddress();
...

Note:

Other -usertypes settings do not require setting the connection, as described in the preceding code example.

On the other hand, for ORAData types that JPublisher generates with the -usertypes=oracle setting or by default, connection initialization is not required. The underlying JDBC connection for ORAData is already assigned at the time it is read from ResultSet.

Support for PL/SQL Data Types

There are three scenarios if JPublisher encounters a PL/SQL stored procedure or function, including method of a SQL object type, which uses a PL/SQL type that is unsupported by JDBC:

  • If you specify a mapping for the PL/SQL type in the default type map or user type map, then JPublisher uses that mapping.

  • If there is no mapping in the type maps, and the PL/SQL type is a RECORD type or an index-by table type, then JPublisher generates a corresponding SQL type that JDBC supports. For a PL/SQL RECORD type, JPublisher generates a SQL object type to bridge between the RECORD type and Java. For an index-by table type, JPublisher generates a SQL collection type for the bridge.

  • If neither of the first two scenarios applies, then JPublisher issues a warning message and uses <unsupported type> in the generated code to represent the unsupported PL/SQL type.

The following sections discuss further details of JPublisher type mapping features for PL/SQL types unsupported by JDBC:

Type Mapping Support for OPAQUE Types

This section describes JPublisher type mapping support for SQL OPAQUE types in general.


Note:

If you want JPublisher to generate wrapper classes for SQL OPAQUE types, then you must use an Oracle9i Database release 2 (9.2) or later installation and JDBC driver.

The Oracle JDBC and SQLJ implementations support SQL OPAQUE types published as Java classes implementing the oracle.sql.ORAData interface. Such classes must contain the following public, static fields and methods:

public static String _SQL_NAME = "SQL_name_of_OPAQUE_type";
public static int _SQL_TYPECODE = OracleTypes.OPAQUE;
public static ORADataFactory getORADataFactory() { ... }

If you have a Java wrapper class to map to a SQL OPAQUE type, and the class meets this requirement, then you can specify the mapping through the JPublisher user type map. Use the -addtypemap option with the following syntax to append the mapping to the user type map:

-addtypemap=sql_opaque_type:java_wrapper_class

In Oracle Database 11g, the SYS.XMLTYPE SQL OPAQUE type is mapped to the oracle.xdb.XMLType Java class through the JPublisher default type map. You could accomplish the same thing explicitly through the user type map, as follows:

-addtypemap=SYS.XMLTYPE:oracle.xdb.XMLType

Whenever JPublisher encounters a SQL OPAQUE type for which no type correspondence has been provided, it publishes a Java wrapper class. Consider the following SQL type defined in the SCOTT schema:

CREATE TYPE X_TYP AS OBJECT (xml SYS.XMLTYPE);

The following command publishes X_TYP as a Java class XTyp:

% jpub -u scott -s X_TYP:XTyp
Enter scott password: password

By default, the xml attribute is published using oracle.xdb.XMLType, which is the predefined type mapping for SYS.XMLTYPE. If you clear the JPublisher default type map, then a wrapper class, Xmltype, will automatically be generated for the SYS.XMLTYPE attribute. You can verify this by invoking JPublisher as follows:

% jpub -u scott -s X_TYP:XTyp -defaulttypemap=
Enter scott password: password

The -defaulttypemap option is for setting the JPublisher default type map. Giving it no value, as in the preceding example, clears it.

Type Mapping Support for Scalar Index-by Tables

The term scalar PL/SQL index-by table refers to a PL/SQL index-by table with elements of VARCHAR and numerical types. Starting 10g Release 2 (10.2), JPublisher can map a simple PL/SQL index-by table into a Java array, as an alternative to mapping PL/SQL index-by tables into custom JDBC types. The option plsqlindextable specifies how a simple PL/SQL index-by table is mapped.

-plsqlindextable=custom|array|int

If -plsqlindextable=custom is set, all indexby tables are mapped to custom JDBC types, such as SQLData, CustomDatum, or ORAData. If -plsqlindextable=array or -plsqlindextable=int is set, a simple index-by table will be mapped to a Java array. With -plsqlindextable=int, the int value specifies the array capacity, which is 32768 by default. The default setting for this option is custom.

Consider the following PL/SQL package:

CREATE OR REPLACE PACKAGE indexbytable_package AS
  TYPE index_tbl1 IS TABLE OF VARCHAR2(111) INDEX BY binary_integer;
  TYPE index_tbl2 IS TABLE OF NUMBER INDEX BY binary_integer;
  TYPE varray_tbl3 IS VARRAY(100) OF VARCHAR2(20);
  TYPE nested_tbl4 IS TABLE OF VARCHAR2(20);
  FUNCTION echo_index_tbl1(a index_tbl1) RETURN index_tbl1;
  FUNCTION echo_index_tbl2(a index_tbl2) RETURN index_tbl2;
  FUNCTION echo_varray_tbl3(a varray_tbl3) RETURN varray_tbl3;
  FUNCTION echo_nested_tbl4(a nested_tbl4) RETURN nested_tbl4;
END;
/

Run the following command:

% jpub -u scott -sql=indexbytable_package:IndexbyTablePackage#IndexbyTableIntf -plsqlindextable=32
Enter scott password: password

The -plsqlindextable=32 setting specifies that simple index-by tables are mapped to Java arrays, with a capacity of 32. The following interface is generated in IndexbyTableIntf.java:

public interface IndexbyTableIntf
{
 public String[] echoIndexTbl1(String[] a);
 public java.math.BigDecimal[] echoIndexTbl2(java.math.BigDecimal[] a);
 public IndexbytableintfVarrayTbl3 echoVarrayTbl4(IndexbytableintfVarrayTbl3 a);
 public IndexbytableintfNestedTbl4 echoVarrayTbl4(IndexbytableintfNestedTbl4 a);
}

In the generated code, the simple index-by table types, index_tbl1 and index_tb2, are mapped to String[] and BigDecimal[] respectively. The nested table and varray table, however, are still mapped to custom JDBC types, because they are not index-by tables and their mappings are not affected by the -plsqlindextable setting.

The limitation of mapping PL/SQL index-by table to an array is that the table must be indexed by integer. If a PL/SQL package contains both tables indexed by integer and by VARCHAR, you cannot use the setting -plsqlindexbytable=array or -plsqlindexbytable=int. Otherwise the mapping for the table indexed by VARCHAR will encounter run-time errors. Instead, one must use -plsqlindexbytable=custom.

Mapping of the index-by table elements follows the JDBC type mappings. For example, with JDBC mapping, SMALLINT is mapped to the Java int type. Therefore, an index-by table of SMALLINT is mapped to int[]. The -plsqlindexbytable=array or -plsqlindexbytable=int setting will be ignored if Oracle mappings are turned on for numbers, that is, -numbertypes=oracle. The reason is that the Java array mapped to the index-by table must have string or numerical Java types as elements, while Oracle mappings map SQL numbers into oracle.sql types.

Oracle JDBC drivers directly support PL/SQL scalar index-by tables with numeric or character elements. An index-by table with numeric elements can be mapped to the following Java array types:

  • int[]

  • double[]

  • float[]

  • java.math.BigDecimal[]

  • oracle.sql.NUMBER[]

An index-by table with character elements can be mapped to the following Java array types:

  • String[]

  • oracle.sql.CHAR[]

In the following circumstances, you must convey certain information for an index-by table type, as described:

  • Whenever you use the index-by table type in an OUT or IN OUT parameter, you must specify the maximum number of elements, which is otherwise optional. You can specify the maximum number of elements using the customary syntax for Java array allocation. For example, you could specify int[100] to denote a type that can accommodate up to 100 elements or oracle.sql.CHAR[20] for up to 20 elements.

  • For index-by tables with character elements, you can optionally specify the maximum size of an individual element, in bytes. This setting is defined using the SQL-like size syntax. For example, for an index-by table used for IN arguments, you could specify String[](30). You could also specify oracle.sql.CHAR[20](255) for an index-by table of maximum length 20, the elements of which will not exceed 255 bytes each.

Use the JPublisher -addtypemap option to add instructions to the user type map to specify correspondences between PL/SQL types, which are scalar index-by tables, and the corresponding Java array types. The size hints that are given using the syntax outlined earlier are embedded into the generated SQLJ class and thus conveyed to JDBC at run time.

As an example, consider the following code fragment from the definition of the INDEXBY PL/SQL package in the SCOTT schema. Assume this is available in a file called indexby.sql.

CREATE OR REPLACE PACKAGE indexby AS

--  jpub.addtypemap=SCOTT.INDEXBY.VARCHAR_ARY:String[1000](4000)
--  jpub.addtypemap=SCOTT.INDEXBY.INTEGER_ARY:int[1000]
--  jpub.addtypemap=SCOTT.INDEXBY.FLOAT_ARY:double[1000]

 TYPE varchar_ary IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
 TYPE integer_ary IS TABLE OF INTEGER        INDEX BY BINARY_INTEGER;
 TYPE float_ary   IS TABLE OF NUMBER         INDEX BY BINARY_INTEGER;

 FUNCTION get_float_ary RETURN float_ary;
 PROCEDURE pow_integer_ary(x integer_ary, y OUT integer_ary);
 PROCEDURE xform_varchar_ary(x IN OUT varchar_ary);

END indexby;
/
CREATE OR REPLACE PACKAGE BODY indexby IS ...
/

The following are the required -addtypemap directives for mapping the three index-by table types:

-addtypemap=SCOTT.INDEXBY.VARCHAR_ARY:String[1000](4000)
-addtypemap=SCOTT.INDEXBY.INTEGER_ARY:int[1000]
-addtypemap=SCOTT.INDEXBY.FLOAT_ARY:double[1000]

Note that depending on the operating system shell you are using, you may have to quote options that contain square brackets [...] or parentheses (...). You can avoid this by placing such options into a JPublisher properties file, as follows:

jpub.addtypemap=SCOTT.INDEXBY.VARCHAR_ARY:String[1000](4000)
jpub.addtypemap=SCOTT.INDEXBY.INTEGER_ARY:int[1000]
jpub.addtypemap=SCOTT.INDEXBY.FLOAT_ARY:double[1000]

Additionally, as a feature of convenience, JPublisher directives in a properties file are recognized when placed behind a "--" prefix (two dashes), whereas any entry that does not start with "jpub." or with "-- jpub." is ignored. So, you can place JPublisher directives into SQL scripts and reuse the same SQL scripts as JPublisher properties files. Thus, after invoking the indexby.sql script to define the INDEXBY package, you can now run JPublisher to publish this package as a Java class, IndexBy, as follows:

% jpub -u scott -s INDEXBY:IndexBy -props=indexby.sql
Enter scott password: password

As mentioned previously, you can use this mapping of scalar index-by tables only with Oracle JDBC drivers. If you are using another driver or if you want to create driver-independent code, then you must define SQL types that correspond to the index-by table types, as well as defining conversion functions that map between the two.

Type Mapping Support Through PL/SQL Conversion Functions

This section discusses the mechanism that JPublisher uses for supporting PL/SQL types in Java code, through PL/SQL conversion functions that convert between each PL/SQL type and a corresponding SQL type to allow access by JDBC.

In general, Java programs do not support the binding of PL/SQL-specific types. The only way you can use such types from Java is to use PL/SQL code to map them to SQL types, and then access these SQL types from Java. However, one exception is the scalar index-by table type.

JPublisher makes this task more convenient through the use of its type maps. For a particular PL/SQL type, specify the following information in a JPublisher type map entry:

  • Name of the PL/SQL type, typically of the form:

    SCHEMA.PACKAGE.TYPE
    
  • Name of the corresponding Java wrapper class

  • Name of the SQL type that corresponds to the PL/SQL type

    You must be able to directly map this type to the Java wrapper type. For example, if the SQL type is NUMBER, then the corresponding Java type could be int, double, Integer, Double, java.math.BigDecimal, or oracle.sql.NUMBER. If the SQL type is an object type, then the corresponding Java type would be an object wrapper class that implements the oracle.sql.ORAData or java.sql.SQLData interface. The object wrapper class is typically generated by JPublisher.

  • Name of a PL/SQL conversion function that maps the SQL type to the PL/SQL type

  • Name of a PL/SQL conversion function that maps the PL/SQL type to the SQL type

The -addtypemap specification for this has the following form:

-addtypemap=plsql_type:java_type:sql_type:sql_to_plsql_fun:plsql_to_sql_fun

See Also:

"Type Map Options"

As an example, consider a type map entry for supporting the PL/SQL BOOLEAN type. It consists of the following specifications:

  • Name of the PL/SQL type: BOOLEAN

  • Specification to map it to Java boolean

  • Corresponding SQL type: INTEGER

    JDBC considers boolean values as special numeric values.

  • Name of the PL/SQL function that maps from SQL to PL/SQL: INT2BOOL

    The code for the function is:

    FUNCTION int2bool(i INTEGER) RETURN BOOLEAN IS
    BEGIN IF i IS NULL THEN RETURN NULL;
          ELSE RETURN i<>0;
          END IF;
    END int2bool;
    
  • Name of the PL/SQL function that maps from PL/SQL to SQL: BOOL2INT

    The code for the function is:

    FUNCTION bool2int(b BOOLEAN) RETURN INTEGER IS
    BEGIN IF b IS NULL THEN RETURN NULL;
          ELSIF b THEN RETURN 1;
          ELSE RETURN 0; 
          END IF;
    END bool2int;
    

You can put all this together in the following type map entry:

-addtypemap=BOOLEAN:boolean:INTEGER:INT2BOOL:BOOL2INT

Such a type map entry assumes that the SQL type, the Java type, and both conversion functions have been defined in SQL, Java, and PL/SQL, respectively. Note that there is already an entry for PL/SQL BOOLEAN in the JPublisher default type map. If you want to try the preceding type map entry, you will have to override the default type map. You can use the JPublisher -defaulttypemap option to accomplish this, as follows:

% jpub -u scott -s SYS.SQLJUTL:SQLJUtl -defaulttypemap=BOOLEAN:boolean:INTEGER:INT2BOOL:BOOL2INT
Enter scott password: password

Note:

  • In some cases, such as with INT2BOOL and BOOL2INT in the preceding example, JPublisher has conversion functions that are predefined, typically in the SYS.SQLJUTL package. In other cases, such as for RECORD types and index-by table types, JPublisher generates conversion functions during execution.

  • Although this manual describes conversions as mapping between SQL and PL/SQL types, there is no intrinsic restriction to PL/SQL in this approach. You could also map between different SQL types. In fact, this is done in the JPublisher default type map to support SQL INTERVAL types, which are mapped to VARCHAR2 values and back.


Be aware that under some circumstances, PL/SQL wrapper functions are also created by JPublisher. Each wrapper function wraps a stored procedure that uses PL/SQL types. It calls this original stored procedure and processes its PL/SQL input or output through the appropriate conversion functions so that only the corresponding SQL types are exposed to Java. The following JPublisher options control how JPublisher creates code for invocation of PL/SQL stored procedures that use PL/SQL types, including the use of conversion functions and possibly the use of wrapper functions:

  • -plsqlpackage=plsql_package

    This option determines the name of the PL/SQL package into which JPublisher generates the PL/SQL conversion functions: a function to convert each unsupported PL/SQL type to the corresponding SQL type and a function to convert from each corresponding SQL type back to the PL/SQL type. Optionally, depending on how you set the -plsqlmap option, the package also contains wrapper functions for the original stored procedures, with each wrapper function invoking the appropriate conversion function.

    If you do not specify a package name, then JPublisher uses JPUB_PLSQL_WRAPPER.

  • -plsqlfile=plsql_wrapper_script,plsql_dropper_script

    This option determines the name of the wrapper script and dropper script that JPublisher creates. The wrapper script creates necessary SQL types that map to unsupported PL/SQL types and also creates the PL/SQL package. The dropper script drops these SQL types and the PL/SQL package.

    If the files already exist, then they will be overwritten. If you do not specify any file names, then JPublisher will write to the files named plsql_wrapper.sql and plsql_dropper.sql.

  • -plsqlmap=flag

    This option specifies whether JPublisher generates wrapper functions for stored procedures that use PL/SQL types. Each wrapper function calls the corresponding stored procedure and the appropriate PL/SQL conversion functions for PL/SQL input or output of the stored procedure. Only the corresponding SQL types are exposed to Java. The flag setting can be any of the following:

    • true

      This is the default setting. JPublisher generates PL/SQL wrapper functions only as needed. For any given stored procedure, if the Java code to call it and convert its PL/SQL types directly is simple enough, and if PL/SQL types are used only as IN parameters or for the function return, then the generated code calls the stored procedure directly instead. The code then processes the PL/SQL input or output through the appropriate conversion functions.

      If a PL/SQL type is used as an OUT or IN OUT parameter, then wrapper functions are required, because conversions between PL/SQL and SQL representations may be necessary either before or after calling the original stored procedure.

    • false

      JPublisher does not generate PL/SQL wrapper functions. If it encounters a PL/SQL type in a signature that cannot be supported by a direct call and conversion, then it skips the generation of Java code for the particular stored procedure.

    • always

      JPublisher generates a PL/SQL wrapper function for every stored procedure that uses a PL/SQL type. This setting is useful for generating a proxy PL/SQL package that complements an original PL/SQL package, providing JDBC-accessible signatures for those functions or procedures that were not accessible through JDBC in the original package.

Type Mapping Support for PL/SQL RECORD and Index-By Table Types

JPublisher automatically publishes a PL/SQL RECORD type whenever it publishes a PL/SQL stored procedure or function that uses that type as an argument or return type. The same is true for PL/SQL index-by table types. This is the only way that a RECORD type or index-by table type can be published. There is no way to explicitly request any such types to be published through JPublisher option settings.


Note:

The following are limitations to the JPublisher support for PL/SQL RECORD and index-by table types:
  • An intermediate wrapper layer is required to map a RECORD or index-by-table argument to a SQL type that JDBC can support. In addition, JPublisher cannot fully support the semantics of index-by tables. An index-by table is similar in structure to a Java hashtable, but information is lost when JPublisher maps this to a SQL TABLE type.

  • If you use the JDBC OCI driver and require only the publishing of scalar index-by tables, then you can use the direct mapping between Java and these types.


The following sections demonstrate JPublisher support for PL/SQL RECORD types and index-by table types:

Sample Package for RECORD Type and Index-By Table Type Support

The following PL/SQL package is used to illustrate JPublisher support for PL/SQL RECORD and index-by table types:

CREATE OR REPLACE PACKAGE company IS
  TYPE emp_rec IS RECORD (empno NUMBER, ename VARCHAR2(10));
  TYPE emp_tbl IS TABLE OF emp_rec INDEX BY binary_integer;
  PROCEDURE set_emp_rec(er emp_rec);
  FUNCTION get_emp_rec(empno number) RETURN emp_rec;
  FUNCTION get_emp_tbl RETURN emp_tbl;
END;

This package defines a PL/SQL RECORD type, EMP_REC, and a PL/SQL index-by table type, EMP_TBL. Use the following command to publish the COMPANY package:

% jpub -u scott -s COMPANY:Company -plsqlpackage=WRAPPER1
  -plsqlfile=wrapper1.sql,dropper1.sql
Enter scott password: password

The JPublisher output is:

SCOTT.COMPANY
SCOTT."COMPANY.EMP_REC"
SCOTT."COMPANY.EMP_TBL"
J2T-138, NOTE: Wrote PL/SQL package WRAPPER1 to file wrapper1.sql.
Wrote the dropping script to file dropper1.sql

In this example, JPublisher generates Company.java for the Java wrapper class for the COMPANY package, as well as the following SQL and Java entities:

  • The wrapper1.sql script that creates the SQL types corresponding to the PL/SQL RECORD and index-by table types, and also creates the conversion functions between the SQL types and the PL/SQL types

  • The dropper1.sql script that removes the SQL types and conversion functions created by wrapper1.sql

  • The CompanyEmpRec.java source file for the Java wrapper class for the SQL object type that is generated for the PL/SQL RECORD type

  • The CompanyEmpTbl.java source file for the Java wrapper class for the SQL collection type that is generated for the PL/SQL index-by table type

Support for RECORD Types

This section continues the example from Sample Package for RECORD Type and Index-By Table Type Support. For the PL/SQL RECORD type, EMP_REC, JPublisher generates the corresponding COMPANY_EMP_REC SQL object type. JPublisher also generates the conversion functions between the two. In this example, the following is generated in wrapper1.sql for EMP_REC:

CREATE OR REPLACE TYPE COMPANY_EMP_REC AS OBJECT (
                       EMPNO NUMBER(22),
                       ENAME VARCHAR2(10)
);
/
-- Declare package containing conversion functions between SQL and PL/SQL types
CREATE OR REPLACE PACKAGE WRAPPER1 AS
   -- Declare the conversion functions the PL/SQL type COMPANY.EMP_REC
        FUNCTION PL2COMPANY_EMP_REC(aPlsqlItem COMPANY.EMP_REC)
        RETURN COMPANY_EMP_REC;
        FUNCTION COMPANY_EMP_REC2PL(aSqlItem COMPANY_EMP_REC)
        RETURN COMPANY.EMP_REC;
END WRAPPER1;
/

In addition, JPublisher publishes the COMPANY_EMP_REC SQL object type into the CompanyEmpRec.java Java source file.

Once the PL/SQL RECORD type is published, you can add the mapping to the type map. The following is an entry in a sample JPublisher properties file, done.properties:

jpub.addtypemap=SCOTT.COMPANY.EMP_REC:CompanyEmpRec:COMPANY_EMP_REC:
WRAPPER1.COMPANY_EMP_REC2PL:WRAPPER1.PL2COMPANY_EMP_REC

Use this type map entry whenever you publish a package or type that refers to the RECORD type, EMP_REC. For example, the following JPublisher invocation uses done.properties with this type map entry:

% jpub -u scott -p done.properties -s COMPANY -plsqlpackage=WRAPPER2
       -plsqlfile=wrapper2.sql,dropper2.sql
Enter scott password: password

The JPublisher output is:

SCOTT.COMPANY
SCOTT."COMPANY.EMP_TBL"
J2T-138, NOTE: Wrote PL/SQL package WRAPPER2 to file wrapper2.sql. 
Wrote the dropping script to file dropper2.sql

Support for Index-By Table Types

This section continues the example from Sample Package for RECORD Type and Index-By Table Type Support.

To support an index-by table type, a SQL collection type must be defined that permits conversion to and from the PL/SQL index-by table type. JPublisher also supports PL/SQL nested tables and VARRAYs in the same fashion. Therefore, JPublisher generates the same code for the following three definitions of EMP_TBL:

TYPE emp_tbl IS TABLE OF emp_rec INDEX BY binary_integer;
TYPE emp_tbl IS TABLE OF emp_rec;
TYPE emp_tbl IS VARRAY OF emp_rec;

For the PL/SQL index-by table type EMP_TBL, JPublisher generates a SQL collection type, and conversion functions between the index-by table type and the SQL collection type.

In addition to what was shown for the RECORD type earlier, JPublisher generates the following:

-- Declare the SQL type for the PL/SQL type COMPANY.EMP_TBL
CREATE OR REPLACE TYPE COMPANY_EMP_TBL AS TABLE OF COMPANY_EMP_REC; 
/
-- Declare package containing conversion functions between SQL and PL/SQL types
CREATE OR REPLACE PACKAGE WRAPPER1 AS
   -- Declare the conversion functions for the PL/SQL type COMPANY.EMP_TBL
        FUNCTION PL2COMPANY_EMP_TBL(aPlsqlItem COMPANY.EMP_TBL)
        RETURN COMPANY_EMP_TBL;
        FUNCTION COMPANY_EMP_TBL2PL(aSqlItem COMPANY_EMP_TBL)
        RETURN COMPANY.EMP_TBL;
...
END WRAPPER1;

JPublisher further publishes the SQL collection type into CompanyEmpTbl.java.

As with a PL/SQL RECORD type, once a PL/SQL index-by table type is published, the published result, including the Java wrapper classes, the SQL collection type, and the conversion functions, can be used in the future for publishing PL/SQL packages involving that PL/SQL index-by table type. For example, if you add the following entry into a properties file that you use in invoking JPublisher, say done.properties, then JPublisher will use the provided type map and avoid republishing that index-by table type:

jpub.addtypemap=SCOTT.COMPANY.EMP_TBL:CompanyEmpTbl:COMPANY_EMP_TBL:
WRAPPER1.COMPANY_EMP_TBL2PL:WRAPPER1.PL2COMPANY_EMP_TBL

Direct Use of PL/SQL Conversion Functions Versus Use of Wrapper Functions

In generating Java code to invoke a stored procedure that uses a PL/SQL type, JPublisher can use either of the following modes of operation:

  • Invoke the stored procedure directly, which processes the PL/SQL input or output through the appropriate conversion functions.

  • Invoke a PL/SQL wrapper function, which in turn calls the stored procedure and processes its PL/SQL input or output through the appropriate conversion functions. The wrapper function that is generated by JPublisher uses the corresponding SQL types for input or output.

The -plsqlmap option determines whether JPublisher uses the first mode, the second mode, or possibly either mode, depending on circumstances.

As an example, consider the SCOTT.COMPANY.GET_EMP_TBL PL/SQL stored procedure that returns the EMP_TBL PL/SQL index-by table type. Assume that the COMPANY package, introduced in "Sample Package for RECORD Type and Index-By Table Type Support", is processed by JPublisher through the following command:

% jpub -u scott -s COMPANY:Company -plsqlpackage=WRAPPER1
       -plsqlfile=wrapper1.sql,dropper1.sql -plsqlmap=false
Enter scott password: password

The JPublisher output is:

SCOTT.COMPANY
SCOTT."COMPANY.EMP_REC"
SCOTT."COMPANY.EMP_TBL"
J2T-138, NOTE: Wrote PL/SQL package WRAPPER1 to file wrapper1.sql.
Wrote the dropping script to file dropper1.sql

With this command, JPublisher creates the following:

  • SQL object type COMPANY_EMP_REC to map to the PL/SQL RECORD type EMP_REC

  • SQL collection type COMPANY_EMP_TBL to map to the PL/SQL index-by table type EMP_TBL

  • Java classes to map to COMPANY, COMPANY_EMP_REC, and COMPANY_EMP_TBL

  • PL/SQL package WRAPPER1, which includes the PL/SQL conversion functions to convert between the PL/SQL index-by table type and the SQL collection type

In this example, assume that the conversion function PL2COMPANY_EMP_TBL converts from the PL/SQL EMP_TBL type to the SQL COMPANY_EMP_TBL type. Because of the setting -plsqlmap=false, no wrapper functions are created. The stored procedure is called with the following JDBC statement in generated Java code:

conn.prepareOracleCall = 
("BEGIN :1 := WRAPPER1.PL2COMPANY_EMP_TBL(SCOTT.COMPANY.GET_EMP_TBL()) \n; END;");

SCOTT.COMPANY.GET_EMP_TBL is called directly, with its EMP_TBL output being processed through the PL2COMPANY_EMP_TBL conversion function to return the desired COMPANY_EMP_TBL SQL type.

By contrast, if you run JPublisher with the setting -plsqlmap=always, then WRAPPER1 also includes a PL/SQL wrapper function for every PL/SQL stored procedure that uses a PL/SQL type. In this case, for any given stored procedure, the generated Java code calls the wrapper function instead of the stored procedure. The wrapper function, in this example WRAPPER1.GET_EMP_TBL, calling the original stored procedure and processing its output through the conversion function is as follows:

FUNCTION  GET_EMP_TBL()
   BEGIN 
      RETURN WRAPPER1.PL2COMPANY_EMP_TBL(SCOTT.COMPANY.GET_EMP_TBL()) 
   END;

In the generated Java code, the JDBC statement calling the wrapper function is:

conn.prepareOracleCall("BEGIN :1=SCOTT.WRAPPER1.GET_EMP_TBL() \n; END;");

If -plsqlmap=true, then JPublisher uses direct calls to the original stored procedure wherever possible. However, in the case of any stored procedure for which the Java code for direct invocation and conversion is too complex or any stored procedure that uses PL/SQL types as OUT or IN OUT parameters, JPublisher generates a wrapper function and calls that function in the generated code.

Other Alternatives for Data Types Unsupported by JDBC

The preceding sections describe the mechanisms that JPublisher employs to access PL/SQL types unsupported by JDBC. As an alternative to using JPublisher in this way, you can try one of the following:

  • Rewrite the PL/SQL method to avoid using the type

  • Write an anonymous block that does the following:

    • Converts input types that JDBC supports into the input types used by the PL/SQL stored procedure

    • Converts output types used by the PL/SQL stored procedure into output types that JDBC supports

JPublisher Styles and Style Files

JPublisher style files allow you to specify Java-to-Java type mappings. This is to ensure that generated classes can be used in Web services. As an example, CLOB types, such as java.sql.Clob and oracle.sql.CLOB, cannot be used in Web services, but the data can be used if it is converted to a type that is supported by Web services, such as java.lang.String. JPublisher must generate user subclasses to implement its use of style files and Java-to-Java type transformations.

Typically, style files are provided by Oracle, but there may be situations in which you may want to edit or create your own.

The following sections discuss features and usage of styles and style files:

Style File Specifications and Locations

Use the JPublisher -style option to specify the base name of a style file:

-style=stylename

Based on the stylename you specify, JPublisher looks for a style file as follows, and uses the first file that it finds:

  1. It looks for the following resource in the classpath:

    /oracle/jpub/mesg/stylename.properties
    
  2. It takes stylename as a resource name, possibly qualified, and looks for the following in the classpath:

    /stylename-dir/stylename-base.properties
    
  3. It takes stylename as a name, possibly qualified, and looks for the following file in the current directory:

    stylename.properties
    

    In this case, stylename can optionally include a directory path. If you use the setting -style=mydir/foo, for example, then JPublisher looks for mydir/foo.properties relative to the current directory.

If no matching file is found, JPublisher generates an exception.

As an example of the first scenario, if the resource /oracle/jpub/mesg/webservices.properties exists in ORACLE_HOME/sqlj/lib/translator.jar and translator.jar is found in the classpath, then the -style=webservices setting uses /oracle/jpub/mesg/webservices.properties from translator.jar, even if there is a webservices.properties file in the current directory.

However, if you specify -style=mystyle and a mystyle.properties resource is not found in /oracle/jpub/mesg, but there is a mystyle.properties file in the current directory, then that is used.


Note:

Oracle currently provides three style files:
/oracle/jpub/mesg/webservices-common.properties
/oracle/jpub/mesg/webservices10.properties
/oracle/jpub/mesg/webservices9.properties

These are in the translator.jar file, which must be included in your classpath. Each file maps Oracle JDBC types to Java types supported by Web services. Note that the webservices-common.properties file is for general use and is included by both webservices10.properties and webservices9.properties.

To use Web services in Oracle Database 11g, specify the following style file:

-style=webservices10

To use Web services in Oracle9i, specify -style=webservices9.


Style File Format

The key portion of a style file is the TRANSFORMATION section. This section comprises everything between the TRANSFORMATION tag and END_TRANSFORMATION tag. It describes the type transformations, or Java-to-Java mappings, to be applied to types used for object attributes or in method signatures.

For convenience, there is an OPTIONS section in which you can specify any other JPublisher option settings. Because of this section, a style file can replace the functionality of any other JPublisher properties file, in addition to specifying mappings.

This section covers the following topics:


Note:

The following details about style files are provided for general information. This information is subjected to change.

Style File TRANSFORMATION Section

This section provides a template for a style file TRANSFORMATION section, with comments. Within the TRANSFORMATION section, there is a MAPPING section for each mapping that you specify. The MAPPING section starts at a MAPPING tag and ends with an END_MAPPING tag. Each MAPPING section includes a number of subtags with additional information. In the MAPPING section, the SOURCETYPE and TARGETTYPE tags are the required subtags. Within each TARGETTYPE section, you should generally provide information for at least the RETURN, IN, and OUT cases, using the corresponding tags. The following code illustrates the structure of a typical TRANSFORMATION section:

TRANSFORMATION

 IMPORT
 # Packages to be imported by the generated classes
 END_IMPORT

 # THE FOLLOWING OPTION ONLY APPLIES TO PL/SQL PACKAGES
 # This interface should be implemented/extended by
 # the methods in the user subclasses and interfaces
 # This option takes no effect when subclass is not generated.
 SUBCLASS_INTERFACE java_interface

 # THE FOLLOWING OPTION ONLY APPLIES TO PL/SQL PACKAGES
 # Each method in the interface and the user subclass should
 # throw this exception (the default SQLException will be caught
 # and re-thrown as an exception specified here)
 # This option takes no effect when subclass is not generated.
 SUBCLASS_EXCEPTION Java_exception_type

 STATIC
 # Any code provided here is inserted at the
 # top level of the generated subclass regardless
 # of the actual types used.
 END_STATIC

 # Enumerate as many MAPPING sections as needed.

 MAPPING
 SOURCETYPE Java_source_type
 # Can be mapped to several target types.
 TARGETTYPE Java_target_type

 # With CONDITION specified, the source-to-target
 # mapping is carried out only when the listed Java
 # classes are present during publishing. 
 # The CONDITION section is optional.
 CONDITION list_of_java_classes

 IN
 # Java code for performing the transformation
 # from source type argument %1 to the target
 # type, assigning it to %2.
 END_IN
 IN_AFTER_CALL
 # Java code for processing IN parameters
 # after procedure call.
 END_IN_AFTER_CALL
 OUT
 # Java code for performaing the transformation
 # from a target type instance %2 to the source
 # type, assigning it to %1.
 END_OUT
 RETURN
 # Java code for performing the transformation
 # from source type argument %1 to the target
 # type and returning the target type.
 END_RETURN

 # Include the code given by a DEFINE...END_DEFINE block
 # at the end of this template file.
 USE defined_name

 # Holder for OUT/INOUT of the type defined by SOURCETYPE.
 HOLDER Java_holder_type
 END_TARGETTYPE

 # More TARGETTYPE sections, as needed

 END_MAPPING

 DEFAULT_HOLDER
 # JPublisher will generate holders for types that do
 # not have HOLDER entries defined in this template.
 # This section includes a template for class definitions
 # from which JPublisher will generate .java files for
 # holder classes.
 END_DEFAULT_HOLDER

 # More MAPPING sections, as needed

 DEFINE defined_name
 # Any code provided here is inserted at the
 # top level of the generated class if the
 # source type is used.
 END_DEFINE
 # More DEFINE sections, as needed

END_TRANSFORMATION

Note:

  • Style files use ISO8859_1 encoding. Any characters that cannot be represented directly in this encoding must be represented in Unicode escape sequences.

  • It is permissible to have multiple MAPPING sections with the same SOURCETYPE specification. For argument type, JPublisher uses the last of these MAPPING sections that it encounters.



See Also:

"Passing Output Parameters in JAX-RPC Holders" for a discussion of holders

Style File OPTIONS Section

For convenience, you can specify any desired JPublisher option settings in the OPTIONS section of a style file, in the standard format for JPublisher properties files. The syntax for the same is as follows:

OPTIONS
 # Comments
 jpub.option1=value1
 jpub.option2=value2
 ...
END_OPTIONS

Summary of Key Java-to-Java Type Mappings in ORracle Style Files

The Oracle style files webservices-common.properties, webservices9.properties, and webservices10.properties, through their SOURCETYPE and TARGETTYPE specifications, have a number of important Java-to-Java type mappings to support Web services and REF CURSOR mappings. These mappings are summarized in Table 3-2.

Table 3-2 Summary of Java-to-Java Type Mappings in Oracle Style Files

Source TypeTarget Type

oracle.sql.NString

java.lang.String

oracle.sql.CLOB

java.lang.String

oracle.sql.BLOB

byte[]

oracle.sql.BFILE

byte[]

java.sql.Timestamp

java.util.Date

java.sql.ResultSet

oracle.jdbc.rowset.OracleWebRowSet

org.w3c.dom.Document

javax.xml.transform.Source


Use of Multiple Style Files

JPublisher allows multiple -style options on the command line, with the following behavior:

  • The OPTIONS sections are concatenated.

  • The TRANSFORMATION sections are concatenated, except that the entries in the MAPPING sections are overridden, as applicable. A MAPPING entry from a style file specified later on the command line overrides a MAPPING entry with the same SOURCETYPE specification from a style file specified earlier on the command line.

This functionality is useful if you want to overwrite type mappings defined earlier or add new type mappings. For example, if you want to map SYS.XMLTYPE to java.lang.String, then you can append the setting -style=xml2string to the JPublisher command line. This example assumes that the ./xml2string.properties style file will be accessed. This style file is defined as follows:

      OPTIONS
       jpub.defaulttypemap=SYS.XMLTYPE:oracle.xdb.XMLType
      END_OPTIONS
      TRANSFORM
      MAPPING
      SOURCETYPE oracle.xdb.XMLType
      TARGETTYPE java.lang.String
      # XMLType => String
      OUT
      %2 = null;
      if (%1!=null) %2=%1.getStringVal();
      END_OUT
      # String => XMLType
      IN
      %1 = null;
      if (%2!=null)
      {
        %1 = new %p.%c(_getConnection());
        %1 = %1.createXML(%2);
      }
      END_IN
      END_TARGETTYPE
      END_MAPPING
      END_TRANSFORM

Continuing this example, assume the following PL/SQL stored procedure definition:

PROCEDURE foo (arg XMLTYPE);

JPublisher maps this as follows in the base class:

void foo (arg oracle.xdb.XMLType);

And JPublisher maps it as follows in the user subclass:

void foo (arg String);

Note:

By default, JPublisher maps SYS.XMLTYPE to oracle.xdb.XMLType.

PKk^~fRPK.AOEBPS/preface.htmon Preface

Preface

This preface introduces you to the Oracle Database JPublisher User's Guide, discussing the intended audience, structure, and conventions of this document. A list of related Oracle documents is also provided.

The JPublisher utility is for Java programmers who want classes in their applications to correspond to SQL or PL/SQL entities or server-side Java classes.

This preface covers the following topics:

Intended Audience

The Oracle Database JPublisher User's Guide is intended for Java Database Connectivity (JDBC) and Java2 Platform, Enterprise Edition (J2EE) programmers who want to accomplish any of the following for database applications:

To use this document, you need knowledge of Java, Oracle Database, SQL, PL/SQL, and JDBC.

Documentation Accessibility

For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website at http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.

Access to Oracle Support

Oracle customers have access to electronic support through My Oracle Support. For information, visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs if you are hearing impaired.

Accessibility of Links to External Web Sites in Documentation

This documentation may contain links to Web sites of other companies or organizations that Oracle does not own or control. Oracle neither evaluates nor makes any representations regarding the accessibility of these Web sites.

Deaf/Hard of Hearing Access to Oracle Support Services

To reach Oracle Support Services, use a telecommunications relay service (TRS) to call Oracle Support at 1.800.223.1711. An Oracle Support Services engineer will handle technical issues and provide customer support according to the Oracle service request process. Information about TRS is available at http://www.fcc.gov/cgb/consumerfacts/trs.html, and a list of phone numbers is available at http://www.fcc.gov/cgb/dro/trsphonebk.html.

Structure

This document contains:

Chapter 1, "Introduction to JPublisher"

Introduces the JPublisher utility by way of examples, lists new JPublisher features in this release, and provides an overview of JPublisher operations.

Chapter 2, "Using JPublisher"

Describes how you can use JPublisher for publishing SQL and PL/SQL objects, Oracle Stream Advanced Queue (AQ), server-side Java classes, and Web services.

Chapter 3, "Data Type and Java-to-Java Type Mappings"

Provides details of JPublisher data type mappings and the styles mechanism for Java-to-Java type mappings.

Chapter 5, "Generated Classes and Interfaces"

Discusses details and concepts of the classes, interfaces, and subclasses generated by JPublisher, including how output parameters (PL/SQL IN OUT or OUT parameters) are treated, how overloaded methods are translated, and how the generated classes and interfaces are used.

Chapter 4, "Additional Features and Considerations"

Covers additional JPublisher features and considerations: a summary of support for Web services, filtering of JPublisher output, and migration and backward compatibility.

Chapter 6, "Command-Line Options and Input Files"

Provides details of the JPublisher command-line syntax, command-line options and their usage, and input file format.

Appendix A, "Generated Code Examples"

Contains code examples that are too lengthy to fit conveniently with corresponding material earlier in the manual. This includes examples of Java-to-Java type transformations to support Web services, and Java and PL/SQL wrappers to support Web services.

Appendix B, "Troubleshooting"

Covers the troubleshooting tips for JPublisher

Related Documents

For more information, see the following Oracle resources.

From the Oracle Java Platform group, for Oracle Database releases:

From the Oracle Java Platform group, for Oracle Application Server releases:

From the Oracle Server Technologies group:


Note:

Oracle error message documentation is available in HTML only. Only if you have access to the Oracle Documentation CD, you can browse the error messages by range. After you find the specific range, use the Find in Page feature of your browser to locate the specific message. When connected to the Internet, you can search for a specific error message using the error message search feature of the Oracle online documentation.

From the Oracle Application Server group:

From the Oracle JDeveloper group:

To download free release notes, installation documentation, white papers, or other collateral, visit the Oracle Technology Network (OTN). You must register online before using OTN. Registration is free and can be done at

http://www.oracle.com/technetwork/community/join/overview/index.html

If you already have a user name and password for OTN, then you can go directly to the documentation section of the OTN Web site at

http://www.oracle.com/technetwork/documentation/index.html

For additional information about JAX-RPC and holders and access to the Java API for XML-based RPC, JAX-RPC 1.0 specification, visit the following site:

http://jcp.org/aboutJava/communityprocess/final/jsr101/index.html

For Java Development Kit (JDK) users, the following link contains native2ascii documentation, including information about character encoding that is supported by Java environments.

http://download.oracle.com/javase/1.3/docs/tooldocs/solaris/native2ascii.html

Conventions

This section describes the conventions used in the text and code examples of this documentation set. It describes:

Conventions in Text

We use various conventions in text to help you quickly identify special terms. The following table describes these conventions and provides examples of their use.

ConventionMeaningExample
BoldBold typeface indicates terms defined in the text.A class is a blueprint that defines the variables and the methods common to all objects of a certain kind.
ItalicsItalic typeface indicates book titles and emphasis.Oracle Database Concepts

Ensure that the recovery catalog and target database do not reside on the same disk.

UPPERCASE monospace (fixed-width) fontUppercase monospace typeface indicates system elements. Such elements include parameters, privileges, data types (including user-defined types), RMAN keywords, SQL keywords, SQL*Plus or utility commands, packages and methods, as well as system-supplied column names, database objects and structures, user names, and roles.You can specify this clause only for a NUMBER column.

You can back up the database by using the BACKUP command.

Query the TABLE_NAME column in the USER_TABLES data dictionary view.

Use the DBMS_STATS.GENERATE_STATS procedure.

lowercase monospace (fixed-width) fontLowercase monospace typeface indicates executables, file names, directory names, and some user-supplied elements. Such elements include computer and database names, net service names, and connect identifiers, as well as Java packages and classes, program units, and parameter values.

Note: Some programmatic elements use a mixture of UPPERCASE and lowercase. Enter these elements as shown.

Enter sqlplus to start SQL*Plus.

The password is specified in the orapwd file.

Back up the data files and control files in the /disk1/oracle/dbs directory.

The department_id, department_name, and location_id columns are in the hr.departments table.

Set the QUERY_REWRITE_ENABLED initialization parameter to true.

The JRepUtil class implements these methods.

lowercase italic monospace (fixed-width) fontLowercase italic monospace font represents placeholders or variables.You can specify the parallel_clause.

Run old_release.SQL where old_release refers to the release you installed prior to upgrading.


Conventions in Code Examples

Code examples illustrate Java, SQL, PL/SQL, SQL*Plus, or command-line statements. They are displayed in a monospace (fixed-width) font and separated from typical text as shown in this example:

SELECT username FROM dba_users WHERE username = 'MIGRATE';

The following table describes typographic conventions used in code examples and provides examples of their use.

ConventionMeaningExample
[ ]
Brackets enclose one or more optional items. Do not enter the brackets.
DECIMAL (digits [ , precision ])
{ }
Braces enclose two or more items, one of which is required. Do not enter the braces.
{ENABLE | DISABLE}
|

A vertical bar represents a choice of two or more options within brackets or braces. Enter one of the options. Do not enter the vertical bar.
{ENABLE | DISABLE}
[COMPRESS | NOCOMPRESS]
...
Horizontal ellipsis points indicate either:
  • That we have omitted parts of the code that are not directly related to the example

  • That you can repeat a portion of the code

CREATE TABLE ... AS subquery;

SELECT col1, col2, ... , coln FROM employees;
Other notationYou must enter symbols other than brackets, braces, vertical bars, and ellipsis points as shown.
acctbal NUMBER(11,2);
acct    CONSTANT NUMBER(4) := 3;
Italics
Italicized text indicates placeholders or variables for which you must supply particular values.
CONNECT SYSTEM/system_password
DB_NAME = database_name
UPPERCASE
Uppercase typeface indicates elements supplied by the system. We show these terms in uppercase in order to distinguish them from terms you define. Unless terms appear in brackets, enter them in the order and with the spelling shown. However, because these terms are not case-sensitive, you can enter them in lowercase.
SELECT last_name, employee_id FROM employees;
SELECT * FROM USER_TABLES;
DROP TABLE hr.employees;
lowercase
Lowercase typeface indicates programmatic elements that you supply. For example, lowercase indicates names of tables, columns, or files.

Note: Some programmatic elements use a mixture of UPPERCASE and lowercase. Enter these elements as shown.

SELECT last_name, employee_id FROM employees;
sqlplus hr/hr
CREATE USER mjones IDENTIFIED BY ty3MU9;

PK*rntnonPK.AOEBPS/index.htm Index

Index

A  B  C  D  E  F  G  H  I  J  L  M  N  O  P  R  S  T  U  V  W 

A

access option, 6.1.8.1
adddefaulttypemap option, 6.1.7.1
addtypemap option, 6.1.7.2
Advanced Queue see AQ
AQ (Advanced Queue)
Java output, 1.5.2.7
publishing, 2.3
ARRAY class, features supported, 5.4
AS clause, translation statement, 6.2.2.1
attribute types, allowed, 3.1.5

B

backward compatibility
compatibility modes, 4.3.1
related option, 6.1.13
BigDecimal mapping
corresponding Java types, 6.1.6.3
overview, 1.4.2.3
builtintypes option, 6.1.6.1

C

case option, 6.1.8.2
case-sensitive SQL UDT names, 6.1.4.7, 6.2.2.1
classes, extending, 5.6.1
classpath option, 6.1.14.1
code generation, Java
generation of Java interfaces, 5.5
generation of non-SQLJ classes, 5.4
generation of SQLJ classes, 5.3
generation of toString() method, 6.1.8.14
related options, 6.1.8
serializability of object wrappers, 6.1.8.13
support for inheritance, 5.7
treatment of output parameters, 5.1
treatment of overloaded methods, 5.2
code generation, PL/SQL
names of wrapper and dropper scripts, 6.1.9.2
related options, 6.1.9
specifying generation of wrapper functions, 6.1.9.3
collection types
output, 1.5.2.2
representing in Java, 1.4.1.1
command-line options see options
command-line syntax, 1.6.2
compatibility
backward, for JPublisher, 4.3.1
Oracle8i compatibility mode, 4.3.5.3
Oracle9i compatibility mode, 4.3.5.2
compatible option, 6.1.13.1
compile option, 6.1.10.1
compiler, specifying version, 6.1.14.2
compiler-executable option, 6.1.14.2
connection contexts (SQLJ)
definition, 1.2.5.2
release() method, 5.3.1
use of connection contexts and instances, 5.3.4
context option, 6.1.5.1
conventions, notation, 6.1.3
conversion functions, PL/SQL
introduction, predefined conversion functions, 1.4.1.3
use for PL/SQL types, 3.2.3
use with wrapper functions, 3.2.5

D

d option, 6.1.10.2
data link (URI type) mapping, 4.3.2
data type mappings
allowed object attribute types, 3.1.5
BigDecimal mapping, 1.4.2.3
-builtintypes option, 6.1.6.1
-compatible option, 6.1.13.1
data links, URI types, 4.3.2
indexed-by table support (general), 3.2.4
JDBC mapping, 1.4.2.1
JPublisher logical progression for mappings, 3.1.4
-lobtypes option, 6.1.6.2
mapping categories, 1.4.2
-mapping option (deprecated), 6.1.6.5
mapping to alternative class (subclass), syntax, 5.6.1.1
-numbertypes option, 6.1.6.3
Object JDBC mapping, 1.4.2.2
Oracle mapping, 1.4.2.4
overview, 3.1.1
PL/SQL conversion functions, 3.2.3
RECORD type support, 3.2.4
REF CURSORs and result sets, 3.1.6
relevant options, 6.1.6
scalar indexed-by table support with JDBC OCI, 3.2.2
special support for PL/SQL types, 3.2
table of mappings, 3.1.2
-usertypes option, 6.1.6.4
default (connection) context (SQLJ), 1.2.5.2
default type map, 3.1.3
defaulttypemap option, 6.1.7.3
dir option, 6.1.10.2

E

endpoint option, 6.1.11.2
environment, options for Java classpath, compiler, JVM, 6.1.14
execution contexts (SQLJ), 1.2.5.2
extending JPublisher-generated classes
changes after Oracle8i JPublisher, 4.3.4
concepts, 5.6.1
format of subclass, 5.6.1.2
-gensubclass option, 6.1.8.8
introduction, 5.6

F

filtering output
according to parameter modes, 4.2.2, 6.1.8.4
according to parameter types, 4.2.2, 6.1.8.5
publishing a subset of stored procedures or functions, 4.2.1, 6.1.4.7
to adhere to JavaBeans specification, 4.2.3, 6.1.8.6
filtermodes option, 6.1.8.4
filtertypes option, 6.1.8.5

G

GENERATE clause, translation statement, 6.2.2.1
generatebean option, 6.1.8.6
generation see code generation
genpattern option, 6.1.8.7
gensubclass option, 6.1.8.8
getConnection() method, 5.3.4
getConnectionContext() method, 5.3.4

H

handles, handle mechanism for wrapping instance methods, 2.6
holders
for passing output parameters, 5.1
-outarguments option for holder types, 6.1.8.11
using JAX-RPC holders, 5.1.2
httpproxy option, 6.1.11.3

I

i option (-input), 6.1.4.1
indexed-by table support
details, general indexed-by tables, 3.2.4
details, scalar indexed-by tables (JDBC OCI), 3.2.2
summary, general indexed-by tables, 3.1.2
summary, scalar indexed-by tables (JDBC OCI), 3.1.2
inheritance, support through ORAData, 5.7
INPUT files
-input option, 6.1.4.1
package naming rules, 6.2.2.1
precautions, 6.2.3
structure and syntax, 6.2.2
syntax, 6.1.4.7
translation statement, 6.2.2.1
input files (general)
-input option (INPUT file), 6.1.4.1
overview, 1.5.1
properties files and INPUT files, 6.2
-props option (properties file), 6.1.4.6
input, JPublisher (overview), 1.5.1
input/output options, 6.1.10
interfaces, generation and use, 5.5
iterators (SQLJ), 1.2.5.2

J

Java environment, options for classpath, compiler, JVM, 6.1.14
java option, 6.1.4.2
JavaBeans spec, option for adherence, 4.2.3, 6.1.8.6, 6.1.8.6
Java-to-Java type mappings
-style option for style files, 6.1.6.6
styles and style files, 3.3
summary of mappings in Oracle style files, 3.3.3
JAX-RPC holders, 5.1.2
JDBC mapping
corresponding Java types, 3.1.2, 6.1.6.3
overview, 1.4.2.1
JVM, specifying version, 6.1.14.3

L

limitations of JPublisher, 1.2.7
lobtypes option, 6.1.6.2

M

mapping option (deprecated), 6.1.6.5
mappings see data type mappings
method access option, 6.1.8.1
methods option, 6.1.8.9
methods, overloaded, translating, 5.2

N

native Java interface, 2.4
nested tables, output, 1.5.2.2
non-SQLJ classes, 1.2.5.1, 5.4
notational conventions, 6.1.3
numbertypes option, 6.1.6.3

O

Object JDBC mapping
corresponding Java types, 6.1.6.3
overview, 1.4.2.2
object types
classes generated for, 5.3.3
inheritance, 5.7.1
output, 1.5.2
publishing (introduction), 2.1
representing in Java, 1.4.1.1
omit_schema_names option, 6.1.8.10
option syntax (command line), 1.6.2
options
-access option, 6.1.8.1
-adddefaulttypemap option, 6.1.7.1
-addtypemap option, 6.1.7.2
-builtintypes option, 6.1.6.1
-case option, 6.1.8.2
-classpath option, 6.1.14.1
code generation, 6.1.8
-compatible option, 6.1.13.1
-compile option, 6.1.10.1
-compiler-executable, 6.1.14.2
-context option, 6.1.5.1
-d option, 6.1.10.2
-defaulttypemap option, 6.1.7.3
-dir option, 6.1.10.2
-endpoint option, 6.1.11.2
-filtermodes option, 6.1.8.4
-filtertypes option, 6.1.8.5
for backward compatibility, 6.1.13
for SQLJ functionality, 6.1.12
for type mappings, 6.1.6
for type maps, 6.1.7
general tips, 6.1.2
-generatebean option, 6.1.8.6
-genpattern option, 6.1.8.7
-gensubclass option, 6.1.8.8
-httpproxy option, 6.1.11.3
-i option (-input), 6.1.4.1
-input option, 6.1.4.1
input/output, 6.1.10
-java option, 6.1.4.2
-lobtypes option, 6.1.6.2
-mapping option (deprecated), 6.1.6.5
-methods option, 6.1.8.9
-numbertypes option, 6.1.6.3
-omit_schema_names option, 6.1.8.10
-outarguments option, 6.1.8.11
-p option (-props), 6.1.4.6
-package option, 6.1.8.12
-plsqlfile option, 6.1.9.2
-plsqlmap option, 6.1.9.3
-plsqlpackage option, 6.1.9.4
-props option (properties file), 6.1.4.6
-proxywsdl option, 6.1.11.1
-s option (-sql), 6.1.4.7
-serializable option, 6.1.8.13
-sql option, 6.1.4.7
-sqlj option, 6.1.12.1
-sqlstatement option, 6.1.4.8
-style option, 6.1.6.6
summary and overview, 6.1
-sysuser option, 6.1.11.4
to facilitate Web services call-outs, 6.1.11
-tostring option, 6.1.8.14
-typemap option, 6.1.7.4
-types option (deprecated), 6.1.4.9
-u option (-user), 6.1.5.5
-user option, 6.1.5.5
-usertypes option, 6.1.6.4
-vm option, 6.1.14.3
Oracle mapping
corresponding Java types, 3.1.2
overview, 1.4.2.4
Oracle8i compatibility mode, 4.3.5.3
Oracle9i compatibility mode, 4.3.5.2
ORAData interface
object types and inheritance, 5.7.1
reference types and inheritance, 5.7.2
use of, 1.4.1.1
outarguments option, 6.1.8.11
output
-compile option, 6.1.10.1
-d option, 6.1.10.2
-dir option, 6.1.10.2
filtering JPublisher output, 4.2
overview, what JPublisher produces, 1.5.2
output options, 6.1.10
output parameters, passing
holders, 5.1
overview, 5.1
using arrays, 5.1.1
using function returns, 5.1.3
using JAX-RPC holders, 5.1.2
overloaded methods, translating, 5.2

P

p option (-props), 6.1.4.6
packages, Java
naming rules in INPUT file, 6.2.2.1
-package option, 6.1.8.12
packages, PL/SQL
generated classes for, 5.3.2
option for package name, 6.1.9.4
publishing (introduction), 2.2
permissions to execute PL/SQL packages, 6.1.11.4
PL/SQL conversion functions see conversion functions, PL/SQL
PL/SQL data types, special support, 3.2
PL/SQL packages see packages, PL/SQL
PL/SQL subprograms, translating top level, 6.1.4.7
PL/SQL wrapper, 2.6
PL/SQL wrapper functions see wrapper functions, PL/SQL
plsqlfile option, 6.1.9.2
plsqlmap option, 6.1.9.3
plsqlpackage option, 6.1.9.4
properties files
overview, 1.5.1
structure and syntax, 6.2.1
props option (properties file), 6.1.4.6
proxies, for Web services call-outs from database, 4.1.2, 6.1.11
proxywsdl option, 6.1.11.1
publishing
AQ, 2.3
PL/SQL packages, 2.2
queue, 2.3.1
server-side Java classes, 2.4
SQL object types, 2.1
stream, 2.3.3
topic, 2.3.2

R

RECORD type support
details, 3.2.4
summary, 3.1.2
REF CURSOR mapping, 3.1.6
reference types
inheritance, 5.7.2
representing in Java, 1.4.1.1
strongly-typed, 1.4.1.2
release() method (connection contexts), 5.3.1
requirements for JPublisher
general requirements, 1.2.2
result set mapping, 3.1.6

S

s option (-sql), 6.1.4.7
sample code
generated code for SQL statement, A.1
sample translation, 1.6.3
scalar PL/SQL indexed-by table, 3.2.2
schema names, -omit_schema_names option, 6.1.8.10
serializable option, 6.1.8.13
server-side Java classes, publishing, 2.4
setConnectionContext() method, 5.3.4
setContextFrom() method, 5.3.5
setFrom() method, 5.3.5
setValueFrom() method, 5.3.5
singletons, singleton mechanism for wrapping instance methods, 2.6
SQL name clause, translation statement, 6.2.2.1
sql option, 6.1.4.7
SQL queries or DML statements
generated code example, A.1
SQLData interface
object types and inheritance, 5.7.3
use of, 1.4.1.1
SQLJ
connection contexts, 1.2.5.2
connection contexts and instances, use of, 5.3.4
default (connection) context, 1.2.5.2
execution contexts, 1.2.5.2
generation of SQLJ classes, 5.3
iterators, 1.2.5.2
JPublisher backward-compatibility modes and .sqlj files, 1.2.5.3
JPublisher -sqlj option to access SQLJ functionality, 6.1.12
migration options, 6.1.15
overview of SQLJ usage by JPublisher, 1.2.5.1
SQLJ classes, non-SQLJ classes, 1.2.5.1
sqlj option, 6.1.12.1
sqljutl.jar, 1.2.4
sqlstatement option, 6.1.4.8
strongly typed paradigm, 1.1
strongly-typed object references, 1.4.1.2
style option, 6.1.6.6
styles and style files
file formats, 3.3.2
overview, 3.3
specification and locations, 3.3.1
-style option, 6.1.6.6
subclassing JPublisher-generated classes see extending
syntax, command line, 1.6.2
sysuser option, 6.1.11.4

T

table functions (for Web services)
setting to return Web service data in table, 6.1.4.5
TABLE types see indexed-by tables
toplevel keyword (-sql option), 6.1.4.7
tostring option, 6.1.8.14
TRANSLATE...AS clause, translation statement, 6.2.2.1
translation
declare objects/packages to translate, 6.1.4.7
declare server-side classes to translate, 6.1.4.2
declare SQL statements to translate, 6.1.4.8
translation statement
in INPUT file, 6.2.2.1
sample statement, 6.2.2.2
type mappings see data type mappings
type maps
add to default type map, 6.1.7.1
add to user type map, 6.1.7.2
default type map, 3.1.3
option for default type map, 6.1.7.3
relevant options, 6.1.7
replace user type map, 6.1.7.4
user type map, 3.1.3
typemap option, 6.1.7.4
types option (deprecated), 6.1.4.9

U

u option (-user), 6.1.5.5
URI type mapping, 4.3.2
user option, 6.1.5.5
user type map, 3.1.3
usertypes option, 6.1.6.4

V

vm option, 6.1.14.3

W

Web services
options for call-outs from database, 6.1.11
overview of JPublisher support, 4.1
support for call-ins to database, 4.1.1
support for call-outs from database, 4.1.2
Web services call-out, 2.8
wrapper functions, PL/SQL
introduction, 3.2.3
option to specify generation, 6.1.9.3
use for PL/SQL types, 3.2.5
wrapper methods
-methods option, 6.1.8.9
to invoke stored procedures, 1.1
wrapper packages, PL/SQL see packages, PL/SQL
wrapper procedures, to invoke Java from PL/SQL, 6.1.4.5
PK]8PK.AOEBPS/img/prereq_check.gifGIF89akغǚ !`ښ3:ع썛\dj يzɻNkks~VTئڷwɔ.+УKNسk.^z^yaE ߀h~&( w`>(- 2 *a:"!FX,$4h8#"">(Y|@fĔA,0e V2erZ%b2eeycm~fhYlҩgy'm򹧟LB'}9(o&h^Vj饘f馜vꩥ) =W*~}0@PJIe)eUJe.`h˨b扬Y km^kmV-Jꦮ{F'n;>jJK,Flkn_`Gv!tZY@ԅ!A]8D}4\t\,vt( @"’%Lꬥw/tfbBmF+Vm2\Z]Fihg'GtmOtqB9DA&PN <9& P@KG"S !/C7M%Au2kIP}gYvLp.x\pgے`EÇv|bjڼ> :p `:AGgQ4R^p0P%2: #b-+Z )٦'ZvЍ`A E`h1oHKp^E I/ͳI}a U*a,y0-hahJk]jM;N@wxnĥ `%`I:(jZ*P\280D?{;x 20+!}-a| 0 :?65"?l\7Im@NKXpA b`N``!6uP-!bޟڡyOY"_tU?vKނH[ZU]X\Ziël\伉aŵC]57yS7qP?& Ac{{?tP-K/BmMfų8oëCi>}Rᡱ%mT10Nvw6fzW:. X෿e.~{^pp9Z`4*QKKR*( t%}@V1=Uțez7o6=O0 y,U$ ]@x`j' K,jJ1%zcN1.NbzLp?, 㿃C !x,b'%HOl Z0m\re&Ak>>~zMJ'W5;܄܊ǭNv>?-s`_|H纰u+~3A x p%PpT *h~2+uvĀՀXEw6QXQ ,ڤTRAR2/@ԦKR:hH$—~y<{w:?W-ʰa%k*ߩO _orEvWgcQ*/u1=`U_ofovcbCVXYVvFSk"87R`psw3 8K|!kwB_I@SR#py@mD02#PESTror%%peY0/#]CS9zqvCC$C(WXC7tASREz\t57rhMfSXvhtK $c`BsuXToC@9WX=*d*~A=@Uhm8x*H5#ژ&H4x9Ol>>888?:IxgRVDDpyEc=B7[A c(tL g7Da@8Sb2zKW:DW%X]ՆKBsu=A>U=n0r9M>%HBP%è:Dj=A)r(Ds]mcЋs)r%x'Zd%rQB,הS]D]#9θmuAoj ]tED%,:m#nՃ(Չ)Ήi-͢a YZHw_09Ls䨞Gj%8;f6愍idL*B(9)Srt4`S,z5餞s@= ʡ<#;1WK`vRz(`((L7G}tr/4Ds) Bu)Ft%4^35Z5:?* tz lBR!fr/" *"**"$#.: ʰh !+#۰;&2? *eұ뱀%k)Kb.2c4;52 h78<9 /" 1iāsPs X\۵^۵cacq`q]__{jѶ1w[S_[\\kx{mt{dc\j+S[k!R+a}˵rS˸[k;;n++kлqʋ{ 뻏 ˶[{۽k! kqh]a;`vPV{п#1 2oE| QT|P\oŇl$\&|\,1]E EIL$EH|ь~w\zL`|f<[Lw<LΙXϙ8A yppLAKQl't!jjU}})afG< &mҸ(=) |2)]sӭ5'l6ۼ;<ٜP|POT]R}|LQ\U-Vk|F](j,bElg`op t=vMg X,NA, F<`1*ѐ'ѧ,ҴҰL&l$ٙZ?1V)sͣ{/B <9ϣվ=\=ZMdLȝ[΍Xl@lCLt _m=6܀}6+T@_'Oɡ< PS?SP<eߟ<]3}1>ژ٨.3U.2N!,5 |h4&џ.-N@]C~(̇ḊSTi\< `Tt*=ҫ..}lq}÷mu|U\q,~PmT<Ŋ|ܙI@NPzF,SinFym@x4V,,x4yAuiNul!E Iq@d䤜r"!q@|E_r ,Ap;+" <7\uJ^ZXab"rj+檫c㸨&,Y<Ě&,@-"> Pµr {؂ 68,Lb´ǴՊK-6\'DyJ ;I>Z1p@A_V<)K(].aHp@~ʊ^uk +%%4,et'% ӽ TWmuSJ`-m(xi$_I/44gͤ;x \ x-A֒E>(C>i]Rȋpȑ?D= O``wHc mH48UW7|,(Ch]0I(Mp}۲tD8>׶Bh @87)el*&&Zl =)n|ل^YLXċl(Mx8l4(UwA%^J>d:i͛`VȵK#yЌmj}+"94 = zˣd_g;?K%FURB|p`pىp3@vS%RG$nh АhvJR4Pxr1xC$#\aAUP ,VH %c7gbB9|T]b˂|Kwa/{<ͥɚ($hZBSG `%mAbПNJK0ʥx.I9nep,~.|A"DB @YkŚ\Pz.xq<Sᗋr囥*gE0* fXEopζs >-&M 䀔y`-s0mïғ4nuH\]$ (bH"cq@61TtdI nP0İc˴bcC:xѦ68Vk,@ܶЇ#xKXP0a3x(>Z4އF;ݣد"i |r 7N|  ˦$I\W$<+1 e فd{RP/Nt)Z*ńmA-@`:'&  ,L gkἶ{ssacM<" tpd'x$S7`Xۆ/H*ug9Y sgzgt'Yu.@p$CH$4$Hap@%(-r%(L+OY  }P@v29K`:P+p"9=1 Ql py7"1cK^8 DfxrY E+qez20i:Xq2rp}S~p08,o^u g8 0~}Ѓ4~PQ~RP.#vGF(`P tJX3$rygKs>Șa# #b9-Auئ =b `>}rB 1SpA -oW31EV/(փ@ E8)KpOP)p:?T?eA]#E`7f3LYQ5A'rA5/9-IH:c0xqG=)ڧ`F:yX܁=9T@Q{mp%S`Q0QqBhٓ:qД 2j"ڷW$D`(vD0d n 2+\!y'-uˣ&)LYљ5#)+,3Й7hq#&c#pg_A @\"q ƹPy9Ap0+90 !J1בaVs;G:xHL9ҟ`z39 j-)Dݡ8\BZ_衉2hI9Y`?B$%f upFiL~u#@=`vD yp3(񩥲4aseC5oQ))0:N D皮D@2   B:j z꺮* 0?w< y rpz0y^53XY;CeZzCغ#aɣ?C$:ΈDGkXfzUFxI@0R U[qRPhGZoʴ+Aǣsi1 D۱w1%t,:3x_aCpP):L榥q65;a)@(WynГݱqn ѥyاR0?umГw q+TKkG;8rp <5I:¹{{,y}5঻hgqt !)L!Kkx)PQ Q:qp0kSy;{6~HkHV<lxT@#SГ# @WLR'ƪ8`ŏffPc-A|k 5dKPFP- R x tɖI pp'S|\#K\-],@'5,گ:{ԶّۤFvPۙKӷ-ǽ,G1 9#i1GF1)S]0c%pH1.S1 @B]9jrDk#֕-;!EwѰlPFZxh 'N$ه^ļyYt+<ѽڟQK}4α-W•֜|>@ @1HNe")1F1pm}pG@2 +,)]~ }")ui~R#k-1: TP"tDN2@6~rӾ Y '+gs).ӠA2^B5~ꪾR2G.uIRpCX (sx`X!n(RmH1`d=P+ CpBn @ Pnk,ƝhAet:љnR[F I`lv"RPE@ v kP}1eШn%ZJ Ϋpc}WS_umĀ5+>`+ehSꛐPRkWnptLkE1dnQ+ݚ) R0OOKRRmS_K_pOmRKp+mmcSTSmn_O_mcSnmKKp7v b]]B-H v5ƭ}bm]6k5嵢+*}7X{k vү&xO7(A.3FsAgɹl .vcԶg~9{'Dvoߡ^AK3..?0D[|eS@/}O?][_c? 5ύP?*n']Z[)oxP JyBb Z̠7zc]4Ε"}{ۺt nanaص#\$_n%- A8-: P&P,X )PX\.rH2B8q Qch&rkGe,L[`pA:!x p%j ("bE\I7'GIRQk[8JX^ZriFZՋ/HOĐBl-12PL5#G&VL2`Hzrp|\QfM|9 'gM?$SN] 8dt"EXp->](s /ȧ8,  `2:t p7JD:L˙ti{(pd0$b(fM5/ũEЊlхdL=B'ER'>Y)ڭ`WS pPVڢ--yN53>74AQX%T [ N!q@⨾(lVs@NaNgKd|:-ELd՟dL8J"O$."EU?JXAq=*)&I

d8J 7"P[ʗxLƥ H\.bğ'Bⷛv+Y%_m/>«^^o $(=M'p4t!SO/mYLPf\F2U0ED%__sݦ> +I`fK<;V-o>U0!@7 ?|[`J9/}QP<:!K*ؼ ts_΃% %݂,jki+y08SYDy{D+!p<M 愃zJ+4ay|a9%!@HBÍm~)x3#~cq ~i ȁ ̋V<W5a1ꓗ'ggzx'zdp$ff`Rv }x{xR^B' ÷I%-P^JFn  qG[&+pzAc wwR8xWx']'#G 5r@(t)Łl@c%4 +F2'&ZA2ӆ bfyn8E2lqTx`&MeW;@]A&F?%`AJHQ=_.QaRu1VyWG rE 4nUA*RR~'r r0G!oF{1)%xr UwGRq"xpobTRk'r 0 :WsҴLLX1W rRmx x%XmpyϢ_.=y_&+0Z($ 'lvАI&($=)}g.Cma#5|b/0&Mvj' wewn(fxQ]uطF `00l˨(Yuq0wcEcЖؗ~wx"ԧ'b ƈi{İxr;5ƎȤ'd)&] ]`ȒrUBzq2lrP&e19_G"#+@8sBzg{(:p:3P([xX* ^% &3X͹@%p_xt#'Y $Wax&s{{w HIzg{HxșW&ڢ`ZP( dvx {x9/' (H{ {*' q0iSI%yUP';Z: X:tjS)r]))6ZzI}p"xo᠙b`Y}'y_B4F&Wx&`U(r:hXvR࠘HQ, W} kȎ4W~ La[6™ x& 6 Z];,yĊ nj&XZgtnJn ]li;Ni]@ P(`&I:zEhO(b5 5UY Wࠊ Y}_;hljٮw}`I 0)^Tڐl_lͧLP\zE*mpzlme7{ X,BGh:TÌKm;g(Ŝ<5-#o 7F́r|iŬ vr!u-Rq  YИxaQ욟Zګ}Q fbTm3f51%0%MYx85ZeepM<{%1zV[N O{y퍑?_F_Ԗ` PYxTٌ'Z zŴn0B&5FFw<#F'u[W('̈wcMM@h)nR^u!%| 2vxu8ccnmnTQQTcnRTnn0nqqSS0STSSqSQnT0Tq0QTqn̈SQRTSQQq[2ȭ*\ȰÇ#JHŋб@7ap(SD '@.993?+H)%)pӲdm.LRm|٦jԪcNRHg)m8",)'w@DX(^Rr% E)Qgk!ū`7Ʀv `*QjIRqah2(iac&iDL6y|v 'AMR.E,Y- ދ#,/gm|j#d <Ⱦ˟?u@d@t(vBȁ8EJuyf"lw ч)qϘ&۹(4h8x37ED &c`` 4;yye{!~ddH!|!@d0X#9ixgFq~gDH BJ䒐clyl[TŦ[vi \o4L'꫰*݇Y*2*lF)j)S'hꓟF6dYBU" 9ukgGT*(: ;,a[jB+ 2ЅhA; Wlq;z+[䯉kdrn"00GBHIBb"xF ?< N J'8ˋv \`ʧbgcm'͕:Q P0*UEx- m, -Zrn[AMMy&3^dOC u7v@ :j`곏-4{fgx@{,` i@:g*8x0{ٷ][!~!/~nY>>5@|W~}}}5ppFwg5| p 2 6 a/:Q*qq *oǃv# wdtecEVБzOzd`sP)GrX'%wqBsYXRg~T$zSHo 'TtF{#~PvvH6{z+'@aw@|0tou.7ؠTmGؗ@q s~G}aqXgz7twssPwrpTwh2' p , ^U TX&0n *6nyi`(hbc`%dwPJd9't?vp-|`PvahȶpQ}اvǎٷdg7ri C{sqVHd'B췇~}.>a>p )v8}ȉ}hǑohzy}j|dvNl2}7R'1 h!xx0 4&2G *:2n׀P QPrQ@qTdf&2pI d(dQ@POFi# &LX8HdwY:O2Bsis-X'8gH:c/'ِzYajI2c?uYjGr 8rAd hu0ג4wpxvg2  Tp "gmR"[7s=,N_Y*`'_[ *haQ&-vdxFV-טLwu`ifIRK3d*Hzi7y9Zg ǟ}vQ}v`GW'` ` _U'mc,mUA8i&c0= 1=/N9Q0 WuIQh 0 `56lfdawd oJo+dȧz0Zawv@YL9` ~YshZE0|"2dDi3`F!E՘LB *G4&Q-6bQ&Mȍ,QXjޥ'ˡ< ΢:2 P,b(H{nlt:ptW'`X #p3B%BF߀(!pqv(ʄ>I9FO-B!Χ͆&V3:̔C.( >Oa Q/m4jxFf-28:ÜLKa}Kb~!SdvEQE쥅[IY6"`BHՇb1 Pd.-tl'AWGӱ@5I7L`LX9[BVЂ1}Ra4a[4Jy!DEDTB킁1>Dm%tD2W'`K BPIueYT剐A@5w̑ya`(+0JZDZL,?9DD@1`؈Z11TfJ a0#@pl08IKCDG!hDx` 22C`"Ј)E:!ȨE0f  rO4#0E*D"ҹKY3$a#q2E3Bg=n7)Hi$tHNB" sə$>F2|4"J6r.$'^*" && h ,$K?ьY&IjfP)c(. _889g3jH)>$IKZ":8  a_:C`q=iR/HF71("QLXb?Th!%o E*ttD⒆9EwdEʻ lK041s҂B8 CK i0dEX́-|)&Ҡ`#@ĈJh7FH܅w\ : f\=82`c9]CuVzLF9q!uZ"@ z $q*ZoݭS:')/K#a0Pɒу e%G'SR[H V51 @ Pɬ:~M\oC+4ܥ˼tE9=iIw-A<}yEzrd`-c"&++D̔K XzR0A"/r 2a6v;&Kʺ}gg!H~XNBZ?F:ĥ-Xfz-):$aL3A SeLh;_[IT@H$u}ƣM$$Ud\0ŌabG]~tiΘCz:w~[X-ł[GD:O#:9ry9 l :d}cZ_Iΐi6u,H:FXh, #;d"b8#l?"\q3tudpL$dP -\9.,XdkL/J yPQo„>Lfn7я?ydBzm#0~^5 F]{/sB3>Gh7[X4lC:GU^xs5XFd?HeH'gsFOGht~dD``w uEUPEfF+wHG@|5#uXf8q}ӷjUs!7"n*$zwY0 VZ\\B6a2+%Ra{R-[G0kc %oCaWcF}&TAUya`f^1Xs}5S'q"%s\ 6U3rw({79NJQ5spȊE4s'FK 8'(vWgJKdQᗁ#wUHYy"xqH@rSepl$``TtrHJȓ16'uwՇ$[xG_ vcHI"?'Φ'tGEEJZh9Jl^GIh atTPwFgX EЄP\)`' |&dPț!%+2p,n R7lA0  7zuJ7d[y=%GpW#1QB#dP9rA=8@D&>˔B#(d2UJBcc;*!40&TI& 'cWӊJtU06nJ-Ud2F 9yERys :t$/ȭkDd` #d"QlWdY$eF1J$e)q:!qh:6 Ny#q[qC8"ٳSe/!4بO7ŕű# @-˘7UEdLc3'Y=ԳOY;:6Ct֮2c#%P+K8(hJ 6 zT9WixgB:z 040 y@$Y2{d?;c dBOI|7o2v,^&A#*.)[&!RJ-`sA8Awj邷{L=_YUi]U()s0\e:Q9Yi9q?* {Α agARQжsO^S#/„{r¡JeQUea% A(" @ PU2 j0.)ap- (BLd۲7:eQ s"A8b&,x(O":{%J>?!s j |w {*6\w` 3^9=kR;Á0* 8rH2Kӱ !#6ǒA/ E$aT9!OQhZ"q:C 8/Bv82E#/2s0 @SkpܒB?eHs1=bܲIL'-*]rAiWpbSD()gǴ5e-;K #\ѦӲA( !|A(r(1I7@ye6Sчg[+:2XF_j2ĺ =:A3H"@p &1Гc%8I(8Ex%39^A'q"A,2Ae+1ʥ2>z,GqH%?61'??nmǟC8 ;8a: ث' x-,A+(r"QϚ2?s ^CF")( N͒E,gO0 f{+j11.٭&,N;Zpxu.ozx',q"pO M/gbÒ^L],Lac h8"xh.)Q Ӓ̳`5iP}}wUS8+- -cp'4 P*0A`,Q'#= F>35!Ƀ ^ ;RU\d(*7qށ_(|B2/ [jޥ.iQ`9Qe؅1 Av- ^{ ,{ad^iisjI- *d׬F]3K'"$(LU*W&$bk;Z *1"՜7&Q q:Ĝa=eۼ/.;ƑcLU*V=TK,]*;R2P+6mh}yEʰN!ı .œ""蠃%B =0S! b !Ʃ 2SS e"AZv̮r%]ݶdVf2`962NB`GQLm}0w2aҲ1ǝ"@15\- ٓA8c@;A}Pe/a:M&2- T0Q0 dd55s q ny55[0Q[X0TS2d0[5dε5UXXd0d*٠c2sqTdad̂ C(\Ȱ!F`pꚵ|aM Ce(3@W&&77e*41 +vBR(JsiqՆPI]Q' Bea2`.jU)(['jM,o}蕸@2D W`(^IE,p0li;(i(QY1)+ fTCGkĹ|,B`F NR`&qtaaxvJ$S|g(clgUU}A_Ag &+@13ps_PG~-Fa(2& a!Lj@0BVq ao(f"ٔb)[ՂA -XN[<dBCP.LTnX`tFT4җ`f2Q@@[qf2d%tRQdFXI5}*a aeȉͣ*(pfQD)C\`TA5UBiC~Z5ZրMCvʐ`jR=˩'l5Zȷʢ9k* v'b9Qbn6Q,b)n 6{d0LFC+T1i2ʅv,CdlF$l(\`[2Х4@HL*5Lqfu cA0ZA HE`vEHV*\z  LS kkZM 0| ݩrQD:;* +Dq2-< etj·뭷- +Qp ezY⫌0B5|/>| ]i? k y)*ܮw_n.E<ִ%^GCɰ-gpTA -+Pq89uz[!pR)9`Rd] N; Yvk,0 ޖ*kOJD .{{v\=JHFڭJ7XL4>[-"HFx& tU"RmX@)996D>5y*Cf2cÒ5+&vQYb%AfDEq]Q#2; !t %^Q?NH2 t@:YΒ 8<'iG4-(A#)8#R%6R0WQ\nVKa;G'IJ^( hի1k*#Ӭenq%`.|Q%&T9߳@@7ʎSn\;s9 ť VIʐa=AC\RU$%`YƠ2iVE+T@ AQ)u΢!vA.cRֶjB'BZd@cjא$\7 teTs (glps VgJb?P5Ǩ,x3X)]+W*m :WR !p0[Q4ꋗZV`I|WhfBL+`Se.'$T\Cy8`*SY[FJbE"kS)U= 0:W.Y%T #nSyTZحI;dL`uL5lN_V 0XPb*aL;ڑNIia rqgpS5$W܅0)po|/K3G 2ڹiS߶@_no\F9oL8Σ ^Ut >Lx]5*b,gA]V LkũABHG!`2~% _ؾDRU3>n)N,Cncԣ& {[֍G\8MJ8!n˷)PnRR(@OD]g..5 ^HF?P &iW5* @ Љn(.I抪n I`-='ᢶƀ +VXYD7Jf$VՃZ L`?+un]ȵ~.pGDxں-IՄR4&}buA|4#Aon zlp* C)V,geTP^B@BP^{ķ+:XJ2l P dS/R a0ϵ+."T9.~UgpxGRР s}v%xmՂ0ruxNmLAFv"Y(09׶T&,b(!sA,rM  WAe #cGNŐ ?"lsa*S"{ Q :#?R?2{1rW[\ #/O8dE7luytz!0l Gt`h{-'*M*VF|EPX ?a{;#/ h }N`@- 2L c  zl$GQJ*2DҸ`*ފ_q֙<ɪ#/D AU!u# $"d0P 7P ۘG QRT.:J$0adx?ZGi3febe04Pf:c]I;"^Hz0 ]0$fQ ~) Q{䠋2{) erqQq #w)XaHz@6Xr7DH Ћ5i%Ь[y в2 ւ*  N>r(7@6Ȁrt '`<9:2 $¸@w HDQRḨdKzq5h0}Q`G`) # q#ЧPH$ 7K Ї*+H$(LS ѝpl9 t9zcLxs+3WI? $XX N p [O@ !T&Į @"2p׋ +0 V ǰ$#ky +`7r䒢N~r{r#Qʴ]Y "# 1D|瀑$4dIɑ8R6Eۗ!)lc}\ 1li | %{1:ѧP &#_1$d% ` 9 lˡ"| Ó1,ø;JijI@y'6m&'i Q@ pg"(L$ 0yQK nT1y\ YGڅ Cx D \h4[5rH*]RҠDAxRҊb]L!)D€I1 x.r57bnB Ah*,hHҩlbH(CCꒈ>EAia4,| zc) #]cSizDI*@Wp\-ޥ7_-NDlEVHD)IqtzpxáÚ=\EfDȭk<%"\ҥ?i° JB}eڥ,M/T`._ˌ1)!b)5ob)ɳ(@L+n/ڠ=s]@`@ 7SE4z{Ճk`-|\Q!c C1j ;I 8XB% rae*H$丈AxTd/EͦEc1rx<2]G~H-b`2&<ݐpa#>QMFd{#N\( /`?=5t)w?M;E.d@t j))!-AThwLQuT"A6n*0vhJ[2F*@H% iTҽ GE"5EhL 270sX4R QV_h :\wB*f?* ViR+@a\@D~7W 2#V `H7ṙnIٗ w_z  f ݐw5{ 6|p=F|c{X~ (f f>!#!'caz?N 'XZxp26%vxx\' PY6jwz<S!1p5 V `h{[Wd'7kASPm#vy;QQQ~86G_wa6 f_Qh _85Q nD `c ܶgf eU|wkU gP]1 y 'QP u8 Rlyud nPWjx;ff_5 gQ]qt'!dP*nX'gVvQ \f[y!qՍ26D_M(te%}eQ #Cw .hywyhXƕ^d* wWDW:3R 6h_SGYA-#ؖF|#ZڕatY eA7aHWwJb_Q 5 ݗPY_e0 &s{(їA`fe]чaoyx|1y gc%q=_ut d 0V uvq?` EHV6#򣔦/I6X}e6TuT 03ψ pvHrV1Wyyc8|&GX}e)g-eҧyX~`)GQ VF]}Gx6Ji:*."9~x1i^ "/P1'1q~SjJM1s:#ai]Zn2 )GE%PjC/q,5Ƙ}Bu@oֆqq盭}Qgyz4q(Q!` RdV}2# C8亯 y28)h; b).O7!9a:Q]F -Z/غVHuvymh_PRTpzҪyd|ڑy5~p9n#t6f_2`_#?nyԲ]g *]vuAyQj7 Wغa#(S˒dxuTN2Ǐgeqwr榈PGP^hXqIh{)k2@;yUBȉ г8y8o)qy 7PIcyr0v[^{-WZԙl%)])hЭX; WKv˰۽++Bh"H/h/GHnfX0`%0@#pIu8K]4w:ޕnB"Gc8"ڥq[Ǿ("/y;(#Qq^9+goxfk[5%0kby!ʼnǙϖ JA+L򫩅ɋ @o4\bcDZxv^][!o|t]5rrRd>k#!Ge~H c E$Ŧ]ߴt ՛y5/G_, xc8~׍V& A^ʬf}<^>.֭k Aio9q-F0=!PF׶4O"Ab>d^f~hYi_ ifIYTB%RNTnA0"l芾荎^E> ԕ|U _s꨾ꪮg>^ ;}is1v᝱R<}׀#A?>N^igھھ.\IB jHn.` rM$ɮ疐 T8>Qnn]_븮ܼ~UV^ Q`$￀f*,,/YIFOg)NF@?gD_FgBGLNPR?T_VPfWD!H2Aud)T\^g)ƑQCs㕆" }'fIlזW4%=ߌ!+eOU?eOh^6?$c`F2kfv*  ϕ|rO$*N7Sޔ*|0#//h& >(~2hfv(WYh" \{&6@{+^+GEWEuHRT-Hՠ]-30VleXnō8(Q@A~&pytfx|Iv)(jk&(.z裊B:wFjI馜v駄F(EdY{jd6ơGf~Aa9~ځ*~ P-rdH$5KsU8dT aRA=漴 h/kg:g 'b*qWlC0Ʋ,h[E <)J'/<,<;"8y-3ҲU\0EOG-tTQC p(']&|`'˫ar=vlp-tmwbD몽=6g6v ڀ3}6f^-݈OǨ.C]$TPQ2K4ӰC ;մX & ld+ f7+Ps $'Gk-fgʷ^=Ջɻ֭8wU,3FIN%a.;9p:Xڥ*OL[wlGH2_%W?DZ=\:S'b7D qqWOIul uT];.H] * h4(;YB@:xD4; yJLGV! H$2x["DQ03@ [VEAa`@6GQY@ĔlaHb&[ZvAy'ǽ`5 G6}aZ5I>qJ(X9H..3hfZ]CֈF >=L# "ͨF "f-k nʏ&?gX/,#e:Q423]$%< ʪcq2Fe VIݒ ]+tXDTbH.OV&׏EnrSaN .Pa.,dY@]6 Uf\lkgzm;Zڌ19AH.ta# 9 -d74;-l3~Xv2+)> 3Yxs0g+X!pf1: .Nt>ց't f^zɖN{pB’Ŷ&W{ m PߦybnS~$znZ[ts Vg?[^jgAM,hu@I eKi@xKҮɢuC zۻ9|C3I'Ecv\ N$[#Ժ ch @嬆e_!Y+PܞsȯkwUVAaĒ9ct_Ԧu[!HMvzV3Vs./8gc=__v3aUwtbWlY W@rgoEa?K̏33-!,x~%SG,62T~?_mCsRp4Vv< 1ՒDȱk}Nɧme;~6w+a,A>,@9g˸t\ aϾ8M.ΓhI^̀‹f_p [G.0;e?5˦8(sr*"gx 2^tcu2XCc+=;}"d>9gMH?se[B2sHsCuhpvi'rx|>g>8wr-qE=H B1bd wl.&.N!pq! ϴNZZ~jfHi!!0uSq2iQ*b8`&p&rh}؅_{8^xh(N8'|8RxXm2x*qHQrȆHȈ2_'k1=+L0.Xh腛XeffBH3P[hH  pGp {W;lpvp7{@xofL &ED OYx9xyБ! I) /- +y5 P>&C90:299G:YQ MٓAip2IɔbYfyhjlٖnkɔ")3Y5" ,9Z W**yHp8W4ْ9`a'XٕM)pKpq9hv87wl|fb"Wg)%&La"gg*#ٜ9Yyؙڹyٝ9Yy˹鉝ٜ9`H;h˦vA|lgho0 ŠXa|TAڡ !ʡ# (*j'j Jz2$9J3ʣ0-  *:>JLڤNPR:N4ڢW*DZI'ڥLʣFEj[ cZ3ZИ[Xlh?X>vY HU:RĄHQ 9 %:Zzڨjک:Zzڪ>p]@c8j!Wpw j b*B zZʭ:Z4E6x; gJyzؖvZӄvLbB j ʰ4*,<7{Ў*jÊ{q~|ZHJL `˨ZBKA;E;H G۪RT4&[DC(t*7A80+4+J btk$D<XV۳~;@;۸Z}{1x!ʡꭑ{G4x|U3p.ggj*{- ڶ37!aDC4Fx#R m{++ x[۪ ]_+R K ;{Pt+!``[3 3krq,g+%J @F +ڛ 7|<`+|˩+1òڡ+=,}]P+áK703Il@cNbhL- 7"x7".oV3f)-,4lDN{NJi"D&Wg T #22-9ˮ׸znGmx v_u87޷iMw^fx>x؃.褗n騧ꬷ9Iqi=6ؖo.w]zj579M]=浣ͮnnzkm ~1 0C+hXaƢZX,5>j IPprVԦV!7<bB@7p'|0 $$ wpv 0!ϔ%P8i$U j *ܠGX1+ *_H&ڱx= IAgc( qx,H9`&@ 0`' BQ  iGH& sp#t@ЁGp $A т80$дI' gxC*4T 8ƀdC<Izs>O~⒗thL'YH6d@^dLkF T0=h^a]~.d!*ޘֵkA)k\ͯ~0A{}@mTSu_\םuGԕr{jmq;!ш܎d=Y>?E tpT{o XSX.Be2{a,W`Lf2Ej=#`6Vpp: gY;aRvlڷ 7ͪEXlH8`5M:01gJaZOgC90"<-W^1PRgv^BȆmf;|(Ak!_>j> =x-% Ӧ3pT[S~m^T_gGPJpІ~X,Hh՛jne,"uVulK̾_|oWEF-|b8$5IAZmιwnצ ?ӳOgٜ:-@=u@6^rln,=ѥ$Yf{_L8+I .A ,= H|gO$yy3^ e6O_>CG/O5xS>/_o_tO{Obc~ؽayϞЏG3zھy=apZc>w;|/_3TvjUPqg ^fEWrA3w=Bq9$'x |O|W{G||}y1x=ۧG|GO7z{{8}B|W{W}g}7dOO`}W+(yPgT~~b ; C+=3|Cxz8|ԆtHOWO PAhE wЀ T $4ҥ(bakxQ*FNjy煿H>xQGmHD@xX7x7x+|x`}g娍}+W}~Hȸxx߈{eXI(x؆~Ȑ+N~zxS$58L(}WHyǏOz'|.)ȨO:r.;@#:#Pȉ}P}ЀwE9f#vNJkIufh]@xWF1xx_xG=S'OKxwpٌ3Xq|z@@yHYH_(|٧i٘hh٘shؖG׋nIMxsr*X؈xxUG'Oׂ-z& W~H?\#`t탎g}ni(眓9*xlP~<)8CiGwwPxOQ؁y|Zw_@PO UX  錦Iy(hwkY>3m(z__'݉$BJ}ys؝)x$ {KOi?xH0L(yy{أw1ةz#hFٞqWJhvTiX4ҕ_$ lHpY|j`,8K1HX<yi}N @ڙ^*ٙf_Xg7l蘫z)z94U~ǃI竚:IʦZ5i1ruʉHq׉K9i1Q攟4 x@x@TwHIĈR=Oh|* *3%J7&Hȫǘ@87 ~O颈bجT{^Y8ymJɭ9H‰[zLF՚)׌&Zy} J8f䛜մ%xw{4ﻻ)rj#;9¯vJMiNY{WSY 4\+\˕W#td3Cǃ+i lzn;-xj<.n3<G:ی% W:PR)وo9y.ƘNQފH?+ |7y*|.^ڋ7Y{.h  {jpWZvQMaIdAŷɛؗy眏%٥[gǔɮגnHO=腧EPOyR JE8?X wZRإGʟ,mF|RDc:|M9\lϴW=RwiaU {|S:WRJ{q8x'@y=kzm|Ƿrħ[H}7zSӟҽ\:=}u8~'M݊sZuL7 =tL:Mw:xc%2V#1ٔԟ)Q{F+mVd;vIv]wTtM :Xׅx} )MXׅB=S{Ӝͭ A}]ٽv=RbDbV?{M؃MzMb+}Ļ$ֈ fmwnmAՇԮH=J:\X:^:X0/:nR 9 rZ: ":~1ocOO:<..:J$1 \y ,.2lW$b OLv(M+ OV Q(ұleg@N"e9ÄSM^poR7 ή74Z,A2/b2{7@ Q/c#x#KA@`?#noy-طh6!/wld{i!esZ{H?9n'Hbgu?h1)VQDNoU(MZPRrbbbǷ­ʡ~~ˣȲς +H gW^WZXɒEo $Ȱ!3d9C-P:p`gC-|ԨB$I-^RbFk@͞=:]2QtT"X\mEkܰB*ɌZRjjUK^3Yk;+PM;A.mٶ5Ї挕<Сa SbF0)dI)ĨE%FÆ͠zJiI͘ 9b;irnw6m`_c W|4ƣK_ݜ]ɶٵ@CnmY^Ҹ ^{,AD5FAQddfy,}6N@qe7(l`]keI|^tSUM&b"#(㎰]%rń8H3O$J.7qPFbs\.a .P YAXF4QEPaԙJM45cILS!71̒H)(Vӈ`wyf+IșAt `&* t,nv $P1.pkoUi`nk.) l0"oQKd lVo,#ړeXOt`!рLepӕL X ؗ__)Ff"ka{f&Zi@ Eiv05q&bX)e)$)ǻw"pDI9"vD)B$p~svǘseh|#2ؑW)SZ ʷl;yzj ?:N{X(%ЀPK rKd@l+ǻpȹ/1 \ C/{%+"!P!'s;$h _->"U l%s5P} CW̹5'\^j0c2#Ob*X`CpY3Mp=4 G s!8,^Ġ:l,Zw5)!i '[) S2Ga&.@KH╷ O}{  EpaS#e(.P}y dFC4{xUp(ɵ-p_#X\+arDgCLZm%K09UvDf@wM{[$T3z43tH(ZJB>bx33Ep\&34_:I |) ]5L`5bSSmD2JNAEqKE|00> ?ABKM^J@MS]H^5,I)e\x,@ɥ qBh p_]EO5GK?Eh-} HK"E酀 H1pC>(P ]VMRB x=Vk: ]fצ(H"WO.L|@RL~ FՄӫvvUf;p-wnK|RŔ D'$%**qb I\"Df[֢ΫJZ"׸|\)7`ctR س 8@{u=-3i8 jL~dF]w%'|5b*kaKjnW΁u=89.#ʰ >@ jiIZUIq3`;*#OxA(ۀ,L u0JLIJsRSB[X"x?$Qj4ښBQ!yud@InwUpeÀ*O㵷[Ì`*gIz|k&RQ ͏ũaq=n|egjײΌ =ELՓ`=g8IƳ󉿽w>NTg?|&U}Ǽ㩏z|{뉟bꋴk_{JonO (Av@Oo9tPbSP"D14B. xY5 Xx!8 85&'X*@+!8(6a46؁:?ȃ4!;EK 56M(EE8.NVxXVҁX\8axheHgHa #|}{w;y§.~uGc ֲ\PfTFnK{@i<` ؉8Xx8D8D؊Љ88(؋Hh苸hf*c،ŋȸhʨx8XxPp}q(!25q{x8[qop)~a$ܦn'%p ~@ 3`~@`㡎 "9$Y&y(8Zd3P/Y1 3Y@298y;6ɓ?ICٓ `~pRJɔK QB@D[=ܠb9dYfy U {熽g+p1i nQg ae+}@vBiR&\p;Ky=P+hy(ٙ#dQ@wК yI t隫+@ ¹)ɩ3,3@9Y'陛`m{ H 4xa,~ٞ.0[g"oPYdE'B'RP@t\%tp,Y[`_ Yz 0`G K)# $)z%ڢ+j1 (5,j/92z3ʣ?>JDi ڤNZwYiiY^P `ȂWQGG ZP!tBu0`N]bAPQzڨ+ZY Yk6i  ꩩZKʢjJګЙZzZSzzڞb @,+,S3 VQp+ꪮWv@`!I, k:d9 G`$v3y [ c֐TI۰˰e&{(ISJ nDBl˸CKĚ*SRU XWTlZ,ƚFi|ƿhHPp,>!@Py\ ]LI|Ȉȼvo,kǐvJt.0f z, |"L&( @!Q'-WV>\'<2×e [ٯ(:I͛^^: ꬼ ~<"^0kWHN9H'>4pH P%%,˜٬<) Gҵ|V&Ew5p('.p4Z\^`_nand.h1V n'm>rT*nu4NgNUUnVDs1N\6)3}{i难."ΞX.~xn$^dkRhPA~?,乥$GN.mKQINP _`[>^~>>[v/.   O"?$_&>(__[_6 q!޳(*}JQ20PT%@WXZ\^`?b_dY_WO200r?toxU|~Wkڂ_/oO/2PX?y0@p?ۢxQl TO?wnot2Otv_RR/00y/.&A"A/D+1OR&UR"EY jjE}f}kWVYUaaUYYojVf^fZww}}fƐEVg\أڨgYWWZ^Zff^Pηە+A\Ew% 3gDejT*.\LK(QBV馪$+VYDd)b`-ZDF˕Vr ßY1wEN?1t 3 B|L 0(S`Æ X>>]h+Yݻx1 U)޼j]Y(g+^ǐק5>Z[_‰#WNquG^ͺ5Ybg!;lF>ɀSF C D*Ѥp* \ʽ;P/E%vi _A@17gFԍkW6 ,-*Xx5YT$ L^ 6 $r_+}cua=%#dV5yY*(2:vjhc1l"89Db*aA5`A PbW֠ed—*@ .@PTNj@ Tƛp)'f=U' TIvWeUW|~"Є^*)Wv HQxʒ9F㍬z"6*xv9@Gy (TQN)LfK*`B ,tsg.+ڻsNNkO hRW|G^a`q%FFOL豪=@.2<12 xiRFXԴbjԲ¿OHZAh0"4۬>F,2Bl*)ky|EЅd_]^@ m.m|wi_Ѕplh$O &{ E!ztXǰt LzXӿ.Ȏ'lJ+2Ҽ/~d6A -ڋ3^hJ"5qH* +/= P2|PfЂ (@1|!g`O88@.`ϡeQ4 |-P< N6&̜p:f ZOr" 2aVHL3( ax+#FZH8MXY aAІt(21hLD#dqA|AG12d?Q $Ѵ'P{$h]EDa;qA |%is>Xa Rh1Na; L̡  3+7<]?̥EmHɢZoa`{T8>oc" @BNS@D`PeT9xYdxAҒDUH"$#d+1Z .I9Ѥ-3d*;k@ eC׎c$TNGu&)8|J.@;7 #T*эtS;85Y(OP*;N5mG@ Ea#PVCՑAP+d';(BfP⮡ P'vc$IZް 4TA)q5rCEp8t;2<z<ʐ2$[Xsmxeנ6}psTV9a,Җ"2=$ 1fIXBm& .umdir2-W ƆR|PT[_`@[v*n!PoN TUM`p9W28ш FHNPBc`&́`{0FXa JJCюGPd12v';?04S,ͩGC'Nz@Ό7; Xf7+ {\0y}n@A֨DYy Ze.^岴#`hc'9z3Y3kv sF[y@5qB@ Foy%Q}m8bL{1^阶 81S႓Zn]fT s<HʫnΠ8r{|rF`q4S+аN`[ ,`2c& 0`f`ހ@V bg:_4$f؎[Q#;~(n _"l!i4oǰ+"qD̺H F*B0 @? V\뚮v98~h@4{ ha0H!:R!GqoV gFN2kM!e9!A˸$$ָ}^↏xOQ/qesT*w]yOVshz'knul@tlK@tp]K0DwF`F`G9 @gUXfvUۇD J AR ccVp v"Vbi7Zb'=(cj gNyaUUGVsy'l8'GPG2kLJF!F!`l lPWFt&8fW5 9\mAҧ *Vj:& QxP*P JY8q5Sh ^'L`&6[qiHZw BTVs ٓce*rsϥu8o$Wb"F#l&xyD t0FF'p2 jAc)A ag(P'p hgClw׈ZQ HJ029`i_(\UH*0DjGbU8 frWGrFu1Wyd'z~`P xsdV{'{!T@ @7@`$Whr'_mUCc*Q )0Ê@powgk ~Bw`X374)>C ϘQie8[hx{G,/0/!\X䔖FUd@aUdEXaF(!uduKVp +bfbku0.' q"fOe[IeQP>jz&  )9ȓpiDWF`&Uꕕ>U{љX6&yCFYOeuhJD$y9cA,@hPw zhZ HhSaD* `jHh\hd WQE*'@sYEQFr0 )8tD0tK<Ht %F'@FJ)cI Ac֠ ru =Y0\ h$sva;*aboi 6i9 I>YʓtZ3puq(aTTP8dVddZ^r5WUE;ƀ6'2QguT 6Z@h3h@K``@kԪ WHi;*A)F* ړ)],U pz!o3j $0:;bndxS2r*Cx { kFu(kzUzdV+zؕmhu6eT_Tfd~pbpd'UhsWj4&N y[vDԟײ:V˚ :c; קZ*Yx`v*IQڇE@zTW5fO\Ed6AWmr\FnlUzTuMdWt$B 3$0RːV"u0Bxa@׺f!jp cT5 2$K"zk34S(hmPiljFP&V-eX& ClO<+`8H G\WqV#+p= L04P<2 PP;'YP1eJFY6B D89\,*)XD,!F$#؊،؎ .jP%%ٜٞٞ£ AJ PR=i̦ ,ıפB#v, ;w h%D#QQP`B&{dYyU,MI52@0 R2%PE `  >^Z20.&"flkک۷vX[X_ a= =BA, "ڋiQa} 12umkݫ;| d AQq%[}.pZ 1H"(瑈I ,̗^ᑼY`\^0;WA㊾N葡uY.2=DwM'Gݬq}*3;V^W2q.aCP6P\j04ffh-!:ަr3MMTt.A̠ @~rHv3Į运R+Y7:^0B#6*GK|r V L+BB .!Ncj(QF jQ}(ETU2k;rT jn(Й0 uxnu ڮ ;}1 PKut΋8yqeNlQ7K;Mt:?o闰N Lkϭ _xso" $痒vn 3b|WRe)Ƞ-@(JP(a` ?@Q|8{#ZQbsFMHӤ\[ohBK uK y]Wj"{}yL6L\ԸMzX^]Yj:\3,x`Vef/0SE3TAY`ZP妋.&w;,@qŋɹCbn&SfpA}hȕ-a\K"tWKW` :,|瞒 _q*)P[j|#eZLm{X+`c@Ÿ]f 8Clj!16/cyLڍHZ+4[v(mR[]Q? y"Gx>xݖMa1(ZX a \3AE@O(ap"GVR#Pd98 0;/^;:[xBƠ+C 0vc"5c wvKL qe"ܼ: 5,\pPt໖z Xl.7AB KP@(0TSoEcw$񑏎rD_ҵ=v ןz4̛E(Qaʀ "gP8ܡ'%)Z3tt8,nT]μ|TQaїc0~;$-6 n` `@T@hn'ݞw\G,ޕu-k],`5"ZxtE$] a祅0w%`n@ r .+{҄ Lk%#aP!n(!n( t|zzHrgu#@N"dA L[*H5"6{C^>Gj @a  ` mG`0n` U7tS+9^6 kÙMzѦx<<[ϼ$0{Il =G;Q}*4T3#l!]&K $(kBawz:H%0w;p¯@ .JP'Wg@J`uyϥdyJu#0 w7w pj@GtJv %nRY3Axx5xyxw 7:,V {y00X#$e_` W7zd,\?Gqqaa a`{{'4|RAk@ P?Y ].sWowdfUk:?g. McEk nbtsHIOwnf3Zn=Vun`Cv&QnU`nK6eF5~ej3Z."()$ u R6o`/(؋N4F9H%G>v>u%Bz!XRX1!R{'r. ?XȈ?uxkXk fdcS0n=qaJ6@t$f'ad?[ʦdg\, t&fU[TjpIew PaUD@r> wPWHn2a0"`=8D=zQs 9;q1׀zO$hBhIp BO7N:J gn w|k `a\n[6du..\<feYYuep^[VB[0#1ɵd [6 TYƤnt(]qtEC50sA4` :Y(<)"?3TYz6zK5h[rO[htߓO `XTH Kmd [ ms ]w|WkmʅSɦLv^}`j]!l5$]vm B1~vSafa12lG5pgatLv 0Tfb&lvv7,›9`z@3*s>M>xGW~> O r#DmS\\jP5T. "y)Uh\6aUAmBtoI ÅU0Bu.ULdA ogPY0D`(C=]dbԴLQLfCU.ZP!!!aELr{LڤJa85)к=u?A4U*uu}hVEibzWPY 剦hNFa\fjװCmDudqѷYsQI_Q.u9Q1\dBD[b&cS$V.[E SQg # Dir4$R4RbRZ#xgīGT(R1bˡJ: '#YFB_Iy-+Mكߪ_ЈO&uGapsSfd)0tGѬ%"'5B}9zR*B'PM@ 'pK1 Qv%5TB  s ڮca ЕɊe 2 㳙"Y!!.8!InaT:TíaiқT 5bJ1wq;T+ 4* b 9 @! b%V c[#w );([{!o {[fh3[3LA;ẬWYʊ zpsbBX0Y$# b" +X`{zz`jܫkN<9bK} 9G 4 0WMQM#PK /r ܬyK ,)  ۄWaX;b;6 `烨'`Y)5-w9,U=<_<=s2['Ilԓǭ/!FKacY'N1֠ |_A1ֿ pu w L-ҿ=~=@Ԓ ӹ{uӌY`z;;{ ٝmgڻ@@;sEIZ- 7u(2ֺ]-W6?(׬Q mu#΍"wL*.$%]-ߤ e utق ŸY_Hz,2Q!Ma!SR,fN_9"]ݭz^̑#mn3|%qG(Mj9"*\f\/<<; e 0X@ '̥Ӓ.:̰0G l s? Q)]dیBv4<(ř:i{^NzNz>B^:TΰH=>;.O:aӰ.m;j^{}<NN 5mPKBBi'AJ ,"k"=iy sF>*S2)VsbO>X鱘$̻Y )P﫡^gc0 ˲a븮5oΤJ$̜ڡ<@c=58OG>^',i(Mbг7೻4gN-A/B~mf$‹^j^m> T?󞢋o_d P"$vYs&i7tn)Nݓ! M=\}KHG !I$e3M:^dUlj'⥀#g__!H_VEjoo**aa`Xd``dXaXU"YaUW}  }$f}PP}VWYYUV^ZwE}^Yg\UYZxHY*\ȰÇ@E3ϲ\y͕ExJܖ `K0{cum‚ z0aE) OI*uWVi*VT`c֭*r+͈}85ѭUYYd8.I؜N9Q," ={+̹3tC(M SG$A/Vff¶ތ3p=/<1m\Nsy6IS7vOWmNUYZn 0UuЭpf7޸D:|[`=T:PQWdD=d?`uaMM$ZE8GF-"Ak$@8Nm,G\BL$wبrfJ^$T5 pE>EO5e)#yBJXpWޙLcyzlSK' "?Q Ԡ(yHhm,؜(Ty!@>mxb$F ^i A.E16f꫺ #06cPՓGF=\4[J x[-}h>Ke˛{цkFXH^g`2j[Q5>jr5bFf٦PRF&&2ZcW,pl8\1xTqrdkhqk 3f& xW;sUip|4'WwIS/`-zw@=-RZr`0)0 cJx㈱sFqEkj &[2-gZR:YS'}aМsCmGJiƊF=Ij͜4>ަk !v;Ux< t{4KLš`ZۉF2،V< -ғlU+Ik_% '$PUg3a yAQg9o,G>,lhߚ 8 лNf pv  Djw- oVךEyI[+\'BYZ JViEЪIaK6:I1i+׳QHSȑ(;i"xlkh4. !ݶa7`:s8eo5($"g=5(r5Dd8'TQsNKLYǞ  ~ɧ>v$U$ (CІ:D'Jчֲ"$BdNt͡*JҒ((:gpmTv % eNҞ@mho/c)H3B$Ce٘pX֔5jū`R 0mMl%Dk> tk4D!┧A `*@epfzdQ5`'KYFЂVGy(Gc"MeGTԙ #m3ꝱ(/{ ے`jK]:Ăɸ 4N$¬v[ {!IEe`3Q*C{KI/z|;#%%:I~2VA*v/Ew;};K34r.x2 ZA*%X5zC7: " APP F>SL*[Xh <1 `gsPlAh@?XB 9 ȋIq_F3ю4'_>z.P@9A  XdE%MQԨ>'Җ^g d`<ge)6 ;a;r]SlUfz D~'4NMTQ+܅8w\vgZf,`hV+( B\Ķ!^lSР8`@q`{ GN(/9#q h)gNӼ1>>ǸuNHOIntˠEow. PQNv|28ktxu/kt.8Gz;HG%OO;G<_[ϼ7O_|=_ҋOQoW} @?Я{OOg?~Ͽ[ |]on2guvgw(<|0   p(xu !8"X$x&(*؂04(H8:Ȃ<>؃@-(h88~KI(OET(U88x7xY[xH(3(؄0Ȅj3Hcxhd(3`D}~0 1Hmb!GpuE.P#3!pKXx艰Ȅ芦Hx8j(hx苼،θhhhXXKxX8⸄H(l v9i *" P$!wXXHYyhȌۘڈ"9$iY )يxl~PP3wU 24`ag!XRyO9X$Zٕ^[y`ٌ/P{P0PP{ pgr?uF.JYLOXcUH\yyX;@j6ٖЖh7wC rȆl2tn2 8ȍYy+ǩYI06i5YuD\"{ٗFl[' Yi(ɛ z ;P~0НН0)6 YP[W]9m8^0:2Z4z68:*hȢ過*eʩXʢ:0:e9 }Ktj0z! o閬aiQ:Zz @*}7ܩd V0U "P3º' ڔ-گHszΥ` "PJzDAW ";$K):Lx90Pʰ"a3jZڬ @%;D[F{H˛J*+7SHlӳ]ଶf{hj6)y-kR[w[r?3`6u,]뵅TJhk۸ǹЭw'XPwTa SQs0{%[" d{ۺ-t)xkP @RaWr`0U&Z@:[Ue;[x.˻⻌s`w{:] 0j O;kOO˝ ʝN ߹ ̿jyI˿N[jzɄ| +)| kL[6|9;`[2\ s ʻMk 0*% p۝ o9<)_- #:u^5)+Lkc|Lxp,f|ÚЊb莢,ʫnw¹X0 pI˾[HK 6(7y&{¼l<+# lX"|Zܴ u p +Žܴ+vLϜl7,l\;ɫ,؁ F,wk"N,c;: | z), ʼq[)mhMܙŖl\k<9>mlr==-M_<|X⩝8(.+pC|E|G.T66.q˿cMKdʔ jֳ/v >jyJ4>0hNM~nnߍ吼,u^nޖ= PJؤ9}BHKnȮ:ޝ.꤮M!S.^7 ֐ >Q k-ɋݞZ@MN҇=.KEn>y 9/yS~߽͢杲<^0Z~."/4N,\ՁnF/bĭK8@ВpM@ ݣb!!PJܙT~֎MꞹB|ɀN=.5ie. -U:HnӬP,qIoْcmnǬNE}K􁍰+a~Y^a) e)pK>^n^Fon#~]7NUOM۹r~ ?}@`4Ź~~!~~~++~ƲH _sX\XXdd`s"f 3ZZjhVVWZVg2% PuAV8ԯ%]X M+4*UPE Gv80:9jÔP8Q? #د%H"bPDXê*E B'f̎KٳhӪMAK,ȝKhӪqm2Ӱ| '@sԱs7zYЀǯVBV.Q&.p$A?rBJ+8ADZPR4|,С"RO tsT7,)Ԅ@TN@ĵ˟O}# yACŗ6A`Cbӎcs?!<A& *W0NGs p"JR\z# +$5C̽pHv[%*-r iD0G/@B"WW@phV">U"Xr"k_v ݧ|矾_5`` 1(vNQdQJ]("d=ڨ@V@EG"pUHmv!^Šm-ftJ+sR(Rr}ʍr+ZW>*+VH7 $n1m* 5. 7 SΤMh<C*/boJ jȏ(欶iQcjqkXma,3=J,ϪLn)|kH' r0q,*@`])360<A0HXjJ," ƪd#GOPv U"a:ժb 2q_"<1"#"@QG'+ 2ą%#Sȕd3EC\,J"TH"KZR( EC>qe*t(ДPy`TW~5@d0D{}kКȗlZ[ &qK0,t HXqp\0t ) 'lGb)]~X05,8DI!0cw]0r%8v1XOMuj$+d%83]l[,HD? gW7zX_f;G> +b:)͍3+S&NZLX 4VD:0nbPh<*"pFLLַJTa|xTAE#@ b,L/f +Qu%Jv򥖶fc-9xr>ʆ"fgYO8>Js,_-A2ڀ&q0Ec fTb @ǢF‹x(G߹Ev%0"J@Ec!`؋)¬hřԤF1, Md:0h7`]6X3Va -I_uD\)| &DHYV4@[함 *;j V6` ɨ5Vn_f,IN3 N5"M r|cmkAh4"> P1-,fa=̭)7{$Y(J ij[XQ8KNIV oeQ!}编Ew9~/^_wkzǾCd?’A\-DttYGѬlFKːFng6ٓ&P{i,FZ> ,rO*qF+*ςwԣY):fg_9Qa"8!Rmʷ}a;4@gk%StTw/31sI=#IT~Rims\z#GjrHe7IGF;բrH⇟ػ?bi&+M"$>vHLBFFWSnn/ IB1mdmɄ8'He=|vA~6zc<q MQ*Vb{@ 'p1z1p6 !pb 'tf.Ia{iS~PP6x832؃Fɰ y _G5} `yy`e3`Xl*R|az:6`v]nNfAdMY? ,Yq1oizG LJdj3X|Q'mbjOX 2o3Y@~pY6!X v\8񉤠~"q!0Ol`Xw$|X ~>668:`4|37C2p_gGpTOQDh.!woۧ4F& t/21 of`c%@  U%X%)+73#j#)&OtE#!HBa }P~HV_mA J_*!o9EqqPEl-@ce  ZfcQ#H"\2E"d SPF9YY VXrų8WtuWM(OySqV`61Q 1Cs?'rLAtYw{GII $oMt#tUu.*1^)!%i[',3x8ZEi~qDv 7 3`v$)\݉;+%G&a3u&+ Few`@YI3bSaZwã<ԢE@՘ Gc.w; F`pQ(qS80} `!!o $z I#SJpI%JRPzŗI'5 \.G/`8 K[&pMqy riKځi2§*  $Щu'q* ʦn /O 1Y&PRaoj)e*#v $تsҁꨗ*t0:ZzZl`6o ~Fxr`pqӁ$1OeO#J\ 3 IفziHk( | "k6T+f%i9 ⨎ڪ2{ 9SJyjE+ z"] : `tz!8!@˧&p T˱ eKD{5[bX33P(SH5[Jj>+zꚢ@E[$۹ HHnPѐ5 >0e˛@&KSCc3P #w9"3_t1+.C3vb34G%*s$+#}!;\&ڰB: {* kcĈIYD[n¶ %Z" 9Q?QRQ7Q@۵ {sSn74'~dK+v*ྠJe HVaIGy~ӯ{4P çBet<"Lqd"1 Ԝ7A,#SCaƬhg"b6oy Z|J% q w뛭c6qnHK xi+P;KpX;a)FP$ ?b|1:*+l!C,_ʇi@.0*B|S= 3΀KXR{ų00a|8\||zw\9( z Ќ<= M 5hm]M]'~/ L|m8B C-8}6 4`MT,PFqP ˄jj |e;PH0r"v] wuM|{&}00rB7MV، - ٕ=ϖ٘]ϙm mp-ngҪڬ'p,۞]ѵMҨ}tπ҂ ԹM8ʽqUE ӋP3XRq@yO+hj-m]^]~ "#~(*, n!_P6 7<"%N=>D^7BNn X gUl=-   2 [b>d^f~hjlerpn^\]|~>^~_c>200.qk~燾頮~yn0@8J>볾n@q>>pu~pEiPNIHW]p.hhp>^~o0g`~hp~^_ oE?_ f E& +.0j7k8}`'?D_FH?%$LP !/ oXZoW PU=50m?.n)p~|\gmYW>?_ *[O?_?UOon p 1_B5;<!of?egUa5d5sqqsdQsXXQ| 3ZZjhV^^}}^ZWWVWY"YYeP$ HaCD3@EDWǏ =jױ#8\ɲ˗0_te8DSڳ@qKg s,rYӦNu(իXjzUJ 0ڈ5 +v93^M%߿o3:pÆ#^8qs[yLHp ]5)(_j2,'tي8<3.l19H۵~B P q \w.bMfjvsE]Ě^-8AE-f ؄޵. 6/w@9Y$`yofyVNG:cPZ̡&h&3HZqVqpC`]Ojk ^Bw-l>/A84lg=H" \pZf8Z ` Y@n(Z0oZ\~@^ uF>O% \V|&2E bajㅀgә H9O0gNsE0 4cw2~t㌃}u" XD^:q@8DM1kV&"ު=گ6%fҺBSX=Ђ 9;񐏼'x[s 0a5!И|@ғ @SOֻA%[~]O9V 0 /8 7K/{Џ`{#C.( ]H.? ~0O 㿼/_vlop. ~Voef{ӗз|xW}xymjT>u h`PQ `yt!8"X$}(]',2z:Tj}[`ٶm4M`  n0JL؄NP 00V8',.B:@iHUnp` vxxz|؇~hsHWh|.pVeT"UAU2njiQ؄hp}v0P'DpP~8vX+P0hVS8`8tƇ96$r$nh ȍH388n p 7@R@d`Ȏ؎Sx @똆GTk~gkg=@Mw3x2؉&yL2!2@Њ/p''ГwK'9DYz!I0p{ p?{U&qqvxF=Yfy=!))sr!`)qryY t}iٗxFr@Yo002SȄ~` _)*)wXp;S0v@3 9p _@m.0x@4 Sg c_IP)砍:0<!OJ9ɝyx& 0 `&H׈iUd jؓP;Y1oJɞ*YHٙ!!`2~v\PXm]aRS:+3Ї鋼 0 H[0I(&y؏_ PmѤC *&pڨ J蘭&%P!W Rp3`*ʄ8sX9txyP2@ ^p_OȪYi'=+Xȭ3<9X9ɛ麔甆ʛ95 #ow򹄐uI؟o93Z D m iz@mx؆!Ȁ3@ʞiFɢn%0ȨrxjJ{oJP 0,V1A{j *8 [85ZI8r5zx[{*9jo:c1;$88`ڙKzt~0  F_੧ț&`{&Lع)J `<V+Yg_0I)Iˉ鸋أkH'w oE P@ 1Ic[z1 P1˻=zЫNjH{䊣h[軼劧ˋ;ۼK+v9sɋ 0ҁ-#cځ"Q؝ꇧȾ[X';c %)[`?(|rG2>70C$8(?il劾̻$i) |~nkLzª3%OXwq@QpTP[s>xFV^ kۉJ`%)닭;>ڋ4W YU ħ迍YLin@ʱoܣ+^鋋<<$I죒[닎R̾i<`yHPT:/_IQ 蚰h{ؚ[mgE%\:\#΀@|f@ #Df| G pA_0P|~ L [4J˱雊m0QlQ0jك"V`m)=܉pO (8}6}0\n\x9,Eu+WJ}-Ӂ,k;L}brzr;k8ͷ}})8 ꚟyDpUf&a"'Я۫ԥ@*m͉~ +/l}-Q'l6ؗ@ (*q0ՀR*(76}l|]77ϱ +´r9x-R ضڝ _F]3af *m޻iMKΰ=GEbm[\ E-L<BY<Ōiˉ]k-ï-63ɿ֟ ΋f+ <9@Iq Ý䬘:}29݇\֨ r`ۉn8ZzU(x`pͼh[笼>i֦`_ ~hvXnXܒ |÷zh5[x Z'] I(Om`-yizpnd #c.fpxR`+` "V׼-rrrO𝮦-)?nk 8|}i~ēh/u_>4etlC߉}>)w̋}(D .rhK3 jP P|"Ш.GmKϼKp( PK>~k}QM̗ #ڇn#uQ&pm`P x pL]1fv+ڞCSY4%(n9y5 '^wf~'p/{}>Z!ex ?*h P2 a"6tahz `%GW/h 2 g%}E&! FE#F-$)9m<܂&Hh_BI/v$†358 k9MjR/ܚ<4Q8ԧ,AlReRPP !@T/` fC $cE˟Nx$d&,Fla]BW(p@nsSg,&dP .zH-!L h2A>|b+r& *Q h#O11]43h s6pP)f6*ѳnvH3sMÓ}Lbo@dr,E d``A(1il03  p{Rxn16+`` :8@;3\J p:, #!Feu78u&$P` c)L:@L&Ì* ]S ȺHuвF+_H;<3zȴ4@Kl䐽^ thF~IN1()|ggv9ǠZ AЀ230&MI(vdp(&{+fԥ}0!IuRP  1k`%Ge6a`{HFܵL6c5\%(P]4Q ` TEJl 2\G "=SISE ao)c S!˭t*B KҴaC\s=x.@,nXM.jlc%D]ho3yVZlKx%6tQ:w5{6x "Q @UA]!3v]Rvl`P0 Svua2 0LQ}5uSgBR3p<5[Pc 9f?p "ygpm }'11egCA{Q'R q4oTum@3`JeB\dRˀ`Cwz1 $LJVpppdpjKZY/HP6 e`xh_|wf)~eX-h((fsWsu Q75M"y# |&QCw%5]^]YAeWv&&2%@%v+J 㷃S #r32#/8D؏ m +Y0P\ i&NR!n}zrp0Xq6"::VBgD8)[0 oEIVprK hpvWe8np ^~KYdPolv@R#l wmvTv . \^Ki6%A`bRQFqxٖ`^U?Xk4^2#`qg1;a ( IwA# ىY0pqU o+&j.阎)d1th:pd[kgH K@9B n0di=ީPXwYٚ+xQ%a={ DiAg*%+ЉyٟtwX@* ~.E`tU. LI=J'Fy p}qb@S@PFA{'%)R`HۀEIHL2npr:tZr|!Pv:ZzzE@_fj5㗨Fg`hK9p*7*zʪ? bx0mZګʫYZzJY t$+ÉQ qڭʩ꭛Jz 3KvىXYs2*گ;7.hӧ osݳ*[{7EjP-xF3 a4[67:l M%۽}A mrۻ}R,. =d_.QNWtkV 4_68O,f:VWfeO5JmZ 4mد֯&n\HUO 9_ĺ^%?opK.櫓QQnnmQTTn[C. 3ZZjjVojhV³WVYooYWWYkj^^f^fjfZhho1A@1Ç#p֭ŋ3VTF, IdIAQ@A䜗sǛXj܉S&0dn$@TPQQPRGJAR6&Qs)&NNzcM=aho;6[RƎKE&JٲoѤ1f6J^9x s<޽qZ! }8paiSCdM׮9i68(Ut 3N09qmOsxS)NjDTR I<2m '-vU~XuVYbiѦU}fgc腁ł F(! eqކ:`5Z&"W8%vlۈ`0npXQ Q7O4B݈cQIqQ]RQ]$np _wy7_d2fh7W\~%X`w7ƀ X<VɄ2'> zV)~bE/^di7ͧ 9[5TH+UWl>rQőt\%T!uHRN $VVсBfXF+Vkfv-h"@nk,fxnwkoݫz?h lkkcp3^j16sj$=:դ8GB:\ɤ뮹#OLUD.0pʀF] ]4F'G7L?-uTCmWWZwB#p̔K1(Cy" o:zao|"ڶ'|c+L6Ne{iY\Zg17"sN+8R':Ȓ5li19p `š.h#|/7WOgoo}s/O˯w~?̏Dq'0.,P +L9DF@5x`C#Yma #7ɡwXPMq!4Cj;n8$Vܹ*u  @x2Euq^ #2ьd& w?O ԰>1« RVq";~@pAb#$ MN*M CPB1 I)$>d+MCW6-|a `┨'fITЌ4YkhDs6%"Da(C 8@r vo|ITabҦ Ԧ }q2SihՇFth)aK#RrJ|T:pxU]׽`:MlaX*}dKVv,^5}Ê&eP j$+PVd Sm#7v<-7#nh dr5Kj3szU3͎J]Q9 GK v3:ܵ lBxw-|Kͯ~|0i vz- +$ xԭ} 6#&u%=Js #ڍVGr<"8xDAЌ[/{: @ .{`L2n ?6-4 e5P >π泚 oVmN1kt@ !ҔQ7N{ӝD-OנeHZu"\(Du_}7a{BY;*NK9@W"^7a0 `@n{MrN jTBp MƝхH{gGp%i#G'Nqs!{KRa Aq7 M %a|04- t610N@HOҗ;PԧN[X:ul@_@}hO{:`}kw۝x;>tOxkOxoG$/[ϼ/p}7/Λ>/Owwl}&4n@O;ЏO[ؿx'>?~g?/?/}G~XhWw78(~hȀ|;PKOffPK.AOEBPS/img/install.gifGIF89a\aa!ij,-0,3 u7Qkz̉՘ux냅/C` /ΨɺHIAqE0!+'&hyXv}{x7;8d恢;7B"eudYYjzssZs{{q{srs!,1<<<75  'ǼʺP >ڿ ' H*\ȰÇ#Jpv',ǎiǫ7pO0@ ͛8sdO?:&MF"]zҡPJ9)RGjj*ׯ`ÊKٳhӪ]˶۫KubkT82@ E & Vذǐ#K><˘3kbϠCMӨS^ͺu΂e49[3 ay  ŌPM78l?0yӫ_Ͼ9 T τdܯMQQ#qaD]0_CY̠jdP(AD^%H+FPaAgd4`)H"$qÈ` @\aӮClw٤Q(P=(l01S&^@o8^Dp7YHnpg&xW#Ǔ/}+GIR1ia @H-8bY+0\n,a]i idWsȔ؇sRy؎w(x\ٕ`Zdيaɉb)Xy͘xcىty.x9YnzhYi70-yم !ɍ*əc#vȔ/sJYwKiQ (P)) s9YyYɩbй霜؛Yȝy@H9f{`Cő+< -iy)y@c@29z@VJh9)GP: 8X.IXTň e"$J/&:&-Yi($ڢ9j6:8Y<ڣ^>Șmٜfi;9]i>H4lP$PUAp@NFx9Ay7st )ri@x<vfXzXy)(zsȡZ-yxp^8)OڣyOڪ:ى9ʗIɊDʗzɫjĉҖYyےo3j azkeںgEJ*٠ꈐIhȮꚋ:Zf`. ":J4P.$}8$@F`96(JJfʪ`lbKkۯ:5jlxvyЩY9Zi-g `yaд(*0k8JEYD٭j۶ḒWEGYPphx{zxˇh;˕J@j"-}Hki80 . {KAЯf->{кJT $J 4 Y BYJɬv?0YHy{;px)ۋBC  cZd{hhອhˇs[t|z: X YJp;J-1A@kⲉO%lT@FJ/y7GoQKϜ3=StO3N:\+hj/qnl?7ɘrJ871C0g` o .9-(F.-NA$7744xafal}J(J?laJ1xA9.8lly E233E32HxQQ2QHH3H,axEI  ! axx%5<O A@C 1E%j|ȱ_ CdS4˖%E|p2͛8sɳϟ@ JѣHu*#F-nNPQV 9rlhYYP`ш sv1\rΑ`L#qqkS4=VT4 z|矀{Wo G !6 * @[l$VC }FJ<(!%xE0Ѓ LQ 4 3106CN=4BMlR=fPkre4vh2QCyQT& gU(Q$ ](dLT7U*2`jIl5^z[:#;;tSvi"]'t> J$$ J- g Xy8% @pȂH$bц*C@uNκ~P Pa[`!zp^1hCi0ChD㱇/ =`0ڻU CD_2f=䊇Mf9lPufY׆!`: (Pk  {@@}"돸q) 7v i V6SGUCUG|La&:Gd[;'$QNKO(C x>N8EϿwB @֣wBsd?AR漏s^Mq11waĤ9nCI2` /om;"N8ܭ[06N8]Qr9WHy'U+ +x xXbeJW$ 8LoArY 4mW WC@:f!VD d,^|Ay-ˀi6 .^AtȖw&}qZp dLd/Tqxg4~O8yr" rrhyz8%6P-HuX%Tyk0{D{+y{00U,>ng ` l`+N_U$bs?LCx a!& Z.  5AHN5.S@X(|W~&ЕeukWHo(yv't8vx71:qy1`WDcgBn!Ya^{(Ur߅'`@UXߕ3po(S.aE_b&0r-fFoׄUsf \W71.RjPh]OFqx`TkJidH'0ՔNaG( TySyvS k1m7L,?`gg )^`0f`{ f`6[Vfw%b9v'6$Y, .`leSo>$`%4&U&;qA@&/FHWK'OYWI!y4O}`b^`و@'l8+LFyx5 h]f ^$^V!tQДF +CQel6%9QF"gK_s`r\`Y.6^j~ך+h8AYV;7qX rO&zw䂢,z-ڢV4Z)a!M`oev@L`I!N{Q` _1I<Yy@R @o`FCO #c, Y}(G3n}!x3Yȅb*.@ixN0s^ơjI }٢0X{(ziɫ-/^ʘ=VZpWF@J$C`8H*N8?"YLP= *n EXNE=@ `F0jVaNZlB 坔7SU. ^J:qj֑@sҩA/ި鈔INĚ01<@$JoQ0cØI Lj 6.1>= #I1" E 6QT,[ʭ"#*h@ S`9>7qh `(0 e# @>!15Z飳;B>{嘻sO }` `pMMXQ,P t=3 1I$%J8Lz~JR@'g{ [H@ 9r$;"Zv` 3V 8:kܡƺQ<1N)[,.@2 ZNӠ{IBmiK6KJ2@KWDXF^Zn+N&ѻ_ WC ѫ aQ?ոvWc#)`yrͫѹ\ke!¬+&l0<ɔ\ɖk24L58L}I 4"MN=㒭#=0P*AB-[T6%c0`{0  Kz ؽk_DPp!zoQNNȧȱgLp#=P]g`yAR r |rl|%P ݡ'Q"L6{/F@c1 L`~fXDx>LLD_n'K|}~zaz+D=Dfpk&]) (j3̈́`~=[ӳ$]}xP+7 $LC0뺕=}8 {*2.(ml !%@nINJ^T$` <x]yN=nqlSS6jx̕(^'}-lsa?ɲiܐ̀Dl{γΝ^̋-kϦXurJM)Q+ n^~rLޔ$Z{? ~ryS~N &2n,,ֵ>'L *m ^gLILTv`+!ּj2|D$b ˻0Ϛo==krf߫i^ 數&p~emΞ-.ϫ~*HGJ PM%{XOK9^24?W=lO9󭋢+c]&Zz|~Q_%o(5V$zh&+{-+g;(Κ6#ȞC_SOI &^>v (kg J`mzhOI_/glgyykl``{gff{{`f{y%58¹ĻǼxaڒӒyla飑HNL*Qlc %0VUHjŋ@:4X`<{4d Y8<(kU&.FP PJڼX%c֯[>DcAN&ӞŨڃoۆd ܵw A]S&Mf#'RdƜP!/e5 =zkҪ!jAzװCKe\۸sͻr>KZ{b g懓ʃ33a*MZy1*MiS^,L\/DdMϿ88 FrsbI-t Px$NF=gܕ'"UcM(YV[I&ȗḛHjɟpq%ܒDR4E]N:$0&w1y)<!Z&I#!n$pqvR'w'o` eќRJ= e0^ ^vx|7cvj&iꩨꪸQ4#.%GE٠X-&YE {|vڂkN6eri-۲+.i`1%+b:Ep+a!&,vF V:a&<\UY]^b|1is&-"vq*d!B]MJ= XeTy0w\>UWָXg\[G+@: {)J92D0 T8M(->} iROmmi7jIq,䂷Tlo.G`MAӌa uy3K.xi #Nv/Nv/LӼ:z@F`hҲPn>|ķe|2i?g?ҹޭSl1ph';B|V9iOwˠ7>ML~[  Et:Ű1@f|d]|HM&%27N[$"~\f@z8bD@mPw*6tH[9cDf:  H$j@dǞ(26R@R$G14$tPڮRpi]К6*ޱDYHJ1+!'VR/0H#0"τfiLJLQƋbO6-A 9rNM&CipVsƢș(^(MBІ:D'JъZE5"M@Qs^ְS!J٠si (cuY:}xmD|ePwPb=FԦ:PTJեr:N5ͤ<:ϢU6^Ф!c<*\H,gpDPڕ4`KM,3-bū óQ=d'*`=K)v;\UçwDM xkv@,'1ӡNv,tÝYg1 ЉSpJݫJ/AB;B{iBP100#;Ҡ?)CE)e钆ݱ6+M)@pT±oՇj=RCARΎel 4e)ʀ W+0 6GռFNB)Ovl/MBD Y[~4;1чδ7f !dz-5>|}Vծ&G>rFωcw] JZ 4Z`Mb,[z֣{GD<ykݸ%tȩbe)5Ї>D>e7\ {xemp[SLG>p?kbOEp,SGhW.񖻜Oo2_[iruDyUjٞ9,FЗ|3ЏN݉Ͼ{OO?U꩞LJz=XɄfƧ`7x rwX 8Xx8f "$8&X(x*X (ttwaT;zD'*H&GhG|D|hP8HQGGoׄRwhDW{VMgR&aHDCXDveGx?ׅAvW}IGOu7v}u8M](f1HyvupzqT-E APor(wv7}A8MhwWs|~؈NJT芸(~(8XCWd"֢rQGm8vK|x苷@x~׀(݇swGPCz1HWcQt!|O8~H9Yyב Ʉ"&}'%*ْ,-)|8⏙rK|:yfwC'UX|x4.0PM9RyVU\]^ɑ73lwK14fpwdvHtMUٗ2闀9Y i|}٘9y)9yM̆Ԡ#cEvukwD虜Rɘ1I~ɔ`Yb,OL8y $: l#cPfxX 9ytI PYy虞깞ٞp$0MfA[hFXlG ( ʇ ڠvf\ ` 7 k0f0"p kA   1rgpHJ wMGIJ9`pD`^ E؄cbzyN P0pr:tZvʈ$jWa!BN);P{00 e(r9 MZ! l>J f>Jl@MZgavk lz{pwpavx|hhHMJv tjvzj ȇ:wzؚںjh0k vDfy: :J 78kF v<u wM*jd47D_zjoz4xMh:;z@ Bpc`vȱ2;4[r*@fIJ"*Hū1FBJ w@ʣQć;gp͚(Bײa pz>4ЄpšZ6;[+{k< `f@{ţa C ^Z} `{q97*&^a`lqPpw{pKYauۥ`*j[{ڊu|:gqI>` @;Ф"yxD \Zl"k;I  l@ˇgzY  vPc!&|(۫} ?$5#X& Q<za7Lv0a{ZBצ `jKy"ʫ`\T ^l>~ǀΙzʽ3s* ` gl+g0O3sr֟oaD"Dګ03K{ʶ3(0` 0mliX "~Z ۤa_˦"B&"б\|k- l@6x`]bVa96J7漣 `C91ਬl7C]"GZ!rϨ0Od0d`}0=dfy",h$>,l3̲>03)Z% m@Ԃܬ#eY1I33me.T / 0͌+)134Cm:3'\ pLƨ3dieӣFM7y`aT̑k,0{`` ͊ݤwP8+>vЦ.;%<-Ԥ]?ݤzo $EP[- cQb=6.DSޟ5=d\7 G+2\ ^ @&} gx(w `ܲk Dfmʳ>D …r3 ++?3cs=zö+=3ww-0Jg!mۄ.ztN4P\\ӹ/`ʜU.7 9]iEp: ] f03" gpѓ,'<8 2;룭,}@`\ "pmʽ|[ ,t*PȜg||",- -[̍=3_vߞ jz񆰟˾C mVJF ;=#+*^*UB[ } єTګ_>ʸ֨JtzzMʦ?>bjjjOw?BG@{ʯe֨"PǨއKc OO_%Gy``gg{>`&`  `fg` c޿m޾:XģA5k )CTg€ Zӡ!Vvɂ񣱐R\ɲ˗0c̛8sc殀 1pQI6=\C3PIጙhZ׮:ÊE֦ٳhǍٵܶui&B7o1 Ӂ^{"9qǎ#C,2b=6XF!)eʺ*~C^Y+7y Nȇ[vУ_X_wYՀOywIxp,T4MI+opCUBxmoqw'Vhnwdžә!ѕ!$](,"ҝ%\͵bM U @^ѰJzd,- 00Av+nkカ+[.&C>4)ö.|˓vu2}Vg1r!pHv=`,0,4l3(|rDqÕ܆VpL[")ZZшXgC#dmhlp],\r ^M$ĶЖ7GpSCe,W`AF0hx MLDs0AUmY̤&7Nz (CYn@ FGyNɣ/qAYo&fAJ6!cb<2e:|4IiZؼ6m.8B:v, ׃?z!OhJXKO2'@NH(pQȡJ*Q^B f(Q$GՄ]I/`PH(å1?݅J= v@^YІFSx9n "[$+YhMZך>+ 1IJ8A \Ț>8A_*Jh>F:  $ CEv0%Q j@% V gzh-lڡ&zmU`ǩŜ[JݥZؽy ] qovK }7e)z1 PGVͯZ) 5O([q: )d@W$ hb0h`B)E0(mZ1ZP6A]A :uu=@zXBmQ#\(Kej+&ukhN6/ϜfzL`g9X.πo :-Qz`䎰 xī^! !EE1jH˪8eXɻ)>Y14O˲dV[mvr 2^Q$ MrSU>nwKd$@<C'DQGeJ0? G LPPHAUf kk:4 "J>  M@ ; #Z82  O.,_KvnkV`풑‡Q2xDu9+NvTZ;<=Ϻ\z7|Dw?'͟ G4B!Xz۪Eeڊ| H@3g÷"v#q4E:{ aU>̶ٿviCz!~e~ހ/tFSw׽RXo5p/)p"r]40@P5g`- PI"z!7y`I`fނb!({{$L7s?'u3sq*Q0s>!(r&pz08s!{!hR(=g`=LXwUm7t7gsFbhfvjOCUwXvXVWhgn x iyWq{GN X !PxMr- r(p3w!x0s /3'2"j!Qs -rNSۂuF` CЊt"zh!7x"׊X*^f؆闍h视ȍkk]mxp9w긎BxgpsUx' ` z8 ݒ r'@.1p-(b -'--s-!NA~ۂ 9S"7 В/ iI,ف>t8tL"TwXFyxdž݈]kfg Po,0?܂-U.-H`/[y/.cIf.Xَ[yȇhp+0HKbؗ rP')(zE1-(/Y"@pC393O-N&jԙ⊁嘟XsЊ-5t/i~YFHYyl&Buhx5YI/ҕrBי.`oE0.RiU2Zir6▆&(xVG8K+"00fz/9 y"rapOw3Yq`CF(D iȹ<ڣi^p(T2G.ڹ.}i⹝t.Fi扇(xt =x$$ DR {=7ix>آ:y5<R6 3XQyRX>5yE5ɓ6tn磤Zg@foD*W9\)O. .Q\)٫hY/8pp`BM(Āu' Pt[;'tfZ[%m[B~cXFhs& ~`'r Qe~y}yB憟[:ڔn8gU<w,0-)Ap@ N@i" @ɲye9H<ꤸ7_js y:i QZѦJ N qb0(OP@t1ڷd X[rOevu[3 uXeg؁g@P0zk*[yZp*9".,,P,@JJk;Ni0Ǫ.G  RTʥQ{x*"A8"Oir[_K$!q)?T:ZtxU *`P&*Q04R1,4]kZ?\ *SUre *[E ٫ ,1 ucP""/n#44ã""<"Ah稺9/Epo<-˞0{#I0 E[POU ҕMʲ[ONK(%A,VKzt^ ) Q&u{[_buK UU*41KO01DGm:J] c\eAK]'eP"2R²i.2zploo\̻lT$Rm lT+|QEܖYPKIao,`%-J4-2PP\7<#<5[O  K;1# @6KR]9{LHW<2~UU0}<>|.B6 :~>#s-<KXP B5P+!O=p2H} NHpkPNC- A! H̋ >"{`i[\B#mqn+f0ن˩9ӌoYQ{ߢ,  LP颻2-^T\,J-Lθ|; I@"{٫'+8\T(mر<1 ̌ٞ=n\P)ک]$_l\N&LQ\.y4$ bU\Y\Kͳr< "Ƹ !ÑGK`GWD9Nm}Nn6h&?L}J?f Dr+GE>I@ »G-Օ۝-.]O -+}h$b; q S B9JH*0<]@|â=[岮"eA?}Jmi *X]+KX =nYβMY=ߢ#,ZT5p1 =kzn="{Bb ]f.̟ ͵/R .n0\m , Q-%M.3}2Otle '-2ߞ#-M2M7V˸r!%a頻f^˘M?„hj/n#t_vx=MPo˱ LEVڕb|G+Jʝd Iګ`:n-o}:'zp^] f?ùoO/ \ƿýO ӯC}V]lĕ~ ܖ:& ?< mmcejje*¤Ƽ¶ã*DP,33HE(;xλp]0XE6m.j#,$HD'S"b4J0 ɓ͛8/25)T|f(4]ʴi,HJJիԮn[D5k߹(e#B Ȗn|;Wd] #<8ф[qhcȑ%#K%cffgOĂ^RjOXSve:װcVmk7m+'0  b<{Ӈ^p5;'`#LRL_2$%\mrOd mN!(ۂ 6K)mx8 @rqqBw PBWv#LA=8֌u^'+Y}H#_KGTvf\vjxNX<  Zf僄'< |GPfA݃D9UWh?WgddOS4*ꨤF]}Vwڱ#|9 j1@I|epN(`,xHĀlp$(DZ@-$ ɟLSE6Wb%֔G Ғ*D(; `bj *] < p59<8!|D|s9ć2zzrmJJDSJd _p ("tr51].GZ 4`N#-8!\Ntt ĀpgF 8n,z7;nRIc]#!&O "pc8ҷa` Fd}j 0 ch@ǏBv(i%O=(!l u ĈI7b0r t<k" ̩Z`&N3=~6:$h+\,C 0Bst0Qz5Vp#rݙ@H'; >Pb<|# І!@+GO +  (/ ?aK̕r6* %UPQ=;O "&_# b8s1ut"Y GP6ֹ;!i{U S[kj4&\$D  [b<s5(0y["x! 3^ BX@_r0%( @c lGxPf$;b MZp\ htJpt$@ph]h2. 2X+)*w@HS)f|9D"ZwpD! AnD0"xHL ؉D'&QC "1e =Q`Vb4zHкנ*_~Ŵ| ąM89z ) h>PXF lAY E3q0+ԣ l H0>TTPL Χ?DJt@>M#`T$xX%q}F DMx8 ,q $ p5~׾͘vׁPq0vtҊ@FXtY\$jt]E1׌D@Ju*h\v7w:8#5yEgbZŭ;yGt P"7!]#|-~q&=Q`=Y`6A:2Gx{Gap\lwͮq+@v Tq|xм=o1ߡ} p':o=}OO1Z۩;o3(>sKP =Ԑz3 z7UA갏3fS#[7AG(/%{yq|VM6q{4 03doݸ2hlj'29*?7'(Y$ec{P56{8xuu^G  1vWvplʆ/פˣq%qd`k3y 0>e;FGS1?tG GtyWHeBPUgT`z[s/6x$ǣfT>EFod3 >jp #yc0P*F]>0?~6QHM!uH]R`y]az&@O(CX8cb7f)$veSz ?wGC4PalC0><>qt )8+hGq>Sv0}^~;ш0Vx8 ؎DQp tw l zz9XV{7 Y8)(0|RRnD53SwOstjVq c~OCEW[3,o PFiqJAoO9Vihd\Tda9rЕ\^b8xjHŠVDȀ!T@ӳٗiY>3aA>i Eqy?i뇑wtO q~uF ~ODEr*O _Uiqp Nyyr؛id]̉׎D8Hns (TeYfNݨ ;GɈ К (Xٛf:Zz ڠ : zʠ a)˹PteZ6fY;xS0W 鈙?Aa K7  2J ىuHuIZVzXZf`V*Z7ZHb!I3Pp(C* k,JNJJa@F L빣~t#jb9ffIjcɥکWJbʥs0d:tPJ*SڜTٓ ^auu -Zԧ4 @j9 Nz\yjZJd:J⚮ eIQ):9S:EYR*|5zګjs'z5ztD`& !^ڬ=Xy)G8ڡֺڕ%{]ij(c(˭ʠjh;:e9Yq:P8T+S[qW7Da:[ =I#KopO:ڲ:.˲zx39+9+JX׊S:K륞kV {[[1Z q=G+ ȎOjfzoJ5˥+[뻽ڳzK+opp\@[۽* # ; I^ۓ]p9jú l^ꕛ jǫۭ+|ӻ̳Û=+ ]L$,hr PpQ+Y;^kwa7uT5i8 Nb9o0P;0s@ͨlp@@Jkf jlnʪ8ƿ˕f:tL;<{pз+X&Ù8L㋵wZ|aܓ^I=xG! wRڌj'~KsI NĜ d[0Ny<̼ZZL~(ܷd`’lu k|ȎX[kլC<>Co ZuskGj@8u d@Y*S̕@`n0 ;tib]J'[j;T IDhI"̹٬7N"qV:p _ pR>T>}X۷hRX}!*)'MHd~!AK [GFd3}Ӥ1~0L,]|s X Wdܪ.b Q \娾B+b:ճ*rjlna1p]x̀K3P/-;ŋ!%u I"P_D>T>TvS\e^CLUBT}cN~\D/ }[0f5T DU[UߌUb} h!߲b:´ZV`ב% ^,;p$PHQZyBRT`_9USY@E[c^qD O"@SwqDkNGD=N$~cU\X7UPp^_M'TDKas-/HCf+14o.E9z:;?yZF&ڷ;oM1&mTFWa\LVU8w&]pQc@^^e  FrI "c"//&2 B"&/os__O6sth_rrbb:b_r,33EEHHEEQ2p 0X!9sJyq"AC#t01I(S49@J0!pbP D1q! 9 4z!IР(=D@4CQs @)NI@S!-PH9 *Z@Sx)%8 aÃ+^,'b#bL]I,3ҨKM~ $[gOF{fM6ռ!cF B○Mq|1d!,tɽK:ռ1@DQjF{DzQTC (JDysWYR={"!o(%IOdd2` cX12D D4h5Jb_R/kf@цЖ]FqdFu^wvݑeoq&PVTAtPdb[aA^I{@5Os4VDo<""%=dx-|37pX/3Kጓ8SPYΦ[6/^ ܹ@c0nqeNٙ\ž$>tLҡ+IyW-h@$Y]J>񻒠Dd۱=;7` i/?I5b+*x;2dbT"i"Q0 H+ІfS&GHʸgBּ8u0A'ш }0ʽ5QnqP@2A̡V,5À6լF=tԱ: ``qơ}KB'mLPZR4{Px"&F$G#JB?Jd?z# --eh䴨MjOˊMJ7Bb2P83qʩpZ#h$"X `Zr-\u! x ].0_|g]*m #l7;u2#P>{gOME G3~&@VMdesaߍ@~i?HLjV2|-(K&?M)iILJʳ#| Rn&M s(߶C9%n`K{0֮ ]$`=`}jWQګ4>ȀUn?^ @~).kJۥ32ūU j=3b]+4eSH41,z. j[ږt2j]mKqʯemZHʲEdQvqT$TfOEX`]=fF|.`ZBIzESMv\sAS!6 z$DP#dT';X$ƳPqȲNnN;ɔ۵m8eY0f8h&bSl/ɣr'G81@~5z]Zી' B>s9G7[:A).^mʑ{ǐ`ݘT85bFcp0{ǸX&7|]X^"cRfwpmzCݶN$oq%j&H@0 z4MV#0_ pT0^@g pgs%py2S2p g= g P,ɤ]Dy{0 2`r &I^,WcC<'!kW |BW΁Ho`tO+'cOX,("PtXUw ~5~1w cAWco%NHHY`$$Ev&8H+Ud|tuGG "v%$p.2SsL(K5%H8pG `g TeP0\p%rV`,pW -\x_DA]#`5r _%(sԴUcVkw"6 |!6l2O<ɣ%AIog 揹@QvtʼnaRl'RX Ee ؒĒ YvYUdTuH{R$|b  D^C% gIXEiGj#V & &VI \Q`-afRհ`&xzg&HrgssI@MvCeb|0G}"u q`Gg'FJ2AJ%cj`iI'>yH>vF! "G^PG>y8)ّiIv9b$/7m#̉m:+iY=擽Crw3p_%0QVfTtT*LդU!d87ʤshA4VJ orXh=jY|rn X$u י"zжКNewG$77e n׶͙H8҆ ٤'[FWCIhpB&b&*TL9T^5V^Uj|L\TfZy MJd1, e(hWQjP *:-A0)Aňe`Pv%m%%v!H U)Ii$Y`8:ڛpRU熓&œ 7$H~RT.EbUqrC\L&JJK@M9<1ZJ%X9Z pJcB&pHM~&~tey*OP :e` jliv +jB**F`#Nnm'XF>v;O.p\e;u.Z%,뚼Ic~H$ -P,p&'._.TE0\HE2EE,<$,QA< EI<2EE=#<<HQQ<=ENA  Q23E II 2EH33"thibbihtt_toqh__i_q/5>&!Cdٛ#̀eƴF☋cʔQ {bKCILYɒ4-cʜK8ML'9o@xpFHUhHDŽH:U]ͫujʕMu`͉3Ih͒5͜]ʭ)3Y^ڦݫ7ڳb7]\ˆ~uدzbq#FX8fMgoݴUӆD  |(GnVGHA@2z53 D`O'=1(6 7 -Bl'#p*Рd20s Z؊-4hC⒈xJޅK=| @?@ C@=DaTQF9!)deEL+DJstՉ4@4$Qe R82EPqHՏpUSuDdVs y$ti՘^=RbE5"IfLeb,䗊ZhN }b~dQe%2Ք͟Ys'H7Z0QGw$^yI!\ g3t4%s gՀ7^9#ޫ'N3P% >O!ҲQHCATܡfT8=AJp~ +{b0I $e d@ iH pAA:6|DV~ @TcP\zhpGHKb_`rID[*ξ;/ bDp [fU^ [P,LRyqKbS%q)݈9F%_oA7pSy٨wZk:{]]1w6=f7W'!rnx.J8!DpCr Y 6_p 1@@&d˭ |u>E6<@X(aQ1 d _0C.m Mр @&25AzX Ɛ9e$3 K6پ-6/y!+b Fb\b{ 8 6П%ϫ$&0p(4pU0{V-NE _0[ƶQ~nҖmNMKҢ/ `ƍ) ꁝ)LuXllHCdnyR<-sU@uws\{NZe1@7VQrNJt1&$9R v}Տ xO[6/!@x챒%Yf x8w_F欑 $0p[+2 E\uicii~84Vb:OZLjd$|c4 kKUek"&앗8]|fQrm%žnQйP-/0J$5%N=&UnNMcİ:q<>8ǝRJykfl s|0AIH qR2U.3ayt Y2Y$[;@-%* :P ɥM\O}B5e[bmTaKؼoG$pyH;8OLM~4K-5>mjZr2M UQ~AhSz.-YPOy?ㅩ Qcv&ճ{,cN8sqMcr:.7! Uj4Qx2Y8U)7t6s ||!QY8t\O',eGpyy[iYz@&P>@=t`ݦT sg_ #0.XE0 t d@30$(bhC@i"PXӐ225RA -=P8i B^EґU?Bt 5y?bci.LD$$[ꨂB""= .DBY"up?_!.+؉SvG$FJ"QoAWS9@}`Hd 8&;V"J7)B)`}w}|9cϨ~q!0X"e_p&МB0]%Q =u8< 3 ȝ Jcsa#$@J".@`o6f*P&pBpz ]*"P2&j6<Н@Y ( vh+J,q@ p7J 8 pP$yV;*%Zpj"q"8LIY D$A8L/0>zaqunH{G#&bb3D@h8c(pH t~HF: W);aWC;7 (|z:s};Cr(wK0r"ZG'*DPT& >Jx*  ls?[ZЬܪ[sȝXh@ٕ0X*H 숝*>z0*zp ֚Y")"PZVI[G=xTk"pVfCYJk6Jjekeà"8֕ IYA`]ULNa lzb&FTyzbzOGbG|hVzԨjd_;d|0)~c(8;t~ pqX֍ZK% Y1;  >009.8Xf8keL쪞 *VF1JbhB`e KcfB0"2窎9: k[ʮDILK.[r&6kzƺ8zp+読x1iMiPB+y-Z˵̓<`7wTH{ym"zsr"*V'X|$bVרV`HIdg;d:WGq;Q*15 ͳ:f4riXfB"ʺϪ*`o6P08 (@KIu'فJʬKz[V&аz0X2ɠIY@{óZKʞVfvvˢ.7@r?@[̺-[髍[Lo 30 _K5L7<ZA}ZK^{~s{g䧲grR{PL{u`o,j@}]zeqtEp RI0IQӍۧ}J ;ӆ[qʡ;{l<]K4wדi 0ɴ8"L K07jͺ!h>%9r1ˠvX@ګDQ] :,||Zϊ/*{ D *{x|%Y VZp( @Z 4xۻ;zK%JY h߻NePBjz"19J#A $wm$&NĥHp[)A$tۊ,9ͩ* =B}CcW[ \e$ }I*dQ7 W#L=X1Kh11_Vվ:-.^Gz ɵ[/,KB뻰"EU *V֡H,Y*fD@Ph1bVkel۫k<˜ Xʚ*-˝+-˲*,HZy)s0J k\Y-[?GNb"HK6S ޴hgn[AI|a}Ѵg!+W 3pH)^UKNj06 Iqԅ 2Wz:V:'^*hZ.էH0wg|y.8?`$v4b_K#`:P?c~¨M 0竎i"Fٕ(H}#DS8y/X3ꀯ6{GIv([_6"K0ˠlxx~lEzp_(>O,!76Tz9#5WDJqcƫl ƔDGP~˱| Ue/1#KyX 𨗜P;o'ɝ/@E ~R5!/4<|Jb:$m@`0>qu~@ 6^6:6up "[" *zcBzew>&BcD*D@sttq [t oop6ppiu_~_Kdpiho[q[ x&/? P  9q hBEm󱌞6%S9_`™Y47xóϟ@ (H)ӛ9ImժX~C4"``F!#ڷo#Gn]pזe$I ,-Z$gU.ݺ"RVEۄEMxL,nF~6$ Dx_,-Ü9rÇ:h@ü9̥VE74Y!j=RY a:34I{LC˟Oй:$,i:  2RK,pXG߆vO/hx{uĊp_|AF+) ~Dnd@FTTU<%uԇ@HČ,i0XM@-I<JnAx`BI6p,\?{HC@`HXNb&9K 8@X52n qBPZAEgbQ)As<2@#`WHT6H> 3N00F4l'SF:f8= ozAx 6*HwةXnsHj!. a]Xl+ ƠCFWTXw;G)k'v)|t?MX:vCBk`ӖELZN  Y 'ni CӇBZ> wrKtF]|}nz 4A<\Eix:T\EJWFAe&b ^ 0] v ~^zη]oz_ϠwL`u@@Qh8o~[ϸJt/-pvǻ^ >ݽmoo8w;tXJWxg00 3  0p@aָ сy2H@$ P|  xO|[5?#l[x iŸ?'P3 Pq'QFoiwPr\'CzT(Tٖkc,@il4ȋ*h=hTI]&]8" 7rWራ `%WEpZP)ʭD[FˀJ AAPL[I[V{ Zp3^ fLzG#(ŦT'uR'='f7 2p2u9䷏(wFk}]8j6,n~k:~px2r㟄捲!f+,1 8{U;;;Vx7pmyX[ƋxnÏ˴@y[~u4YI~Ye&&'r)FHH5,@9t5ja8iA)cvB8!oB Lm)o6&i6x}sP1#Z4PS9;k/@6kk:ɐ?̏?мӫhUuXSlDwob7f(t)kx?)Dv6n(9$d $l´A P@L@0\4j8Ġ(>܏A\ ʢI>:t-IC04dNLdvB]C#*7mwrZ(q8J#ˬ46`)}&h!j̺"#@֘$h-Y5jӽm"O* y['(4ӕ2=$O]5~q-Ӛm89,=3 )Ә=aK1 P,WO ̀mFK ـ;gg"(cYdN.(p~ŖLM^wpjB)#r"pPT2'kmDzzf{l݂&վMV5 M l2\ SR?ݺN;Q\b IP@ W8LThϮB2ᩥr]RnJß]ڌ6xbD#MҴuP<.!,",|udE FR/p@LN Q;rґQnh,])T]6IvblC8&5LTB, ^l*=t-b0oLqPfov'`> ?_? p_?_ߔ/?ڟݏn BXMd{؅[#"oYK$5gwM I MIIQE2 22EEQMM,I,HE3 t_sordbbssrd_s#ubiidD4 H\„#J<pPŏǏ C~L#F ~a,E2 ),J fĤiO"9( QDQ*Ĵ2ɳ&\EfԩA2DDeWE:dhRM3`0 B9È"'ٲfǠIf i+Na˅,4D.e/X֬Ϟ/X]ѨE̺װcnMti/L-ćgН5T^n2ЗKLsدkߡ2$))HZc' % XڈS袑JR+f: ;\0HW&gJaxz 1egh# gYB23[2v5`]':@TNwn90^)о]=/|!SUpE,Rc[%1wMF1 h?Cev%.$bOZ$ECYB R|LZ n!A&FEfR%HA$Nn%L7X w/ He9KoHy; `@x(`իU* \ʺA*C['rPtk=Y `&b1Lz\FbblwЖ6#GAhlEn9ܨOtN6 !%ɔԔXwd `)-flFﻲ"%$y.[-l0 7qoȉO$E4hQH"P\~/ # %=QխmC\O$Pn{-Ys}[UyC+^뙜|spCF-8ɪoXX$w DOѧs˴FJ茕w,n^ K랧:r0;_zاY%5[FwI`ݏl^+"HfE^.2$|{=EGvB(.{}Ep:W^{Vg7FvuWvTF%yW:{{yLyM5'~PpP zkX|#swEs̷}{n{s+|/Ft&(OGtGl,؃|%dR3n>HwngV E #u_aR2R PnQT==g$ <x'p(g1sUDQ-B [C`_9c~ux"WR5~{(|WyY僚fbk*N4k]|wlXZd97S2#I@2&$vg)x\2"3$[#.S ,m*b~P=ӕs]%xp^phl ze:&Csrw{(j!5 {xCn5Y%%hsĊXOs1{3YVEc9_%v?JMGhIOfwm1bRvH]θؗ4[>R# nv U{4'9^=ppebd 0v!  P:`*@BRl_o5_B[# AK{){W)N Clii^LME1ӷH'BGÒP iIA>I53( &Y22cxz$﹍*EWg4cyp ` WiK'Y'@""@$*1f*Ҫӧ#"=1WVv-ҧDI$c[`RЈ!ԁ۠,tph8X)GʆlhW`Xl3ftT |)d-AM(e4+foAѹZ]v=29R)3a>eB22,j>9#, [H g>) K Ov 0T)Ə5`+!:[<˳>$F<KAP7 QKLWH˴GGb{L˴ [0:H:5/,*C yj:5_`)ʑLWF0 C (Bvmaa~Йoե0o0P?\)2?! 0"$2AgG S Q=RsHI( ,J1+* #0 N@#()@)# kի#PN0{1[[Np# + |̾K5@˳usТ`Lpq 2+sW%;%^Xb4Yg[6Ǧ" 08 D#Q#k'F= 1wMvD]-Ii`.u@ =0bp'>?0k){[^Xp8 N00D?Ȉ,ɝ,11 1Q` ,1Pȓlʦ \5 ˜#G !$'<5"N4-V4L .M<3<@{Ű3sB,!SHEWBgzhz%,K@"/#%PP] T]5pH-݁1+Pƽ)P[ϝ `&=#P[M]3} a1-K}؛݂/-^MzL |@WC_ZL5NBdBLɜb0boNiglluG-!#* H09Z=p=^3*=3>ٖOCV,2+D^z31l`GjIuECf&<4=84N=L)D,cBO1K2L@E!+RE$1A"/&LhSm9S r!B#B '4 NDT cE\ 4ֆ 8^ i5BaIeaIYXU!VWuƕmYU&Z`3J)Uh!S!`"rs\tg6,jjꩨzZf۬e!$H#!r+M ]F"5 ED+ xqGpblk6],E;΃4f Ӗ#0a> ո`8 F&XF'V<2r*"R;ZM؄L$Ð@ KZզ'YxU1}50 IAUeUz91BTU7Vofc%E0U, Ue Z^IMe2ƣ<")ixJ |귪.„"o kq>"Ư~XBgp݈26;72$H0PmICMQB}22;2D $lt?  #@  HSD*+,]ldQ@K顋TF4L"DM.9YNe( TVIg#AaJ]P_蒧\-)U:KF"\ktRV(e+1!1ԗgN5HJ P0Q|cʁP|&:C 3Ǫ6vc4qx~e9͹VъX~"P>'x(=B{F@z8!x;$2#i2=@. @X5F8#JG#;@3QD,QF֒FDXv$q" ".Y +GF,p:Y+[!U$h48aN2KYt*L^8C'!-Q0Z m?KP)4 RJ\ Ȉ\Q1Nr.E,biFU6ojո\'Y#&ǖT:8VȀ[V% vSqE s 10PC~*3П(vA}H.bq@*fDt͒E0%Yn#)$LL(MJA N`<maR*MXB<+a -i,<'$Z)]!Wr QUXTh)(NDXLH`ot?46)A7ǝ Qf&T3 "b6 vsVMmY< L;]j}cw%PiB❨lZ9X0 Q~I`p"OtIb@V,P  ?pw^--u 8i:"d.x҇-klS8( 1b2S#4HHqi\J. m&;8N4!*S'qΊ +F. *y' GZ# 0~ozGȎ / jzSXp 2"E{xSrEfAIųS #eDvi#DZ},&' ɆSX 6l.'@' pwSt](Ygxm@hY!)kY,w`[85giL :/ФZ T pD7R@qhP%)I E, LĜQS\a@D,>#Q~OܑhL~(:R/uf;E9X h7cAE$ felHyt1X T`skeʛ:ZN[!sjU[Y[Kag C'O @T`P#/CʠӾaw@\ $ĥg9J#rqi>'8۹j>\p'ZO .MLgEN$[W=t1+#Yd'#Y0F$o#f56W*v<2m5!#g`ҔA'@3%`()@3sa4il%haTdab5iMs!+PduMdF&Z^!E6e6aCS3 P#/P^(_)f{'q{Tqx{2, F[762BRc RF&hR|@siLlاs;' Ga&`ZGjtt_&"Fv`-fV71Ul41=K&wyaQ$1TbjvW&bSa (裉BЂSt9lAɀ*@\, Me9M%(]"%h'irў1O'giN^arF{ 8䎁 ڶ yzpbpFh Yԗiua&y~XS+)!0:$uW)йZ_iY1,I`sEvl/BvTށS"BLw  2@` _mL0%)5 )0 tyu!Ч}A 73dnp7*yJ: jZC&+`>`iP:zǎqg!eLAqj\ s,pyc 5_Mw~)?8K,ҋOSY<_I5EЈiGk.B~Kޠi` sU4AdH2BY;JpZ9a2*N( Y#]QA^a6c6$6C%6),O(.+-498H,;>PdZR4{qB*)pN"z0*ƪ{GЬ-ūԊ,t9FF^%w"EВEMk)b-i49ufGYt˭%5s" @@qʶ096 16LAO3KKK1Ln4c%k  r`U09eRZWآY7"*t `+b11hjR n1uPv5:t^Wk v)Iv~ .a*UFg),v?˺ H / L5vT'헒S\XaYő` Pn*bX2_{!j  #j w9t]ᗖAj򨅛t,Lys3v Hs.ViXy:(K~I`}&l÷E_SA<KđR\n:q,`t` <Ƹ<\|؜,/[_`1DqnlFSǐvLpT*)\KX;rqwv\JL7н2~P"@b@G˩v:6~z_%yAu`W-"Շ`svS!~Z'<46Kħzp*W@ _p&``C>Sm>/ \mm&PammM/PeLMgg]iibelmsiMgmmY$|f&Έ@V\(u\"W~)ys#ϥp{w ]ЦyЍٞSS9s Y}9)?J6] ieb(V7:#)~Wkck̬PEV^ 0pB `0@oIs0Ls@K0_`p6p ^$$dls` p؍ν]slχg~)Fک RL -SI3I*s8~Sj`>ݑŒmv6A#}n3W!/JTqF2@A*|z@ w0ߚcmd0p0I}K$nH#>>뭾괎뻎Ԭp6 V)t`)=>Fp< DFȂ,)\,ErJ uyFm^ Y u[,ЇKtbz1sf$GWˀ$"[}k1~tT& @dX>Q[+$'XR Гp,4_68:i9.LFȫ}U tݑ!L"{"e>tp͢!1cGW -7'XsqJ<#lR\D},gp&Oޑn$mdbė0^N =_~eHeM)K?MROk490L~}ԅ9]j^z,\Gb_һ_(6- w`8':x#q_~[~)#w?M͈ VIPp3Aq/ 6 ~_dd*ejjee_b^n^^~bssooceͨ__ipib^~~ܗpp~  DGN@k^̘!Ÿ/2`ФI2(HŌ(+Yc d 1M8ah1ǎ, j (#CcʔAcM$;6a1&G\ DNN ,!  $H}}ĩ(QzͮÈ+ R`ÊSF39ѤQ&&^ CMnd&Nzxc˞wAϥs[KNPIOXse,A$EIqRy^OϹ7JQtW,I]vD9e)Ez|E1P_}3GSnbuU~6"`[Vo5"|AH_mq8YN!:_QDTGuBq* B!Z3u\&:v)s*֡<@-Bi4#0x+8f@rX&>I~!FihV^-D,Sd$HQsHRW]vsrV8XE^tKE O(sRp5qFme=D` jy1r \tZʼxqK1!C0̌V3o=ҫ=R=f=i5[7;eO=>ڔX>>Zc|nA>O0)HRS"?\SN1qXa\d@'d&yثN}lA"s"VQ {@ @zZPU npq4^p 4hيu5'zH!R@oCU#G:Ʀ @pI!ޢ3BK]E`WR+CB 40$عl3ԿEa*TH$)IHjt3Y6ԲS0h:4q:< w)*\DSZ$QV,y z '!F,Z@:JUHzF >!8 p(yr9s0O$R*kS~"JDq%L{„0R9H`NHr%QFS 0E-S&x\VR;LCT3cT;2g6|Īf|" ۰X54P95T#">Ms=%|C Zp G1in"#GtŢ(E5%HI ]Q`St JEar0#!DpԖD݆D^I*C( =ϩCAg4bӊ4 zi9PnY45GITMP-l!8…= eE*̉9$tɋ#% v@(rOT((2YVtBmQ pLSA=Lw{;!_b,󱭆L`c*X(V-~7ߍ28»֙q'.ҷ~DexA$SC%tg9 !+6I<1Gz80FKH$*sT !(SD)oK"Lbc˨%sh dDΪYQu2+R9ZV )mNe|"2Ej&fI- XAQ?^QNdU4U>L2@z=i>v.RpL ʀ4vK[\j[``sqMre|Q2MB>6f#Ø ?xD囲A_8CΉzp8M6${^DAasbz'Gss&J&] W4/k _kF0O!t8>XuKN:&ueݱ>0[sY~5.c㛲:Nf!P1-֯QZ +?|e+_M" >iSF*^ogD/$+O Fg:='ܰ1YV0- Ry({g*5V;GV/z,CslwL3l_ k""7y)" G{TXPX@[4:T)\![_fu8BtkJ0urׄ"Q3TacC #KwA .4 2+5mmXxJeXĀЀEgϢ$ c, s`=)4v(&V ; s4}IIJ׊x'EAMx4fHZ[8JFq` 芶pXBCzPccT34qGux f#Xzpy1UW땎NyTDKrK M#s"8s3-Ohp)8Ha{iNH:tCa$ɑiK8"@c WQw`G}M (Yt8xzMb3>AkДTU;~[P/P0}E!r)5N(tIR(uaDC K_8xK8,e?R@\WR%zDg3츈y]HNEiM0 '606[)!5b @ s "9Y)0Yٜ*!uלy Yٙiy)!@K BbKC){\ QÎ|HKMUfHC?DI ( x3@X&z'&*+p(-:5ʢ/&>=A ? УJ:?*> Kj> > =)VzRRX_Z:jajB`8Se#ITG u5ѰeGЙ}8V ҠX^Wr%u5 ѡ_ I\::,:,"@6@O-:-PcDA4@mwpwwPʬz pԪ[SBjDЭebmqc0q0lڦ5[uJ]3!4HC6W"zEXV :-Cmш f^0 C:&Bc<AƓ@X4^33 gG$h6D@z0mw@jD[zЊ#P j>ҭD[0 [oZKqj, JrNi>r^:} _C? 2 U2c1d 5Uu VUdszM>'8; M NްYU c4;{ ooNB PS QpTMK:j) !:u40r|SķyZ۰c 0y:l^ ,UhE˻ `,ۮ  |SsT^,wK# ̌k\͖ۛ7|[ת ]i4W=3Y46ܲ)ɔP6>+8׫0\͊;ӎ\⌾:M=Isޤ*z. GF' Yؚ_͵UeMƀ֩*ѩ; !y9m^s]wKP+֬ ӍlD5 |UW3p\E~@|*]ܡ3ؕԬOt愫1V$ %"y(r>ݖ{=M䎞ɚK{>.Sp@Ylt8[n lݏr=MYrl+cJ2$-o*^.^.y|=wޯwَ^WEp>Nhue@ 1y^ W^ LUcn.|*7ŽվM#A/-)yNr59NӮxN6tQWNX `OfMqY^Lkd\Ԇ2Ba ĞeƎ)R_e~erp;@%o>6CN$V/_4^TV>Y4፽F>ybo`p_ovnbحOv#aFdowdvOmop_d޳xZ#jV7 . i;_Cь"[L ;IO5/^؟3Ȧb;_?ENObdptqrordh_dd_tpp_hqsoeeejO**D+<u^~~^ir_bbiibu W jth4. (AЃV #ROea*(Y$rY}ԑ&@_4ViV?7P8IBdyAes vI>-OiPb Xhu&mAy1ƚ}XN:Uvy]`uDt՜8ZڇvI0[EG^X)Q>>hJ_Bv)D!ߨQ\HXq!X1T+Oݚ"J)*R"YJG `WUޙ_yIX%МF1uv.j!3͸iK&l)sLd_`wAi\-$sA |$穗e1}_~HOJoc"́:4Vr#jT5dž,*CK/ƈ s*/k?ƺn`׻;6oL k~P~- |f=1;31mfd82AWSc`l~w=7j5~4[XUYatK;t7tWR @4Gi񞲴)bԖ@jNĞ 8b( A>ڏ}~Lh$1?%5LrWơm!KVT3|HWdi.flp1^0N9uET5:) 4%0HV,:8,X%'R.|b␁Yl! Y I-bal+iK@ 5#S32cJ3L~zHc[W /IxnU 42CLG9 `8كȡ'H4orפ4$I4p!.ImI I:=Rd9 s X?F:xma@AŴ2ik D[Ty%"̺$k>l09@Ȍʠh@E<0@oK-@` tH @0֭_  pĻ7V I_}lU2HD`z`/vP,@ u/D-VPФæI 94l$'! $8<o<@:&a @!Ř @ p ƅ)S'򃬘Q]tWဆ"+ch@g:Π5i7SҴ6ZS,hAS,/^q4a[B@JysAh@J&7XBW?A@ηI}~W"@|9߭\x d~n7(7<r=[>q K`J,-[${%Hvy%]1N 9lvy-%ܗ=DfO%!ƨl`y SPbm:/kбbc%QlԄ_g;:xH !lX-+ d1(^ۦ![o@4Yih.=xJ/{`} ~+^_@l'_NJ{x=D@XB_Pݽc8~-wUw/ fG+^N%냿 9oG"8TR@<"Fnwdc'seledKF*:B?t[2),aCC#Qh fT/M\ U(/peG q0k&]Var`c]vvi7Vq^W[l҆pv7k!`u{P ^ p|KPy"kgb7xdezd{%b޵^` i^qV `ٶo`@xtmK0]"@@߅O|t0ԗr72,X.I}1I~7I s gkrsYD204sVS6PU SSwcԋ`^wn'w`@ 6vVx&l *w[{W^UȍlbK@xe]7Ǝ()KliN"0 _D)XqPzVl"~p_4zup9q{{G lqQ^wwm8*8}sPrqr֗Erd2rXII㷉; 5߀~cKkb(w"#' ^aK 爉vS'H B X  &Bpi،Hz@yVu'8q1肀/`rm)kk WJwbu Pwj 0x\UXz 9]L%i;pp`o(k َwpV]X‰b vu4ܹY6) D`6 8Q䔫gEhRR)=Xi *GH֒?AUVe#"PjXWwu&,"Y/|uk&yyAy ٍ͈ 0d&WavIy\ΰ{g~u'"l0š(k*^{w!Yw$*vi!ِxeqУ$$٦%KP]+vgø7ѝ(|: WPs:وWe$AE~5Bؔ;9R~>7t(x Ʋehd9PepQ h!=l `xj xmvBwdv^u\7guP5'kyW@zyڬ G6Ф_`yzP\"@/p\~Yx/u ui!(^եw |"pqVZ}8 بt!I9@5!J(gwm@gDz0;J"":Z!sPv&~!%5 0EXHiå&D5 !Ha7ck (V*gpwOF apAypcÖdU]hзs0_~ }p& /c]PҖ1Z@;V}c3+G#e%G6p U+G@~(^}ڧqM2;pf3Wp 'd[s c7pJiC:W6bcbVx 8qp績++b{_{_pQlnAX2?SW*ee9sB3"< b H"Ȃ 3gttr@bAjZ;\$\:^ce$O%Frfv_;xtVW^lC_li6k( Ji(7+fe1#w;Ұp6Qn,b2W@̻u9q 뻴 "ۧ;9cr[N2rc[Tʳz op;Kj:ѷӥ+npݰVV &q_F ~G6i ;|qdNrUɟ =!,‘⟵`b؀2LrJg Zis`1DZ\ |7IXH[.lEtXV0Eh;T0ğI| ^2apd66,?pV0 $̉VGL"0kÄ=&=Ƽ]WV`$dz_m`(^ 3)(m*UЏU\s],,9\.ш0dPT5^`e(Gqnt *~NaG*`^;Pl+k#^$?e^fsg6* 1;Y&۾ L೏QEJgej:i@e }i Rp(:ffPa $~ӊRm06P.>?je"`*bGY਑ݝGLb1qW=՘ ;cmKл޻k]$_@if⸭ zpgpc@ }]+n`b*P(ۮ? W$i%^u:&mAj?9)q.+ԢhUY}Y9ғ50+)vЂ` YU5Nmw  P>W R |a]U޳<+}OE!0@+ O )l:feJV$M9qfh07>a;O>K@75| [qv^Um06t c\qey\e0@db adt k\$ߋ MdP8u?+_M ,? ^ibiptdecccjeejjcúzzcB/5 t_hז cjq mw&&*odԋi@@huu^~ ygn$i 2"p؀SKI%%_`86P x̙t:P tǟ4UIƃ 1~R4_%x%$X`R40m|!d5DqX^$,P@- Oxc Uq;5!p e4(0M0B?.@2E:pԵQ*J۲ V8p^4Az0.-(˂~_б !GB"I="6*4)ô+%ha-t(L Rw,3a5ٴrƍ4z 7q4j@NRrP=@!MVA1ģH "AGu$G!E|Af)R a^G" $ȩF72 UQD$Sy%  M4;fX]>GU IbH0iF"c]rjeժb҈v[ @HjCh[q@< Q" Bl98@4±sH$땉ĸa+'IuHVR K yRu}%~$p"qe. >q)3!,\hr&$gƴr0Rb'B8眳_!q0 * &!Bw Aq[@p/eqquBreVrit DhP@B =w-NrбEu-x9d9f1Bh@&T^Cg1t"0WZB" wMB8MO.B'd_ݯm:D&@poE竁?>M;mc衣:^IV{a2;E"IX")t`Rg9s;&AoqdD+PD8[*&#9&ıP|솢dѢdPʆ2cˆGl_H9Pљx6| Ñ 4d@x> W 6Ŭ@ Rt .W}(q t`rE-MpIfUj"XHQ @瀠h%ALP@};H-dHXBDa`FZBTbp @|( OBCԐ|1$a}Kd"3" 9hprh pO~OG8_=R 3 "IxFe#u 8dRv{e u\8}0Nq3_ڼg|aĦ6e/Yg1 p5ur έh,4R768s_.+ؠc odR'Kco64BK/]L>fo r3cX W'sĹN$mr_G-iB’X1:/]EX1,>"1 P" LQŠtA@Z'fWn}7_^o XK$`OX&A*,G^:[ʼJR{`rak{jHh :y62Lha˽JYsa#4v^[Ss= <(z-׬~PA K}xF*5x}`ʄsX@vq.JfM" Y纂S`C@oǿ١GmLpU^5ݵྣ6m> .j/Tgm.t֛+i xep д$ ` ,sr%G%t)t,ng鑫ܥ;=z$Q=%$$ 9aD\L#&~ߛPهF1p됧<>~A Npcc:񲐦A*2V_z"y4|d;9c/^`]V-d=g[/ ͶEm=cJ,VmTy=6A#Z4s X9"[56r:V8#g=JJ6^JCywE4b:0q pVr"q(2.rb*'_%=r:h9sW=u:^%cah6 B}1~ m}(  SCX8c%~(x 04AoqNGQ݀#rCuI/i:5WXzƍR %n 75r@2m" o뺺ۺۺ> j BZ#v^!a;J|~WA *S: #3md0]T({ /8S Q9|oIt$4"Rc|qbTP !p ׸"Pc{;fTN K` _P)b&|'J 2k 6K۫6p :R&FZĬz2R kЩ$A=]@! #H;+1:˺p+J}t[a";v|lܿ ᷸+!# zR#ȭ94 k8&cKĺG*I 0ӊQ&!1BbZ +0faq x?<+U ύ! l l"o1|:_Pzu z ݼJ sP çL\=0w$ב0ӒWƚ&Rm1_(ْ˶-RkLk k휋{}] Kd~6v֒*,"T;0!{cעcM=b v Ӹ|/{.a/\2Ls=&a1חhNˌ0Wټ1Ү($ m<k왼Mܘ!Ϋ[ ,Ȇܬ܇ܨh3-B m[of¶Ql]0c/ܗL/ A4 ؜9sT9幊r˪X˽-ki'c~ƭ 쫩 mͪX>1xԎ甹!|Ց99!]~|! 0q9hk z i&FQ- +!ĸRﷲe(ֆI <, [A1̼|B̺_%}}̾>PD 7.ͽύ;N #9glZ+Bl+BЙK3_;>Z(Q kc@jWx-{yU}n왎"#kԞ( 7 6?hp;oQ?_? OMPaEeDLsZė@}k~^Kc%U#ـKQP`t8 __銿O=nT_l M?~&𭺥oJ?a ~~ 6~ib_hbbii^^uuu~^ih_hdsʾttrezzccmcjejcB/F蠁β ð!C2Bt(ŋ3jȱǏ!$! Xɒ%_tPT  8 JP@$E(@)8hХ_hħSLEÊ5ĉ+%3.\puKb#1!3gФV-Èœ殱;I-17mw^X8`ϟPh9d F R_KZ0/nŘ2޼9=]D@` RAϕy"rmmʺv^•ef/W}SdɁh4;F<59؄Se8䓘6l&A|2YkH$cjFH6F{a"?g]VdzL6sx`%IO!UU@\)^PI(fXLpUɜ%$0 3 hF` ƠۀqzC`!=Y&&d~՘F.vڋͨҨf䐬fEA 9oeKMc:)B)SV1]R^zJ+gyfCm)ms7̹I^J"hdY L&oqῐR6)?MpFb'Ũ)F*i:8p* IdGĶrS^Ja%ՈY-@UP^y{˗^o6mߜ)1궻ߧ 9CG357ƽ&zd ȯ9\oKZi {0hx1mh,&N+w#6o/gN16OG~\@%Eza+J:m#b+ UK;rݵ4h#;̯=9mm ޞ*-~{t#ޱV*MyoDX.,7Y"nH&d'hQ 'FJyhr+8$0^eyR 6(5+ѓ9&ECJYv{޴).늈>Ո4KbZqvqXώ' 7NX (R&ڥ,]01^HBĘ0yP! qOp^>.xc"YJvQYk7%fQR"E0,`\JtIh3 .uBu+O((8i& ,yPpuR B 2aƐnxT3ֹ_@2N j2#gadDh7.e媘$̥aYPdV-'jKh DMV| t5oLsleMBvSP6H02o4)rɜg>I5=MF3{|+wU?2DhLWF/y( ֪j ERu@co8O.#D`!y4i(b3A=F6ZPN`A?aMUMUju"TA=ճE3VTr`ݟXHVR(4ggCU02WWEZA :ZĺN)b1;`x; ԨB/a E6kzDY!F,j%W#nIu0V.+ q^Vwƀe.]G̼ Ca[/7P6Mzϋ![(#LjsԨVS%[d?elVsE%souk(EBNzhϩ]!}4 RVV, @)*z jS,v˭&!GɡkfwN:dͯW ";TV(ۖ@c½h_ POMUFB۬' JWN~7ݍy7{7kk[63s4Z]MD42<_Epk1JplO$%{Lv"dzSu?NQca,f)7OʹKk>_v0ס0Yt+ z7MoޭmQVoe s6W$;oȿ;=%1UdwHRxz z, aQwxaP# qDԘAvHp;*B #1aw!q i8X ؀Fmb?bqU%@z);bѦkGq[:xѲ3h-$N:1b0: QxJ~2(sa xR QtIF @gyGk'o2Y/yNZՆThq'T|a(f&8 6X{Ɓ'R%x(8/-WrU484hR9X&.Rw#nIXqՁL1qMDFBI6UXۀ<]liGNaX7cXqPxؘڸh 8|AXSp ؎@8Xx up@@,xӁ'׈;bXّ  $ `(I*,ْ+N@1 t@6YxD>0gUq `CII`#PIC*8cs2Y! 5DCBW=b~_ d=Rzpr)h"F DB wwɎ')y'٘阫01Y'332v+KAَy ]Xiq@yYLY 18GyK9( "c2T0^ nܩyb6t9IIP &Xw9Yi)b> Q|}A{) nP? ڠh;᎚{\Đ 8աy}8 Z2>呠^P)52q Fwsr4z:U%Y!!&t:~Ve\Y7U)Yax(7jO ӥqp`:r`hzjtuSpjzZ7AIf&oEwn ʨ*-:}UASn :Щ<wz;g$`SS&X99J:Lj_ ߩse!Fw7M CT"tTڬڬo NӦ t2o  :UQG虅 \u(Qɗ|(@]X?!R] $x˄tqoeeD"R~"խ+q;^H*倌 Dwܠy4['$4;p*_ୡT$H]:犈vڐ *@$K7QHXXXJ|VR1 [N {IJz;Z!r`OGYt{(;FGNyCJV*YJe !`@[PKz; qp0 ` 疥Pəzy~I\ʛpN3 D1 0JqP&0&o`lmP پ_PW!)󡑄Wxzq P kyY$NUuIABzp<)P\ {c3`0`P!z@&jc24>u0 _p>@\%l³zWɸYZ 31'z2RW FWlq1 KC[j~]  P,wX q;t 'Ɏ2I66ЩWP=q^D2-*& CFrrl[&[h vY<@+1sA}Iz֠M_Y6TLy {0Dv Bjٌ1~+6LΡvGJW%6,H{|zm/m-}MpP$)6A `;l><04]6}4/ PB&F ez>/C}-XXZ13`%>p@-< 3o3jvRm `{W*3 [<ْ=ٔ]ٖ}ّPm>`m'j/zSLs0h}'-۳}'ٱMۼM#]}ܑP@ J-LN_4q0Em ۽ #Pޖ۴L`=5p50>ߍz)egqQwaޚmȭܽ˭mp,<(~/pޝ6~5~:n0%#Da `"dG|vN Pp1Ž\)N]puqZ:0 _~} >^n~M<$3Ղcc㒭=5#0%P~^ꬾ%0mN NN޺ߣ.+P# ym>F]pt  &p ܞٱ==~^^+ awf~ P>m @ PMcSZRo k^)0+@Nd?V @v a-M4# >?0^T+>#_ P]]\? ZM>T0>{n6=CNNp){pP=vkWnm.>۵]cO06BH~&Z  (!NU1)Rcle-ٟ۹=-|NٟڿN'>&M.c^۷?L# #'1N1L/sbb_dqq/> ##)) )++ +N>{`c& yN #NB`k``/#tЀAr %*0jDGB;u*bNr `d ̃)(Aԧwc_c}:P:SqHIfrGX ƋNןQi ҄,9/Y ! 4P` 8"3cc*b8& VQU4)u1N YrbYh 8p"b梐#&mPBN8D$@@0GۮZ8wn[1$R,xEw@rq`8BI{I=b 6:G<<h.9|P_xǼE+}Aax:phr:|=" Ot/҃` 0.) ۾; p22(y+Tz  ID/lB)0#VF/`*Q)^>aPR@ LkjB!bJm x@3f#7[ b !P"LD q;'ԋ!l EJS900pDʀ0$ H -D R6-*"p9#Td37/:Xy fS'0qT d*]Rß;.=I@!B i7_ȨwD{9|E:*^Hv:meY{AmuOhoW8Jd2ZvE]#0ߒ 3r,eYAc77K%. t[H~nlzfB6.q 辏 "^cE@*4𶚤4SMK>(gI=VQ񾗆+P! ꈅ#@}"DK5Jt\v,IJ tô 8." (Z/xm@"q|O ]j)Ϧ+ѳ`A@ָ,Px٥Jag[降<3gA ?}Œ=\BqIRֲj D5sBLB0!`ؚ.ӧ9{~K]rP(Ї=HZw9h,`K} 1NHL@n]KE$8=WN`ÇM Sr=@q>' PvCX5VW$zIklcRTW^5 \aAf}]q!Pc[[,>Ā== Z՛Cc-Wcخi>1ZҰ (jw P_=Rx_VJwEV3ӨFS:Zu<0LPO=d֊HvBW6d-c Hpr{) E$cR&lhuԑf];H cg9m KyN?y&YɁI؝\.?QJrptqeStm N fxPu L[rR= vvB}k'$M{FhvViBLUWXZG@"<< Ez`0%Tj=S^j@O_%DpG|BTmf'xl E,')vߥg5 STGn)'B"LpS(X w6Vo{u}HG}pR'6#?d7hY`Y~dLXU8a}˒'V&AgDAsaW8P;RxX7zJ_U-+q!xhuVwynFvXc{MvZFh?eL]׆~ٷzSf=F@ E*`o0|%F\e ]_b stvyz3>ma5'>lCUi89hldER4EW*-)@J@7nm#0o`abxaW|Gpd.g'(i|vyAنJO py7r4A1>-0$Wyi ewDC G"`y0Q3r4(P'}'R 1j%Aj "Ǘn9>:.p=z6<;Y=ZC.Sup{`,"h0UhJYhGp'oN! p"nC ~9 )4Ugiql0 !c$U-A F;H reeJ4eRFJjM5]P=(C(a "p)3xGS>+V$Fv[CYvJ:+Xh!2F>Ɣ>,9h`bǥaR4@$@|f6%gz`{Q]džB$CkB|:Q5Fӑ%?4#?z&C7>+Ģ|Y@$A!zB'}+y ZW򸔌h&I|02ꅍ0PY#]y#Y88 U'ʊl~n&K5Dŋ}xW?2GNIoPp`*ˀ# ]ghׂTwM!#h:h55?f(HHuҖC. w w %YjWVUdgj6DKg.h 90[_ Iwb)7ѫuMГ"(m]([ z01kq+P2(O#/h/g1k =[ L#vU*qPr!NrJH9LӞߚ#0ib@Y/N:)!D&M" bM1(ɚG02_","(.8"0DH= d`1s@Y9ZxUg>ps[EIU#U^^ )zrb+iüq^T"`|k >x)1i. C4$qoy~B=U"N4D69"< R[,m<x`pѩ&):ӫAM22%[a-^۰o 1aaq}3< T([:k,x1"DK.R>|㮥k@&tS o<_0VHHR fud`B9{"7R1l# 5޲,J6IFV9,`w *T"9%D4S a!w Vl xPҋ@D—eɁl r4bkc~cHqu'ீ;W# pe4NM!^dD-k2Nd6%>,* r]Cʚ@IDo51R>\9kAE(HM\eU1ꭦ ̈́R>g@dɕzj;cM j#BzGcwZ^@5`!"GEY͌*8c1x 2mԨ"Մyc)dhјT/ /tǃc(n5t#Dr92]D&bӄ%t>m`Lpo&{/11 1%sƆ$5=Eܤ! 5iPX `> h˹|}Dx4/ P/`gs&@Eeb `u>EH\^]\*~`~*Y@A БR웂K`d~..fx'RjQl~aɮlA S{ڊ>?N*>3:gT,?dp.A!PLyPoVB/XQ.00G>\3я/NI@2/Hc}._;CQ3έz0jwg1X~2^D罀Ğ8HN @``O0Ğ'`QT$I:V*< ЏB ?G0O0z|<+?_G E<3o \@o_Bڿoޟ?]OCHbOO E..oOL/&BcB`/>{gg```g`v/#th_q q///&[e dt9! t($a#F\PNE_(#hhZ'ƒ0_Bi^BXj@Q z҄=`@ŽL7jP!ć f59%Q|\Ёlٳd8ᣭ nv;W%!&Yė;t`!A+^1Gf8AǘGy3`ؒEV,;v1i^:{޾=wǃ~F8ГI0 س{%Mn4@ݹӫG|ɬOE2ABC=$ H`FYdCiGLt*@P!o`~ALJ ~FphC&)aؐFl!;.hyQF@BуAB2 G4)$q хDV8 ̨^{u^)G&L2zPef_EBe 3ogt&Jګb)hp1-pFEν!'5cG² WQ!єc枀I@m|)syTcԉcy"{@rˎ4Bi2ZӃF@{4hwPZڥik>T5+hl}C !~`0 (ۀ nx>4@rؐmG87*Ԑl^n騗Nꫧ:~.쩗k~N1ؤ}M5Y||?^9g_o֩F۫l?\7W?$+&OrzFH4M;-yT-` d5Ј\ɃFI!6/pgFh C1B' lV話04l 0 uS0D$tU">T<00lLz:ypDԉYt@E Mx`֔2"HIbH`D8/BԆUfKt=5{̇;Mzx֗9fCڡ&IJ.kTnvm5BtbL;ΣVJlr,gBnNt9̝Q>r4B6=Qm~HNG:)Sδb B%nܑ;&0 9^8L=yϋ㓄('7a~^g>?ΓujCOz%:ɨ 0`@3kaJSV04ю;H=m3{̝kyyLj鞙L&ڔ,i Y7Ba%85l8߳N\ g/{g@?q;'IVz*Wp]h,6I0lͱU _#8W9Ga:uǼ|K˙˥̒0EGzhBE*jC4xqkbsfj1^T;BkbީUxh?1L}0YA"TA㺇Vi+(W4Ԁ0Ed}\|Kڷ|V;}dvdMEYn5׃$2=XԯҚ%JX~8-L#i?nTa2do1zXJepY@ 4\/Uq6"2a1b )"·8_pO7=,3$ !/E&%= Yb&1&N$3o[ ("#*+PZEArfV7m;{v9(;QX*e~o%j)e/{y`4հD}ݰ͎1m31 hs؊芨xH؋苼8XȸsPX..\%&&.r8(&JhX꘎A F%3!q2S%؏p['^ݕybq kT#^Bx)^a ޕ1gkCD̘.9ؒ467Y8:ٓ<)XrЍD۸h$2PNIMq S9"#8_ŕH2lD2؍%%%ɏ& %o F1eY,se05˖ ޅP2vi Gcp٘aζP/c``nyYy"%Aa$"h RYIR4;R 0p؆|E'|{cs)D$D@<щcщ7D(4ey(i?'ab8l (k0/^^`Ě6i z٠ࠫӠ)Zrljښ`!(|Nr#ʝxp]xxb~AC8ؑg@*s D(ѤL NT:V*XZYzZڥ\[^*`:fZhJj 3-{UE[rpP/zQzfFQ|kɖmI%2ڞ7lwGw[mxrI> J sڪ:Zz,&11H51qppWy*+̺ĀgzZ:*Hڊ=%hƨI9޳H1}Ol H&}p4; '0 ۰ ;YYP[ "a#Q +! "K@*زa*I[6{8[iG<۳D?@ >[F˭HH{zYɐ|0*xֵa;S;ba~l sW]} }C  'ڷ~;[{~{j!pNfۺ!w2b efp5f P>:ᗖBˆ@la0u W1P P;[{蛾껾۾;'P5˿ <+p|  L%%l\  ܿ&|(.k2<3Kk;\=<;8kNO RVxx u xQ"5 uXW]nK<}RE'N7<{8r$@x5$ʆ)|Y_BE@w" =ishQFg&("gTÞE*=uW`*,ٳcӚUv۶p$˕*6琥~Fd1>CL˘3?nqgΔOޜyɦȋIz۰OKޭyoݼe>\v9džrGN|إg;׽}޻QVO{Q5S"@#$$'  hV`-F(Vhf!f0sZk$agv *a 2 uPFB7H`n=Fj<6H&L6䓳uB@r #o+Y4$0& B/246* P58c$РGyaP: hj衈&\E DA2D^ @CЁ 4D>`c@ PqP*QanFc:6V 9`O`۠>O!+Vkf (tP* p*Cġº* ;tf p1j o;Ȁa}akDu, ch*O #@e (-;VH!`DY!rr76ecTp</LZ8D[ꮻ>{`abR@A8쀃֡b*d*c)dIxW8ek|w|C1e mYguG;3[8Wrᑽp{lg/8#]J+G(Y@ 7ZB l4=-ZI/`Cxc.2fcX!Jt30H!p̚e3 @ }C`f#_dt2Å }ޓE%8K WTjU1V>6p *`jMkEKCwBfF9Sgu*"4Y"&Dgua3 #d2,ġt|VEp5JSaÀ @IH3U-"9!3CeL  h';cB(5Qp,,gyAt6Ht)ejq%vy+5,1HP.6hJp"d3Bܖ2!cIʹRɜM2"M lm!dd<1FrB QOP{&#>dd"sQlk(wB"{̡%s(BC&}V𒰤LgJ a^Ad0rzL][8fP%c#j^lDpoZ@h a2@`F_o p uȲ2v/ d@)EcV𬞄 V"zENYπf_  )MCe@{--_#cwr5ͭnw{+x-qU fDqCCt(PBhG4g0q P૶}R@ǟ>\e{heXꦆ @_829e(O١rN4 k {7G> ;VC>ČX_dԠ2On}82ҬG@LyK۸27)Tܡ- RnT3:}X |Q֕D jx!C45{UC>A{{@aٺ +gA?0>@FYJ9UұnyH8H0ΐ=v~5aȘagM xvP]NCvAia*5!V0$Z]h71"V N OxC bm]"ZܹU Ё _)61-id+|rSA}(W3Ҟl1\.R"[Z(ڻ4./ C]+}A n dނ Zpq@JF'AtX ҉ QA u \Gz t QhO{h4m jDجF$@U{L= H>8XxXp ĉXJxdh(2fX%8uh6['A؆@HP8P Ȉ P`oIx(Ajx l%0x7؊ȏ588lYyΈ _8xIU) " "9oUp+d0( P  %X(AXHpIyjxhlT)@X18؁Y( ` Pc ayXH'InYpr9Whhؕ 0|YSzcvI]/xfٗY] pysas q@ %j `v`VWa0@遫yY fH혁EIf)aPȩY,)Xz)h)i(WxۙxhٝJШ yN)X.[0 (N8YaP /.>"JP$ٛ( (-Y!JٜY7I)]; 2X IIy  ׹yOYxW:9 m:q3y CYȡ =v;Wɕ4diNe W*ZZ0<s|P_`[Ybk_/ꪏ b89y6o{iȺk@КZ! 9LOP@g2m04$H)SX)SUX{)SO c6pP>ۧxHt **a9Z:!˟]%sL ʩz@]IiH|<9p_p{h2::zZ(jHpoʔY a/0,9bS% :50,)rN ={(X1(ȋ k%"k˥$|XW:b!@HgPڸ*cfs_ںbok@)89<j@_sm )SJ~8䚃my;XN87Y)+ 븀Hxh*Ɍ[˺%#+>SpigZ]ǚ0]P9wD(Y@4[6\0ZIKW{b0+ y[mܭ$ @>mӷ9t mPLJ[p:k˹)CokI]byGZ*,.l9M`˺lL6@3H pZc*`=~drGǛ5qs_9 ݈ HxxѡY#}ʡ%ͥ(ʍ"5kWp۸۸WLҘk}zw<}j-kPN6-<Ӡڵdk b)!})ck4@+ *qH߀'' } љKuɜ+}ҭ}¨ ˫ڧ-!Z:@۶]q0ָ'~н<8Bq=q@/(ҝ?* 9 1p-(@R;޹bsD*(vmd"՝kv[0jlP {^8~̝mcΟ٬J _ pYJ`Ѽ|P}6YL Ѭ:a`]NݳOЬ<+ 3Miw~U /]+GpE}ܮ5^0%d !Ov"Ty> ~>ފ΅n)|0+}bU`$[=aA.|p/`/3+gT|)܍HWʎثU>eNFO*Sծ5~5c9{5 [Pp~?||ʇ?(  a>w5p0~L-`[@'psag ~_])۹꯮֠ʭk PMxH? @rGP:!`5 } >(@glH)-Zzگr? !M\+gIwWmTL-B-+-+699LBHH-6M-|A9 k! |6+bb /b>|]6+BL*mS g *n///!G A*\ȰÇ+HHŋ3jȱąӉI$FR\ɲeɗ"[ʜIfJ0mRM(} ěOhyq |ySE̕-JW(ebC-BfAYlIK Yh1V4Dݓ7 *)"q @"LO 9G1eU#7MqB-//"   Q! 캼7o|94Hȓȼ7}y1PG^߮3{L |BI]W 2nA[k&MdV~ bK /lE;kuJ*a!g0 Y .Hĕj!R;URPSq`1DSA4XڨAe*FgDcT<ە SAʅ)fC%ݙhfΚkNdRuytI]4MA;tÀM`bJ D%L4^WQE ^qWY>ECxYࠔLjëG#9e| bk e0U [0n,cjEPqF]H+N*xQ%X?]~ycnȥ)l |ӝ$L F1r! ǁX!\0F-LlqV+ȫEXap`BP . 2!+p@bW+;k ϰF !2ل8/vЪMP@5$0Wn6>oM7[.qq0̑'84@97$њ(%H L4AOW[%Qi}[Ђ% 8jir-B8OՀpF<\pQېFL2MQU Bt*P Ȁf}}w@^~D;^xw? 0 HB 09HU ;||&? \`  .R! Or>(Ej -&*0D0$hxT55KפT|>|>ͯ]/D /2N<ο4Zquc,H&.D /"@+ 0s#9*0% >@_h06T%_x¬sЀDs'`R:% l$J ?U.2 BPc r>Lg8X<Ǜh}dF1"#9:&5s%#9oO9ىǒ'?O=!͏Ю׈9,(bHe|P zgWHւ'h,{pуxLr)A2>\Z3YL9dF6M AYk \bB3%<!Uݛ>?`;:Pp`sg@Oyj'nɚ4g VATPr J/jp(@C7x]k0\Sd`3A mW^l̑0_`) Fڳ"d>R45a|R7wU!xs:F'd+{ x8Ϛy/nBɍwP:3Uj⋘7\(NZ(om!%Ҿi1oLOAT*T ~ H%BAu/iuE@g3yWI>k~2y_OWg䙼_{4z ",Ѐ̒,RY,i !ԆY *&7ة@#P!-сt(I ~DbClG'LAZ(X3UMw<DPjZO(r,/TĒ {g]e_61vJBHԌ650mXڈk{wMl;}tC(蘐 MFwV(6 P'GK3RvDdYۏZ]S ]2ޔ`VD؉V:W'ncU2@A0n@ 9ЁPtAC tS=ͥPK@DpsC=oxRCv4F4 XZL >@&%pu3=N5Eq1)ݸ;~c/7+r3w6DBfoDq%Jlu=|@#]Us 0DDg\=$U/5 0Ԯ^^0W4RLOҠ%~tx8v֒.un]0{~b+! X3s]-UA|0V%LwpwC4ZVz3o!dS%pEYSYQPQ O"SQPQpZ/Hfc#-_c[ o'p wU =-b3S`b ~ow67Q#N/d$wyX8܁!1!w1Rzev $S{EHZ JQ0BZY:ZP3ih4& Q_Qz!=gik}@ *QWs1%6cveFZ 6'ji"/m^-wyje8MHsHVX @sȔs JzU_46SSo$ao@oPg7opA0J J9APPBp}C24Ċi'6GO: q_p$Mxf0]YcwNdҌЈGDyxBє%&U), mq\0+{YaB @fdYcgvCQ7O9$V`O p=x\ g8iGf<+2ܘgx=Ɠ!k:IExUnjAD)*dH?oH'0dY0ਚȹќԩv14G P[+W3Ki  OR-SmK^Нs>2H>/V PI%M}P*_d~v Wu?9 <Y<$ ;Y>)d.Tiқ|ٔI8ZUPxSJRTzZj߈[Q#GРT14p|wHZ D0cbb|@,Cf$\0c{#MgUpdJڄTo 0bM8vgZé9S!Hc9q7JFae^Y^O"JZP_ʺRZWWɬ:Qj< Sg , JsTX}i}H5P߀z/ İȇ1q0@w uWJI3DtX\#4\<Z$$(DOII'v59&FSzX@=y8N&WZ8Or@B;A;Z\#{0O0U {=5BIqrK\0 0lL8{-5ل]tL!pK K =Z\@+ۊg`.x> {~bW 03\;]kM0ii~[,YMh<2;7j2>ʹe!ORG˺|)mHP3ŀxKW</B $3' "PS0G#p&C SP O*%F 69p G+)Z26_B]{dDUJ~ǀuʀ DS4F~rK4}6)h!:{i&ͬᏍ Zʤ{jȑ3Kkt326~ڈ.ۘ!MJWqNSiڷՙXY}e: A-Ey8~hzʢej.Yο- .vdalҿ[y |nq^5>^NT|ꦞꪎꈞ^g.IP*E[ DkXZ&^笶1yN#?Ӻ >^~؞.N..OJn븾Y^{611:n5柉^O ?/_^Z% Y?ZY~)NY?-?~pt.]Zr\ wkX @4_IV\^`Z/b`o5/eh?UkiWVt_U)hq"^#<62y]4` DddFz yOnNe/nO__O~2=Ƌa~Tb]ЋsUX@H#_H \O//_e?ẘe./ /!!U !/ %5ȹѿ׽%ξQm*^2]! 44`*/^T(XMAAp8h`B` 1ͧ>:%QNF5˗0cN];fT9 u!*)բӾ[]a[cްzE JA  . 5Q$H!1q(PALYMS'T^zT3P_]1Q6;]ǎ}.|ޅ%E..r#l:x3u_|#c4}ςHXIK!ֹ(WiRܩFOglSKnWqyǮw̸.خtQ'G?&.n.44FͫцvA.20j|OA>8" km54?@O.xӮMо猻Q`É|t k\!Ƚy`o"[21"}J@/RY@nFG[$)pCt-y9U@0y+_<bq֠ |sa SC# x@9:2v|acSh%i sHNA"F`YdH(浡_l僃0 *eugy o83.w]D! D@ɜt?/QB2AU樦<嚢47Aʹ S@` -52lDCK>̧>~ @JЂMBІh/ ( ӈ;%Uk N\Na)ziBl*md2x_;cf `fBOb:PTJժZT.Aj0U^@I}_jhHXAmQ|eDXZi% paCUT/:aMb:Z(W1jLn>xSYمr \@LEa$(>.,(AR"!F= pK }dZvy*ЁBhp| H*pD}e+)_@"R@ KBqAIA4'HUp{H}%0LAD_yВ jvŸLM.*)fcqi]nH+6|.n6 :T8L"H6/zUx"fl Y|g bD&pd1Z_m%1:bK0( , HEY_,s! D;9#IRF; B=8$D`⚦3Vf-bmzȵ(X%!s051G -QCTC,}fKu|j(&shԂLf6OcNn~FZ%Mk=ƷWa7.nNpFCۀte smO$mja;=,7q^c#|KEN00rvcɅ-@q+:7v ȳCԧ>ܙ'HW6DW-ՙ;+ۯ@%+5qA {l?C'Ʋ#U;r推= .['+J{9.$ C(-jzԫ ׿yԒDeE_ȶD׷ m3A{WUxhGw%a~pJ lЗyȁ{8$X|g*,؂., (0X6x8:<؃/}wPz Gs]7p闁628&|VPW xW؁'!x}b8ׅ#Hhjl(}@hwVЀb(KtM-`wUT'Wmgֆ8XȧK'rE Ƈ`NjȅrV8XW||Gh؋XX8ʘ̸،x8W82 ז GmKh؎8膜}rAQ [ZGhX ِ yVeX$J 馋(}BH>"Hjhh蒸w4ɂ)7YilzxF~ l"i5JLٔNPR9U(<9Hx踎 %wlHhjlٖn6hxk$J]JXX}؈%#yShp٘ri%vNJ41 EvIyh@i99' 3s) )9YYƙʹٜYMUldjme@Nؕ~K^\y P}7q̹&DУ֑rmU|p&" Jfy+~jN~ @Ku;؞Kz +Ԭ~KܭURz 'Σhr" H-vZBܛZϝ)0ٍڼYN9:.Dnʦ["3mJ,{غh*ꌰ9LmVp{Q6/ktvkh pk:% %@"`<џ:Vyv L "pTʵ-Lƍ`˄ `!"P:}!M*]@H`+l\-K˽$??6jݤ{}kc4^Wh +R:eZY]7oVPpuK z} 9 jj@+NOzzљNˣk)p͝z{Ŭ7d  =R@OZA;!{e 𽾤Fe Pl \A]@N}{z kHh8ʺ>jLԢo]|phj]{`:KI|,UVe 2L*,QVQ"QVl5 7Vl7 Q/%7"57RVR"lV%V%'V7llڋF'A%DAEA)"Dއ)DY`2(LA5#%)P7GA "E9HqDeN <;$%efN,5W+,yERRgEfk  0B䄑ݠ덶9(!,C:ikOZYEHލ.Xdc :MC7RPIRN/9f)ȺڣSxC`Wcrͻ߽P̀LXμsQF)B!„PdqYƀ:\((PʨTD1g2eL~  AED!#[`'^ 'K+ \0`(!ư!X!"(X*@6g D 5 I % :EM3z0^y/E. ܠ eD8)=p@laf2 ;7Xߪ$Qĵ2 "HQ̨-¢&V@~^NptI%( u%"dY!$QPê&^R'aA~BO Z\DjsQ9dQU+_c1}~C { aA8kRk [DU8jޖ[ZKVh{ҊGc&!ʭ\^ X܎LV:E,6nR Ah3=cJm F+u(\EV83^Фd|XPGdN7uSTbXOrQCI! P-\! qeZ>u)#:J6ЉNJ-a|!:%cA`^ƥj:JsK&;LT k^㲋VJϒO;ˁ\ m d"L;EddژpDV4M0JV.)b_څɆ"[WҳD|#ȣV#`F|xx$.R`CϭXnC&!$v7/P촜"N@~.t3K v[ ڊb-R@v'4WG5#!:F'* {XRs+nf q|}R)5 @k9%OԤ\'(d5Bm$+9"ą!\+J G2dأ!͊Gr@+"I*' <%y$*0* V~j#Hc +2j&? 5~P) sJ^D9#G0=>K .?P P6b]|UVh20Zf/@A~bsp(R}cefWvfjWmGfv 0 s%P#ĶJT&6{  )00_lA8X 9?ςBq@ bS[:1!'&S N0+p;J \xM@vFn@]+P G1 +'0&! *iQT('B?9%h'eq@GJs}$1I~w;8jp}'cDKpOR:1C )6`*v!ra'%p;P[]GR/&$=z') Z#|avC5DgxD% s5Yb!: O` "Ӏ'6B @Wp2WA'VPB "Op V``jR"/9$0ezh xRu0`jeBye -eSKcA'H+9t !'#d)qS^a Z vN1 WK3've10ufK@#w 96vDК#Ԛ&q(tF%)K.'pzR$Q%|'p5P[EԝNDvjrQղrHaUǧٹĮ/97APyq.Bښc*&Lac[GךƍK٣c)1.0BHឤqzK -eJLu~PK'N7ک{C+: t.I..) ' +m9'rEZfb#|N؜M>^~~Q]"gި- p V,G`9L4^㻌,|B)P"Ʉ 1LNPR>."s$6 Dox ʢkJ5^p]x]hBlCɾA>^.e!$f p bx+U 7IT@}r6R}d& KQև~븞뺾~FC%~2Yb0a#yEoQ'|'q ҧ{k@n d0M=ս>^ܿ~zYےvt'VR3$ŐL y_5@ B:i=#ː_@_ Ǡ XV QSJhvō~2?4_6ПN

hz30y|W \@ -7`'GE)qE#OM7,` AxvWKp LQp'\@"~bv `+@tS K29IA_vܸ"*n\5O7RQR 5 ("g\R\"s9(7VFA'\\"Q"7xVV7V7E%%%7%E7E9:9KZ.. H*\ȰÇ#J=P@3 dTS(k0)j% \|vʃJ锈T.Y(Qؠ\h":u2x`:'<YHݻx˷aȱС(#+)ǐ#7~e^P&BnCvkӢ}ɞ۷ ;ޱi wxo}vojN: ~qcË!YL2e_ZȉD>_FMѪAп`a*fHnDxׇG,)(PyV%E{A[P疱&<\) ~*jWsjIv|b cV jﬕ{ 7_A*瀥yk YK {.cgz'x ;.6l} -WilBɩaiiz9fqpV1_I-iݻk*7g|,=54[?j WbfI%Kt̼=.ݪj3':3hјCCGõl/ SiZ Uc7q.]Xr!2dɑgèذlzBS]FGe㓟q;+:|{܂)HpmGe.vMI:T˪JjVǪz%ŪXJV%8KGjfѫ[(X3@' ׇ: OTKa*X6=pJÑ0Ķ|C-ZK8IJL7N_ZJWˊ󸾝kZ9vzI,bX-$ljQ v1㎪N yZSu<JPw HUBpkd\~"R0!K!iצic A t0jNPX(^kΘbh0X:B`<@40j3PTdTp,isO\+Mה)E;֒Af,#t">π3m 'wUVB;Z0':_!rZJDcҞU B9sW^ء5d7[Mi[;hȱTI^K7fv+k[;kӗfwU 'KmFGK` F[|p]~P\ a F8a ,ׇ` 1kv0EP04_4In*@FK;H`@РH~XXuPI͗`$ov?</IH߭NtX}N` p~>T$O*S/z:H@iK›?0{~% Hoխz;,_Ͼ{hPs Ǹү\):dr}?0tʰ u,P~_N-Gtt`Lhptv@t,auu3`sWUv0{.'0cGe0Br|T` `,P:vx7xwi8vwvwXHv3SGz?hwGP 3@jTPyTpztzKzqzBvvT {wvW8vf|~`zfH|xv~PFHx7K[&'w7|8z(T&yu~ IFTt3|w|hv8&T)郛7x')xT@3 TpvvyyG]z~t@АHkU|xxznN`gAAPFPq9ӈlAq(s0'rA06Z eVg`tVwBELgwx1gGw+Kq/ TuƉs{wv^|`atp``@#zh=bA]]؁WiG8P$9gzMTITT h8IDz$yzWivPt7yKv JЅ xzAv׆fViz 9*,ix&yY>@hЗpQM R D A,q'@ R V>e u\Ȅ:`q~E rZA )^ZШw|zwgy@",`lp0 IߘsQ8JCv.Hr,Be1srtǐWjdX8WT,@Nʸw7H#HeAwN@JXu 6hqN) u0 utNjZP(rAzyٗk6X7`:Ph.3\Z <)M1[S);4짼Hr޻(EppM! ,LIk߻#'[),D6| C_촛.XMqz 'JKt\vk})Yrc az'pV "`QJ@a Pլ. 黴eQSu@xV``S'k\*@p:uְ²x+{Dۥ=#LJ{ \LB:R#WZQ kI|"Ƹ|L)GLo;֐)- {~:U@tll {p[@P=B֠* pȸְFPw 2`,<[˥hL*s%쌈}u@ u,w̼zl,$0͒& ѥ'[G谴@@q RQ#="E fR " D l"`J" NUZ&kZRwjGIח= Vwzt zNUזti.dW{ 8)eâk8U.=<{j'[ Ϭ[%\]K\ٱhP_7G yu#T:Tc.=XO834)@\6d1a RfRaSQ8S hNb@J'BA`gהTVibͅ\µW_^&aiVPDKYdAPFc4ڟlԦ9dPN@e8}tdbA &-T<8pJd,!@,<>`Ë}~@zfH@p3ߋ>`8mR@ܰЎ >- $|2ГOPO,dJe HF+.8z Ў >?~`M I,P AT̰.,1WSӪLӪ>z+ήu@-w}闘 LEhJ&QTآzfF_C@ *S+b*5f /A *|BK0+ A@ 8!)/3oJROE5:lĂ.96=CŮr2]ѱMF?yO -.[<6%z506y̥B}OO#=`Q F<ᘐzm H^ 6@if:`X5(;6AvdGFH|>VzOM g.S/dZd!9N.>Åj,yev gG .z@M>YsA-dHG9[a (4)xBj'7QxE*IN,xK%e1-4Ku%1("HRi @F19 k0XZڒ|Da w?r,x$3 &dpg4fP٥4InzA[e+qh?mНs<K?S- 8II,$3ҳ4eLBPqxe9W;ءt:7 <)R?Ґf]j8h4b9bZ91řeyJ̞(P{JTd1tL*CJ u'j) +;YB^hTcjL4 pEtסvuK@-+`vh,&Vr,HGO2K+_ֲ-lg0 Aw-`U-$0\&0. uh%Y᷿5\z Xt[ݽr.fIBKu|kJf Fl L'L>ab[(!Nq#D}swS]vm^[ح$"tqk;r81ZXKVm8+sBvûסe.ɤ" Ԛ֓F.NP],@̒)wlXp9vvs,g6(sggsA7f.L,-u!id 18ߓvkMEIڧnZ#m{]ׄ>4g[n5lbٸ>6! 9HtN+OՈ:p(h\8XxHkCf:H88ȎtKGIHW̦Ut9XSoʅ)p_YIx~XTnaob'~ܘؑ M8$yl֋W{a6'|ht g#f`,C k y_ B .f؈W.&'yX`f`XǏgɖi b(hWFYfyo,|vh*xٖ;ژ'lF[I#gZV~|)f,ʟl!ǑB(6bXqb:tVئ[[Ev? |)!dW]dY9j:zf7p) 2KYHS4k ejw۬TdhXۡ}Eh )i )gGF*hjCIDʱs I;긔k0+)+EzM iGEZ˜{DaT&ovel{ i@ +Hۺ(z]h귧;~ku Y Z۲ʹ.pkvuɜioFXkrj{Z{՛8Ik: `;ܹp|'~ T h[[P~Fke)b;KL L8u< l(y(lHSF/KZF Fox9yp4zv^XJ^ǖkQ,J\Ȏ̿;V *h\R̼̞F  +XGr}Qೝ- ~ 27خKBn6m#}_7$dJVD=nQ5M-˴ G[ǜL;ϜZM\MU>݇M}R> `c >YBC@ m-^N5,ω?Z4N1> ~ 頮ٞ~|n4>NCݑ[ܩN|iike>1V4ݿeк>yɼ־P>>n="ǎ, Q,*[䋡.^:m@ 5MYf^k>>q`d]ZroFnZ m㳭|\VPڦ{\U]oǚ]'L=$?P}m/­qleN2D3!'M7,Y.KUo۝bۇ "׵U+Is4ft$JuV<($* &Gb^ZE[o'{s]W7`|jC*ERFRdIʃg8`7^VT]e'AoztnEeǣ>&q-X)Oc jr؈!fQy dzD"b6r:~\:a2)sE?`g^`xzvfB,`rriMXBpӅciR$b(S^WT!d Bi$zNB^3P,0G,5Cq~$,NlnG"$g$ ´\b?r>+SGsϋī>xɷKHsݵL{l!yB q|@aza1|N[ΪH)7<^Im9 iY"৚XrD+N8z%_E[&=~Y}驮4GX`tZ ,\_m|ƛͅ|s#ߩk; -޾C`\.O+yf @#.!xÛɨEX,*` ,A#uDW>#yɦC^D#OaL$뇴G%Jr@DˤEe,@ARIp˪q' #E2 K0X!+^# 4,B3+9$6 Au2ԡL4щOd()I5Ehk$?J[CQ:C$'cIYI8ȎN\"&4Є(T!Af=1DRÛVA6+"I@~Y玈?lz 69; ÀsdVwUu'(AH$;7Ea{4Ux=A<Ytܰ h@-)|SZ'G㜏FWDn@ 4>5F}Tt #* ?.u&De}!d8En΢ЈjN*gHue)i?EVZ$c! #ZIW9st*Rkd rc$ z؃$Xh [Lf -YHBekJ!|SWVU6qq-#NzW斃? )E1E[[{8&dTVP Mnl$ɖF^5-HSkz~-nwFh6Vx#syˁbvscP@.ln ExB=bt3^ t2x(j߫Itk]rNUb`>4Y@ M-\:˕^pd{QE=2d,O)2I!IK1!v4ACȈd*Fm!,ቂ͍iשZ#; vΘ+1,>k}IB{/.^*rEHWM+CjW؀YXXpC=WfF- 9-E7Yfxy,gYELh&8.:%g|ـ"Yʲk2ԽR:LN%pϧ.Ԋx4uW\LY`͵ΰ߬aC9h-lgKvQ1[lVs}~8/ ktNܨVGrtC4O;fUsʠ(E$a0){H7nu [xA%༂Y@ 5{ՊsZ3XWkƳ1k@KegNj;0)s1J(6~ز)p@}RA/tǦe& Ntq«dѱW^j-ŞLS?@3kS/^:Fypu&M3^Doxj+`Cc7 +d g,QSf 7iO\d_=z0i{q h'$Q-`Xg)ڇ`C//s7;wx<'0@XW`/}"XyTQٕ~1g6bVGbc]Vk>d{3j9 6V"!Atw+ (ѷMC|dfG7Eҁ!84@WO.Dw+8BӂD~,BK~+"l7Izg !hEjOth" h)Ц7n6%|6dx0T)z]RxzY:N!)'Mx] sȉ- 0{63ցi?6`9gs*d1yHT{cZƈtQ)PvY9oȕp_!'%YY6w9I,q95IwX(Ur&sN1LXy{Ӕ y{"Q*8FyeY'7 Daw(T mzJ~7:Xz,6ڠ['cd蕬Yg'ʮ6i #JYDhq$ZY$tcJ/z-4yz[ zoGb**#7+jQpа:5Ghb#QwD !I2 Y([&I KIwjSx'ʫ5SՊ3;ۍ=DP;Z4Kz3;[lRK@T`rN"!c ` 10!S !0z*p:4~[9;Z%6jeʬJ д󀼈VttpCTr$w-qcxZ!iK2QmK鐷;.8ǻx Ȟ;JE˸ :GgkU+hkWDNNFr\$%i% KcX7aKۧ*iN+D˼ ۨf:=`lG;3W9,!cpc3@&{'̮fڟr[9a^~D@hQa;ٕCp}^ L:^ښ{QjZ8` s ɕt!f$S<#' 2ʭ 'Y^ g—\+;qoU9[[ ';| R1I(MZa{m;:Lc /b9 x_'L x|_0|_xjg#c|I{|(5l͉L̀f͏I@-ZY 웨Krz'b!Qڪu8ƙ+QDzl6fu7-hT:ɞl}ś PG^ ;OV z; #M%M?IҡmR .tR̮Ts+WTur- k'-ѿiǜЌԁNg7Tu\ meeuJ܋%+(ݬITo 7O59ogܨ}VO|N=UH_i'*"tfJfqzRx`uJC>DžwxYx)6JuCD " maDQqᘛeM"*Ba^+FGbpPdT5J (qoPs[NyN b{lAN)&/I,./^T(nWn'G[ő&"~[`= ñ9ix}n?C?^Ӈ̮ҾyiD:\Fll&>R; q+Z8k*ov,?}k|l~UߴӮ&ծ?2VY.k x!io!))^`^/h5v˾GmR@N^Pat'W^ (dT@iIh()i]klK|{<|@٩(**fb.$cs]V8Վ[AM8WYuݕ{8%} kAlЃ=Ep5fƎO#C^uLND n :m(v)aLmTOB-hMJ6b.qzUE*0]vc*&$Ed'1I zA5 o*BSi^$~,3ZL ڮ3/(D}Y;˥d/0nv3TRNQ,! 2ȰJ@uEћ4m'&k!4RG[aMWtQ;/uZo-K^6+Lv]>;'i-],.o݉w)w7 (Noo>37;3;[3?[>NC{mv;׈U鲝KժsͺR%i=7ȀNUV=}4%b zKͳ)fHCSfBjPsoڧ&mdFwIM3!EJF@ `ρ % xgLr Ca r9D iHBw  F0z.!|'a"؞H96K"2Dq:HL"1D,OFGIB\9/9f~%vCX"$H^6"C-fɁX0Kw̝xki 4ȶͰ@$ͶC)PBUjF4]&w&bugHz+1'$,MY<-+p^P>rP=o~&8tV.aGWʉF*dԉDv* `agQWܧ*YI5Qt$F9RhiJ^Z` FV ikiaӆQITX|]5'y5c)~OTsTRXNb31зn"G"Z )7ڭZ49F'&T˪ ŧ8SK__7nd `yJ}rTW`"%0l&h "m14d.Y0*d#44ZC֤|Al%^n rK]y/U'!S@`T󟋝.,ф '@:.w𺗼] ^1)g!2kIӺE 'nuX8M'M1E2 O\Y]D i#85(e,rj)K`嬞Cs|eS&8!7]Mg ?ѩ@XZg:)G}q :,YӼ!aÁ0md-Bs\}p=N6˄C,;ǨkH֕~hFGeylW=I|u0׭?ezX;HRO;gVaO?,S5Ght}d||6y}X/a1jGO@e}+Wz GopwoVt,0Rց u֠U@&48 lpBnG AuVn*ISC}Jd}!aXhj 2rq (BrG+rwAH68V"YM55E:8ƃM?h|[V1q/.# SQքN88 F'gHF ]F !LnWkfTBt_`]gHHJF򇽧gyw `wR=ȇ}>R8DOSyҧ!yW0n1H6!iHzLf h#]Hf8,uPO mbp8a%1/\E@:l􋉶4R7u685ЌHcg++}Xȅ8hMRD xi4/Ipm~A/ EP ENX iH*Hh `}Wȑ[NADtA+نxUGao=AQ!@ x;ɓ HF/Ei 锥Di$vh$ёZ Dsb9Hi&f ,ؗUnI47ob#ouyGGy|nؕ~(3x?)j` I񐈉梄HM锓Ibe693יR_ &$, y !A ?7Q259z;؛)LWTsyθrh8BUYE" $iwh )Eyه KP6q89*!jFZy+͘nWhG\6 !G8A\GH2VPYڣPAPT HŴ1.ţ)/n@X3:Y r+n|}ĤJTiHeLD) !Tdcf)j mCcX!7 A- O#/pHNppJy} iԢGɨ8j&Uz[*x] ʧ>L^P0ƂՇ4~DD* +iъ}XTSzX֚@a2HVZ95wJc* ey K03*Q Pŀk~( j2xڰƊS*TRZڪJܚC⪢ :q%{jMiخ"C 0@xU4$D>0G v#hK2Nj-)Z\+2*뱉&p k_j(+msY?1b}gSI-zz"/v zM3Cy넒u{ԓJ{h_jg6?ɶkʦkɢkUѶۻ"1I Żʻ``G ּ `cc`8G{~Kb⻦wfg? K+q[ETMЬ+`L= l&yP tgs&=/9o le1ANâ"'tZK]}??`E6罗Aym+=n 'B9HyKn 2P~,wM2aq7<)k.W&n1UPVqwV㋋أDNkέ,aPR>ݣL/oppfe.e_uV&Xq U!nlк㻈#mIɞ\ A솛Y&#fz>C@8=AZp{ioPFz B#">>M-_~Ky0D¶r*9fr"*[y2i?!0 JW \cr74o,u{pT: %MEo7IV lL=)0KB]OI`u'gs){+*apMo|>4(ATSL»<~P䳭DGoL~? P@PfZQhaOϟuhjIoG y 'P%gX۶ͺ>,7*n/E3X= ƧpX h:لr5kS.Ç#JH9t`=IR\ɲʓ׮a!8s|6 ϙI ,ɠ@Ens_"бFRI(sb %keSp%w$ȣWo_(), ^r=WXU,; y$$JAÔMtnقiL*5ߏLXn#ڳm07oK.Nb6o߿M *^>=O,e&Hs,&%j>ۂFQHݐ]RVdu$*(Ƥ ruO`]'u݅vzНwӀZg[ 3b70"Q*X3D'%&TZ% )&4d.SBm'рz$ڕXfM0XIԐ֜?Ͻ㞈Ucvd#_Q/ J|`Bi(>ETt0ǬTq,$C )} KeVmhKmtH4!J\p  PXJ,بNS c!cK"d8CriX` +dJŗE gV)U5x%TD~LS?rl/kZPS51F5HBTA"s(¨!`:g.v#T3lG"MKwh@CRk 7GU$1`ᲑQzv*בs#+@ 4쀾&v?>վɩfAT0 %ˊǏt]Nc(؍!l,[jgzQ  %w &DKc4RCvPjTTHJFe,@avgt'8hV(r3\sIWju%^d[] dUl( WRA.< R6S6o 2Ξ3@uPc` fK[((cI!nw\aT pB!`AW%8%dt@"e5а]4 xKR=osE4 39ff`%iJd 3ZZVh,)CYؔw#-vڗCj1dCCI@4!(NW/>)8vc?"H>d#PfSٽF#/ 8Y͖Go`IT-rA9dp`uTŒ  -EUy-Wbb09&M'HҘδ7i>xӠCMjQK~RVzլ^KMZcA +K7 /cJ1\KCN:**P$aNxu6yqQD-p_nt4j  ~7 -.w'@w|POx.FNr2x-<GygNs}g7@'Xh_=vI6%_:"vmUw6ʠu{Qx1wHʦdsׁ8@a|Bdp˼4 ooF .ܽx7|F򐗼;y! x'yUջRNE;@{ fƯ 5 w} vZ >>7ɛ%{M{vS?p'$~1(=cA1q HMwJhW  ȁ8&x((q@2VEt _ekFPlc#_tl 6P-oEN7nWn}c >}inQ(0 `o)WkhWH1@lh~p؆rzX'uX#p~~G4XjXJ (p`:0E6eC!]vt;?Hf6n\w| AG:G|_`Sv}S}\}`p@qW 8g  'WlXq8Pׁl(x8 J@J@xX~ȁr(xyxyK^XE{:ȃg#!|)Pg3s(X-u0(EWYhvSDxv|(eXr~Y0؁9GJ؁78D(x[y x'؏f8Ё\ `YtXt3 -#1X .QXHfAa}|֋ބ}<5ƒ-)t\q~6`p2~Ws6p>vUx6p{q`x8p 8s>0rKiy7(47Ys\)g]FDj6 R$Ua} )4l> @*KDz-EY;&=?@b]QJ(pXڬ[ ]6vT ShBo(Р4 Jˠʠנ7;w&  G&jy ; )۰x ד(*ZXJ:`ګNJvPjHj_>ENu ^MEg CW*6\*aS1+ ,j!JS*qoqjtJH:ixxڰGǷ ;~yKG |Ǡ1 :&ȷ~Kɯꁆ궦z';K 2\!DK]HɺAFڴN TCϠ?iʬZuѵ &bkNdz׍[}${(z;ri&{븞z Hq;W˪@Iog"#4B GL ;ⱴߧ&=$I9.RYsz . t%yX.2gMڛΈ < ʧkH*騨,˹k٘ڲxl {[ڧ& 2ʯC,2k{]B{z3!I)`p؈G+~9đ难Rp$V>Ff$榒TQmuk BcPLBm&R9zn2|>g~nر׭ЀIa _ʯ ~>ySpD`Wv崛u/R[p b.h>X]Pf>Ly1r$d}M. _ R= 2?4_68ϾG ^lxQ p -F TVŔ5 Z옡hҝ~u1nRp$*9?rQ #7qz|O8> G<ﷀ`5U8gTh@׹eF\^=d_)iO.=p׏ ;ȟM~p(_A_~<V0dVC;/$aO76N5?J^ 00 {2"),Kl*GV,TC  P && ṽ8TӠaРEp[ȰÇ#JHEpi[@EG4>)`@ &+h\0-I͛`щX#DZ*sCK6o) i5aW\@ւٳhӪEK-I&Iݺ{߻͋k0ŎAeA3fY6n޶r(۹t4g> - .8:t(ms{„5>ےN,Ai>MKeQ]JRH-^ͪU1ĺh} mɾ_yAr\hb 2=65fhY99;Su(NZ>ܰ&8)tvIp  9przqgJA;ӥ(X̐e3tixL9dir8ԗV ,,ĜEY:'_Yi o%i])|&J.~(@7PL6~N@d&R⊫yԚ]0:#L.@!7B6Dѐ -xIJvQNHfkږ[j^^% md fr E8ay9hY$z(I x#%? 0 i2TdCA!j|6%-h,Ǎl5ޯ/\##+ܲ)z TZHwEA"7jՆ\wu3!7+ 0ݼ, 0rٖxx/sVn:2cC6 ݘaѫNɛ3==,2`@:Թ6,qD74=!JT:MTw4E6k[=u97j7p%{)wŽ=U#APD 1"0DsCe*w`Nd, ljZvT73z0!H3ɐwAix LP:v8!v]G"jH| p׽Y9kwBC)Rot@Muj>Q C[[9Ő:t Zck X<3 pcvD"43!t(`ai$?l+rC(Pg DY?0.D$N4_ 1U<.:SH'%>c grK9b`O8>+RV$3eMؑ2m50l"6 IP#wa Xr#2:(0 v)LH'Dip@YcB ϳwHH 0E|-l eҜi|,:d@%ESl>ORRC CC2_EҰȢ 3["Sji,t.jtJ9 ʔ)q綾-~ PNsgqSgN=q]Sp62B=PC'.uz@R pHb$|0A*( / /|p78A~ L`<NS@c~HA});`Raq\jY+ ˵j+^uuIEVYQ@X ŦDzWBQJ[&3<-ibo^!Xβ,+x.,x:TFG8OƝ~@@ "@.͉!8HV 4@cLi5U5+  RRjUիnW}ZְuYk\֢=QNCMf: `y\Pz]l,W:и%jb]<#ƳNI;)i1)w)Q!9x :(@l`&N[|8ȸ7q( ȕ0(erd(@.Y4-Ϲw@zE A"0 n1_*rtF6u~O󈧊n݄{;7}'7Һs tC 8 AY7~wy.[ϼ_y:oΓ>O&>ɷ>嗷gzғ>ApW byl[XvP46׊[a/tt۞iX,o`X"7y^3p0CD Ϗ@%WÕ <#GyWxs2s'GqG{8HW20M{^oVuu 70N?r"|ްb9Q4W`P:"Kr:hO@)sMb<$A}`/y220z {4P`s;He1axoHoqx;Іl؆wH{d4phzxcyiȇgȈJPx'|xD>bgcT)XH+x\a/}5H;HSƥRh⃈fAH8vHP4~wOp#r(80wk17#iI|xY,y#)~ɉqpȇw8H(qh~hy2@aPmjD!÷ȂT/~LK9bPmgCU\I Tbidcp@O 1@Ysw>wHv؆9% X+ieHy *Ɉv Ȇr(zɟ#(4Ym7(ً2$ԌB0ާ@$pn!(b%(!ݦ|8*F䣐ªCnE)Q@ڧl`-QP@`8J:$\:-OjWr1[ؖ1Кq-)٠ ojs G(xXm8xlا~X" *Z皈z,$ 쓓:T2j>!@ię:VyAڳ5#DR /äOZAԺ&ӝI3p7'K*zjzjZ8sjenGPfk[e8zZ}j*iii{{ wiydz($Aej/R&g&D!5F;= ͉ϩvщR١n? SgCҥ-}ey`hzPny突kmۇyoڶ4{{+J;x۶gzgg˱Kr+;'p{뱉ۨ%Lx^(2rvYmH1"#C;BWQHf0q C[˼ ϻH &1bK23ӵxǞ𛱟jxp z2f|xtzs;zh`x8yK's;i, {MէQ9@قIĈO pVBR +&Rfg1 s Gxmk{ Kk4pXr]wjؙr[lۨ迉ɓMaH |rݾ# %ܶ+\Va2suȍb%E%g(C۵|%OD'? Ȍ! ; 1ʍܗDB ,beء?2VP \)WWO?f }X_ڡho [e|l(ȗtmcJ߰نu`I>"p'!"\*}7@?C CP  Xf&ffX0ppTrL'A#FȐdDC%Jŋ3jXG10~cI(5HXrɖwȜY@f͙2SZLP .$@Q'n`$CCذ2HjԉQZKY_j/]x&1d˷5vܼ3`f`(&Kex~3!K (:0hÆ QG;Fl+/1"6̑ m ǁܭqx䂂čG^ԎA TAt%>R`E{v4t n^"aܕ1%@G[a h@=0هPse W3l0BA"Ё387@АDP7C.$NA#M"ieTfe Rݘ-SGD5Uzl:_{p''pj5}\VW1 xb&cX@΄"4h:5C"3 t ;WꫯpFb 2JkN*Jk]A"<Ř)UwwH"uyv[J֟"fn ܲ@q! ǥ?掦N5O2fK$D,WlgWG"LB{aRܐUQgB5TTYzn_|ykfgun0v{TS Yz/r 1FPj{]p1&lT1 ,]7v筷3߀..x R +8 y4ra+@s.褏N#訟~z锷.E" E8QsQF`,ъGy>/UDrϖ깴KԄn3a *hTKL~;hSys>kG?1P`3H: ?'H VP,@\ztn`n۱N,fhܠ %̡8ԡ!)A NX` N< w2E9EiٚE6͢>Szǁg(lh@FD0∤$')ZdgNj uC@JR%$BmJ҅,a+[9D e.sK] 0bjԁ*sHF\!YDS-0zS?J% oS+,fT@/.j\# t8/'O?IE@y!BѯR~LhҖ ]`&ڏ˼pD$GB?E>@Ғ(E9ÖfEAfҚԤ8lS JWMiZ@xʴxv.=C9GM2s^uSclJw派gk"UjYj R~VUǛΫe[W]ZπrFxk06``_M1KňA?Ե0׬+yK^Wr ,.;2*C`]d r<sLf~4 fm"aAثc00 /0 &׺ P πnZ-RΨ+3󘢁}tx#ER}~d2GY,gY,ΘVծUU6Ú ? h&ܹg6i/ShDpe1u'gPEz7׾-X1K+KKLDvkԧB;Zߙ̭<:_|n=O~uU3 Q^[ *X iHv,SdmvB͡iOF1FͯI5VK^ >BTt/,Wxbǚc2ҵA YQXϦۨ^oX[›u^؇o6x.{1 "|x6 Pc(m1!zFcP.OX#/ 34lK4⩲sPղ:,nl:gu:7KՋ.Mzwފ`D?JGu\<&dvW*=Ⱦ2e(OG Ӷpvl\Z]kfPdHgS @~Wb rWrW EIBFT 7b`X XI~`R?^ϴ'B5CUT3)~eH~' v`'shp7,7{ӑ >KWHREgt+iCt{29KwZtR.ՋL{Yjf97CI7THyJIKiL97I8 ^y Xhq@@X0aTdyfhjٖl`?S&~ІWl\48@@(@ ن7&a){P:& < Ji1uA"id?dR*R;=E9XDe>ӄhQISZ`a '4}0}gxPW@r䳎X.{qi}_Ȝ]v6B' =}Nlf iןjq viAǚJC+_ TR9RC?u YhV<_Q f}˹=6z7uhP0|ٝ5)Hʜ' 00BPv( RJHaob l:?pi&K YiTd@ex꠰^Z3ա;xZ|*jg!unx72rlXqv~aypHxh2Ѐr gg 0yr Apʈ (Ё C Ϩ y[<&0 КXunr꒠V:S}4nr&W$xŮ{y7i@b.ɦw}wp1zk}G w O:0ry&yT0 bq`OT@Y1 ЬHRԚz/x80ɭ<ߚiPɋRpMj|&@F ʪy&c`Auy>YIlٶn@?%5?`)pvCkSf/ AK,,й~cE8)00Y5&du, RRe7R>Cl0dC-BV`CpD A &榳D6t{7JePD`CZt&jTch@IXX ] "9Ȼ7ҸA|qĶp;$lq`0q0zзEU`iK:k] S1~m p PR\qq; >2((]>?3R(9۬O@K@*P`[ڟ`@]:ÑF$#!\plT37 3ٍ}ߜߛѱ ˖L'VRɊ`/#>^14*]`W`7`OQJ#,a02>q!Abڀ{/`#2`b+C]$JPP!q4`OO<]8ObN^Ninj>nNam@_ Md; 2% 䩲L.8D2 L/QnGal0/#q1ج4>y~= -ԒITR% =<q^Mq20QhKD20=$aq>>1/p< q4!^=+41P@mO8'5p6IZ`1ꊝYy 0{ܽ7``ӻJ  @p+"I.r?:$8,s喞>8 q({;A@xQ+òX)>ې7JHyx=y.#pA]ʟ;R^Z#:$aoq%Q"}E`/q;;# 1 8qR%7AA7@*}l,CTO" q81121;"pXtO7"( 16#1J22 (H?&CC H ht 4u9b8'P%˗.!TBwxu(phJ͡5wpWi%qZ*0GUFT V7U'% nR X̘fbhP@v+.|GLVI+^$q!ZGFJ I D8ݰJR N"Ն~0`jdRj7vwoJv9޿sDßaϘQzu߾=v$)!?4 N#2qڗ?N|jo(}~ןyc%@ a! DžeQRX; <rpDȍ~#CO[S;_7 bT C,@[ @ P;4"Ñ@q7&>xޙC.$s b7(0.7H4a򖞠Ii 'XQYAjn ѽ&! eHvJhfyQy\d'^%  4ALgݯ9C2$ C ^oµsoL:&\}L-"ckڵjfniPoLHahЅv@EE(n><4mI"=ՆВ+ߪ^;YH]@0DTZ l\>Fߵ7fzxyR(q@ `ŰG5O~x}~p9&'XEV|b)Z4EYdL8kW  P@3+-"\熴yAƚg^,f#qW8Pﻵ8M ;b~X$1 BP^= !h L8C֛= Uk05U5LFD N5< %C b;ް y48&qG]nvT)UڀlLm h-h8uKW 7d Bl4^szA?³o[Q\DG+8Ž;;\*Ĥ !L'5V>TzSG8 H罂k|&0G`dD/ CHܹ P %Šc,q|עFR)ydh$$ %dJ B-B4N4]xE,ۀ0hzG!Jvt@j xChh7]dz^rh )8PUR\\ \a%XQV>3O ;8K\'  p?МHi,[! GgP Gµv{''j]PWൃ#Inʕn1ɐ 7 W~ȗ).]qh{qVIqX2ukxu,>z VP4p*`Y YJǴM-g졵qDPd X%:p@pbN Q(`"ؿp*|G/2?U 0pQCExAS_R{ł'*Qt4pbWE)k8JU d w}ШMbW{g -%O(HCL"buhƕ]N28В fa5D&K\ڙR|K+\<$"SXDWkX2G[\'J11ɒ( XH 쉃@Av &sKщ䉦'h @f1`eء ob+HErҚLyu`J)i(؃np_QAb:-6T–rw'G@8wv\yϋЊ H`6slU:O@>Ϊѽ-*3\]{˔7C8* :,E.t^zH* efjQ`4.9/>v@[ۃm\]]GcƔcp `t_,< =&@aGv M|JffCP[WYz翏E*D]d6oʺ{ꕴ<\B@{+ƸжɶoQˑ*@<*ŧ18O1yi- >xΊ8)ǾM3%V}e:~hr6 ;L; <Muvy]*@#%$JD6~8rUK::$A'$4qtP"/b6G]c[0&Wu&{PP֎޵y[P^:uoqs5Զ(_z$5eru.VK_ow.n06a`|]|/ sJA-877@P.KfgrhTV)sLA y$)\@ V!evpqET{e78cebH 63TgqBl*?:bv3fH(+8$N R8Pt ݈ 95* P%(u&ty7Ck dEȌqSXC HVV-sF`sj crJNkFWa!1&%'l!ZЧ0DUvNQQ7Pw8{,5WOzM- =)z s#a_bq*Ԓpqb-81v$iP/:U2: Yc;C61566 62%;isNrS.c*x7 <{hqH֘gؘtɦE0Uf ɔ$u uryl1"n( "E68b u Jj:!#)f>%-BΒh_g2Ll36ul$R#l`EWiQUa6,x$KKc %Ep7 0o]D pQ]9rHr4"D$&=5~0@OY,(r1t?ߤFbp4[.>b(@RX#kc?)^!>YY3$وt!2` `A±UD!X*-*@mD[K͓8 rJc."W R E)0ik+:S"0]Ip-'Q+ס ht8#SРQ"@i,rd \H44-d?ԒG0WEPVa(غ}S6*8dbQ{i1BpOFyz*TP7@>LX *iBHS-?-/22hFBɑu4r-%S4,p7òezF0QrK+:r=i4+-YBpbRR.KTr! 4q0Tp3iN8{!1<,J"ӕ{&#ɲ6sZ3 qNj(% DRwLs'<'ǂ.Y0'-j8Fݱ!R  >yR 9N" ɰ^ cꪮRpvJ~kJ>pC`h@  J^Ğ꫞ 22[/1n_H ^YqR@,YmT 4Z>H€C%\`"P77CKlPn%àP @SP P>P)VSQ+(>~N@kH"$o( P: ,,NbN) ) 7# ng .bb>8,Ƞ>)VPq)2n p_ULy{8ƨ7 50,?_*q/_U0p_ȟʿfj%#0l]iK"Kt^+?/@;@O?Cth`ygBSK,@)"7'')V"R*G$$*5R975QA5A\*nl,TP3,3@,,33?؃(Rd8GEhpa#Bl@ 8`\4.+Gɓ%g\ɒJ"PI͛8ss&)9 -@B"XE(сkVuJ*Ye^Ʃ-, B%Dܹ߿"aSL* &Lr¯`.<" en!m4=yc0dȏ`plXݚ㷇 Ćˣ;>9&3F!<->WhF Ifm :Wn6쾿Pa0(BPThBaV?'$x{4AyeF{8J0{Kq.@FiđHEÓP>,,%'q " a$prTbxiŞ|ZQl`0ASf!h2@R.$(IK=|;|pSR,]ю?h(FqO/La6`l@2Lm-nPb&Ef͉sH|:st#ޙGE?/Eozg>}BPt2_D4FVǹ׾ <*Mb[jK`Kǹ d!Pm0Wֺ%y0!#(v {pȌfqRSXHUzc $& JO8c렢( ԭC7PHTi@_Zź!lKw[tLY 6πY.?iRN 7Vy|TmK{V mbŝX%jV :d:pr$-x5Y;L6ck[]ńwp /.{˱o Kܮ4Q!~N-[ ,0Jh=bgX9[Ta-lЈĂ8Bg#]b3q2֬O{rcz`ꩣ[պij]&uPnxkD fw-liY"y{6Dy~79sflgAv:ЅMy3Ғ]Ӛ>$&Alq"WU;|yu@3K*_A4k@u%O5Uڻ DVѥ$ he pi}*7цCGutrGkėFC6GތgQ&Vt/svX7FnMރ*t_'#lJ "6L?¸<'/SG|cI_̛|:?a-Ӓ@A$~)7`_&z;gD0lc.>3ڟvHW ]i'( ו{N\PwYWjTC{ sCa877't5ZJk4A&/VTtI@Ve>d`];33q2&jW&XI1g+3u }] dAw;ck 3"}3~B8DXFx+4 8z N& RC65U68y { ؄T!Gb|'fNUw>v d&C'E V2y&H‚h'fQ`]5h3%(V Jrg؉8X;("Yg[8BQaQ +aB WXX-A"Aʸ0ͨG|8c?{?7cVؘngd/Ȉ6X%m(A0v q؎8"HF)ٴ+xg1BM^PP_xrB𑑭Ȍّh.uU3ژ2v'Ս޸V8XWx8:lz=E.@SX9Φ,rAuXIT7<ӕۣR0"0^H,>/YqQ<8 >|ٗ~J?y;8>f@TH9 F[{AhX)|[镜_*E#]ITdq&yPiPs*i\((x~qV9YyyB]؄O倭e5=q#99CR_؜ioc橁H3ƈvIwi5%1bbd3P%0%PYX樗  ڠz\؅aNEW#' D98 $Zbh(Z癞x w-1cPv 4h(znHJLڤNPR:TZVzXZڤ}%#^#0b(-~VRMjlMKZ [}StjMh>_:ob~#c0S1bZjEPex&egV]\@av8}R pݥk*gpSSpQ.zȚʺڬ:Z֪xȨSyN&㉢:yÓ骮O%%%1V\\zp;+8p ; + z7[ ^[;K; [ZU ఼\  p8:<۳>@B;D[F{HJLд<R;T[XZJ`^`P;d;RO˵J 2mR p[v;lz|۷U۷o{T˶x;(Pzy**и;[{۹;[{ۺ[{ }np}@^ۻ;[{țʻۼ;[dKً^0[㛾n@컾۾K;勿 뛾\K;;PKmPK.AOEBPS/img/summary.gifGIF89as #fٵ2:]ciڂIkjymˊϻ{˿kԿtj׋0Bsw|ԁyv̑+1O"0CGK!, j6[HH993''66))ŌjM&[,xxDD{{vvEEv)\as#JHŋ3jȱǏ  M?q2ߵB&;E 1k@hQf4ӧMJ5QB}zׯSU,%T,ԣIX˶-Rb&}֭5wM[_ڗᬇ#^1ǎ#C,2˖3cެ3ϞC-ڰPELuתB"F@KcN: Npt'ˣ;:sՕCν;|N_t˟OϿ=LG@ 8*AHv衄~($hx!+,(4h8<"oޑ[B^CBRФaJl3fbcx"i#"l x| !p bd(AFGR!`"Ra) V@(!} k4(aV襗(Ĺgm-x凮([j6L('Xu! 'Ȑ 9FPpU"30|9\$X⬳֚k0!Bb&cPW&b/@gB , j .2Q0q LL$`q4j ,sDx p1T ^. m4n-1ٴADNvpM1fs1ɄnH*0B@x.0D Ld̙3QJM0j,szP]+!Ot%\mAI: D|Mv؀}Ix <7gRO61h'ng< BЏym[qS>-Nj(鈱ǹ7s`B B (P h p"P6`9"! ;qzHȂ<09<7xT|TnȂ.t HAϞ |BaxI B`&z!. &FV0 A &zhozZԡ4NzQr.e ԥT2  ` 9R `ӝNxк![Z8kP Đ@aGyۚpBK@#\"d&GPJ¦& =Q N"! $#z&ItUEi8CD'JKHO2 Qcɶ!<}s 3&Y*aIP8MAЀ ŵԅP@'@ԐxA0r!\"Z߬D. /h@ZeB>q=DMtk"pLX>A#)-H]geT)ЍɃJ o l$r2%28!v;k !&oV҉0i@)AS VZwJ&J lrJZc#ІFʫR څ̀V ,D\\uC#  P|V!Tr 6[%a`֠VZAdM^ ÂF N dJ)@<({S{ td@0ɀ!)xpJ]+)iJA`R %-uq=<"jk»L-tA.Jڃ %j)jrT(wjR 9i`9>|&\j3i%pP5P6|lF%4( ELPBFjeOmYI~:\'Isp˘U0QxCr GNwD fU 0˄03LA 3FH0luȃ6:D#^A|_5aҊ& |AZlЖlF,n7",AtP%W@͘k|B+UތHB"ѓrr,kߙx%ogH`\Bq9=<{N{hqQp0TlƄ)o,A4:[Z R ri8 (/YG*#Ww@9D2R@@ b@+t(0e2 X?@H4zv GyHojg8 H0 ?*>ƒ~s/0gq6Lc `u4}0H_7b~'`Sz&:+a~(C!qP].0]Ղw}=4qp.$d60pJ8M(F&3+'(2W*\1GA$18MFr$cx_)Vq@B9D69]PNPRyT)Q V\T0_ٕb N `[gnp 0tYvqwtnɗ|闂0oYT {~MiQ=ֹٝVᩙYvi虞幞uiyO jNiPiuy) zP 6p)0 dա":$d i41/\)S8i˙:<)iE۩? WFړK>ܹ[yXZ:VbN a}ٞ U  DЙwyIzs|ڧ~uIZ¶ BpR)Rz)ʡ *,ZR"`0\.\8z:ZDF;I@ʓVA@MD*l|V$JȺl EٖY c::`JJ]׺z蚮Kj\9Zz P:_㪭KWjIj_$MVК(wi)U(R5:6ڲ.0 -f`   ZU`@`9FʥLke݊ꉥW{wU\JiL[cɕZWK:i[v{s ڪdP˱ ٚ;/ɒԉ@<3[Ny"G+58DD{Ck;~Z~Q٬RKW Pzv_YŻa[9t;9~i{V$tI[TI PD0[$fYHۣ@)[]Iҋ{9̻vۭj;K :Zn<"odP"Yp+\-B\[`ٰd>W$D:ad+DʷXCP p{9yxtK*aY FWis9վ4*+Y[i™|0ř̔ʐfIb)\lU<ƹ[APApN>dT¸!<ÝzP>RbCd G mL5|*|o< \0¬Wad@C`tN|eq3[ǙXpCٷdkt(v!L lj^ )L!}$= Qٹӣ\I\ ̭ lEIZ\Ui=0XO\-̷)t.'6O3dum@<oͻ-L$O(>O tmWP~_]dKE$CU QI] NaM$ѩ˛3/Y"wC<٪nK ʚx;YK>zppgp~4 {cӎ־7`QAN] n03g`4p@4 I~]40>4g`~JG"[ @'LGq]L1S!`!'r 0]-n7EI2n-ZXþ.ԿǮc;Z9#d_f_#0gpFA`f}s:0nO70v#KpI<ho[ ؉qp:Ay![ ܒuTy`upr@"O/z<~*ǟ h, B# HFp$5$'32\`\ 1Lac$TfL  p*,S&%i 8䀔!P[tcp f:m+<֔!\[xe"4f4 X@\ 1O@ q^7hEX44$MP*-lS ܠu4aBψtJvֆ,T0v s+fM`4:YDa {\mQt`Ӡ 3x0!7k^^/므=Ks3:,bK ]D?\$-h&`! x(wNQsB 4 g[r35oGwS@dq !HG+8 x_Y'm-&r01Pd`@/$rVCkY MӀ_14N#y82X W=A-OX[bEV~0EX(їwǕ"?OpԜ 򲦨ֈ IVve1!rȦ \Y~ީS}u[:&aXTeRRg9}栃@LiCJKYHiJ>LIjH6W ^IS>0X*6 NiQ8di8{`e"Or gNC88`CGۃ#ϰdɊ쵑pf"G$&qTfg\V)@:cCP<yp0?!qjmzp@66!E`!*K0+;i8X@% ]e\\ \@~wY,@F67G,N^spE]MπTcu 71nQ-}ٚ 23J8@ir @ qm`` i`x pi,t*FXi"W w,ęTT 3DT@ d hNʗaQVXPz'(3Z"xV/#CN 9Ÿ0mYuqnu uc'v}8ښc:L0Ciਈs8$8LADm@4ԩh2\ztHG%2z,W:Ttcszٞ@`c:s updd$hq)fz f{ʧ?/S~H(gWv/)_: Wl g @cqz{k?!dp>j/ ,TywyvN t +rե5' bK= 2trJ#bpt fDקCvsR*V+j~w[0tL4 s@H\]w Cpy@F$:\*{{1*`@9 T <QX p{K2Jd>*0 tqz*FdjZ ȒQn7NKa/:ğ!^9uHk2[+iQTVg 3+2 mg pdpTu!`{mC@[$P{Dm`|u]pq#Q і-va8< pr/ 4 6[(;;K,*!6z2s{ uK_Kh%hw/,+8wP ˵Sa[V;{*z D2F yWdAA7 a Td5, 0Qpj4!5d<g F QMLDtIBϐ8FcCq,[ esZUZ]#+\rbbH_zI,n"F,| wМuĩ,r"L(@T@K@et16@Y3QpKt0ORc]@<)l r@5,$+tpd' iK@@ټMVаy*+JY gfXXg8 GlPo<>@ԧy 5DݜLgP&3]-thql%FQV+lR3jD ] TΡA*fѣQW#+Jg(mWsjw$_Kܗ<F0B}ڨڪ y`ڄ`r{b[0]&l؎>]$8lԫ d;r[(8רmc/5  kk\jU}$)]Ö.дß}H߽̫} *t xDHp{G< MI=v-YM4 VD&ͳݲ _#t[h/D(͖t3P-!0'2sұkNJ K$2K>*W yu?|f>g7xgԻpr>*È,8M>  z$)mG>80{lH*#ӵ&Ycusu=# p;2!@xd }` JߘWAW53˝-twr`x:Hf{7m)G؞Ԡf4J=H0{Ay *px0pl@ +6Qt2s-B ۢ~ &y0)n롇Ьم_\.MȞq#};kFv2fe4_6@yc0y~*Hz` P/3Y808 y ?f_>T$>JPL 2=<\#+8/PwwÉL(p{[[qzW%xgG8/ 3{t9lڰc."@L G:[#j\DPIHr-B#&OF]`P!OvF@nq_I]PsDWwPtjP>ۻ"/ "   ɯKXϷ +++dd Xʹ+CK+K$)v9R" dd0]Ű!CZQqH"3:DZǏ CiKqФ Y5\ 7p(SJcyK].r&{ԕx<>}UX>rȵ`S K,ɳhӪ]˶^tKS0ֿzônA˘ǐ_6L1WL_2.ɍ"xoFSJ+װu3+ͻo޻~.ōssaʓwfܠ>ןJUUSc/O˟O=;kucK~RdC7t]i|}_Vq8j(bby(2Yr)4h8[5͖D9޸$=x=yE!j ("d:2∞J)3/0Ee2|B^O2)8VnN&Zd5£Og( Mnf283e=@U""0 "P}XʚlΒFF}@NdVk>e+>IE:n !P @pZ#C\aP0.+XBѺ.H[U\#lɚ3>^ܭTCק}9X:n3D!w0; Bt<DJ BpIK` S-yQ0V#ǀW S@pf#"*E-qߌBɹa 8І2q`yc.Pl/H%R]ե0%^#ն`򲤌\2 D*/3"wE: @ȃ%%p "Dr00)` ' MEyΓ g&ƅQ؂(HVp\8h1n ?IT`׿Ihf^ѦmY`#Y Ȁq;30Z ~e `D\&äq-v߇wP-wCY{nҗh:0.b .\S>@d cw{@Ͱ^QWX4kv۞,B;*JFG$pB7lbo.񐏼'O[ϼ7{GOzk~I[Xµ(7`5m:dǽ>|h,lŋ,` LUz$|Y~[,IB.ZOO/ SWjW7D| bqDcKph]qgg|&gG Q@+{hWA'W~؁ ~%74gI6U0[_uhTrUr 0{wvHChcդr|bwI>]@K"؄NPRMpmz%'HCNpI7xO5`+3F6[5m{&ui+%d_ri!$e^P7xUHW~zSNf+c4~1Av+^ԅTU8Q&s3O@PfDP 0IuN<.T[U=" 0N E-w1:LpSH]x،t'4+QUTO\U83d_ATeM]M[U)Vkn0HCTZ0-б<2+@DRH* y xnKXr [!eO0 2YXi| H "̢JP9pQTD6 3> 0H\f9%E0mg-%<`th`\漪z΄ AK\4 RCT F `SI`dՇ[5x Ԏ|rN֊THuӚ6kE2eif Mil*8 %JmW qܽ<qkm`Ii8XD/W4;l˲( ϑ\NR=T]Յ `^ EuEr`5_FitI6`Uݶ\} AiΊAX^LiM YrE`I20=` WۻWh@=-Xpm0r= dQJ +Vڲ=۴] դ -\y" ^DmT0TF_fEDTB8hVW$F 6m<E5= :pEX@/0 s:ؙYGwBǧԦ[HmrKiy: y EkɵX IAv+0Ec#<8,;JpEkwX0m|"WXkWDi@pE%p=4H|P[?mdrIc_ƥl}X5mK@חWœ|^ DX2c ` T֟;rEKQb̝GϐWeÎ<>@B?D_FH~O1sʬ0,_!RMYu:ѣH*]ʴӧI},1cȔ5(4邀-]@eg]Y򈐂! 2IƇH"V9@H~x!dTYV4`*( Qw5YPL&%EM>سk߾]~K;RKM  h_$A 6`j=Afr萆1''iˆ(BEߊ,0(4h8Xä (d H"8JdF)TV"(f&*`)dif-~)dJ#s>v6X|I+ZBeݙj衈&=cnGyyf:avЕq h].jꩨ8(7pY뇞kC(j*[ kȮh~@kFkjme(Hh%+k Ҷ{ P^˩&~,R)˲>63^$+jh-tg 𖼩>,'M '`!28第 Fkи,-[^6YPG-uGC۰FiנSm0]]"`5h٩nݮ] % arwMSV/H! *33B:ސ:cL֘㩰E?$+6nc7hש3&\2}:+·rӨ|zk~3^黏[6&omK28(4S%|r$0TZWռ@%\k Gx!M`P`>}@: { xY6G%* &:PH*ZXЃ؀@ mAHWN=C;T @!x#^h> IB Q@"HE X$HHZ̤&7Nz (GIRL*WV*01 i53q { 4& YLd:Ќ4IMg2&4k^S&IrL:ve6/".mfBƙnfC1~i-a gC&@ъZͨF7юz HGJҒ(MJWҖ0LgS&*(#jVF=Mzi\DL{RԦ:PTJժZXͪVծz` XJֲhMkXE\ xLS e29L JKMa:d' Y=Xd3{Yz hGKҚMjWֺlg[XπA2|dox٢B:Dy/Jr-)99*;'eEZbbJdX-_v {3{)ۧ|)-;LɺP`&JJ5>'u:׌_u w'A_xew@Hejل+t?XI׏6p8Fovxl j6xAppуxXǍf9숄ipt aVF`8Ig]ۄ{tLz6G'\V+k|ʗ2,5LTjjielsļpܽ`6gՇx+p׽hTp۽ ݜzٜw^XxD׃woxw3gelڌƩ܌l|K7ćȇ]o9 sBܾD2)w6كJ2tt}y8Iϫ)ʥ ˱1P4l8qÌ[ovړJ[l=f,NmtKjXv k ۏ]adx1{(=X^ C mi܏oEЖTVKE0c{Hvlwl܄f,} qIK(xwȼ}Ӌ)‰Kh3V˧kGN*,9, UT\^ޓ<Ίݶվ*],n>jLψ. ؝w(γϋ ͸LƸњ2gפ+W.Ө^NZ%{[냥">ܚ|ǩPRlsj| -텼Վm{k Msǜ.`,>e, ksi;{-l3'}LAGAFhlل\˼|'.&> o W&V(o*aF>܎"a켜O~HX;t[_0YEP es@x@€s.lyouI(yIԩlO\)˙|]ՏfYi֭[Z܏=R}ww]vv{vvx"a11ab/)| HrxƢxxƼwwvv=D. Jh#XN{PԿy.aܔS,z$ !,8?\v8HBB~8I#Fӎ 1 HdH~8zT$VBBHe HjCd*K-p¬+GGSݻx;2"a0 ]2H/F.Q6iKQ]jG˔= {92hGN׃F(W2a@0a5S5l؈ DfN;鬃.vH$R}PGYtu`X,d 2d,LOGDbxaoĈzP$Gs@ЄqLJт] 9A3 8DmWhDF*餺a1eņ F`EF ].-nEKwHib%  z]n=<`NI ~$C1&>[&K+I;"ǓHpI=f[}tޡNDfӡӐ-jt%|ԩ:z>.%eԋFR*ui1ᆅu̇h8YfI)ۖVW+f( #I]kE ʂ.ђVR2@1IqF+]tj=ګ@$ *葲BIIriA[lٳߏXz!`rab@ @r ^+*gw砇nKea1Ǩ# ";7PꤼBz;oLǫθ9UjWog.cV<:|wc2*a|)4Ƀ0Ec]0U^eH" \jh<vSZHƆ*N2d!\2,: gf@lcd"nAKXG.JF(vF$IxF: H00̰@3,> H2=D֍*T* lj,E -@4𢲞E$]-<)>aHM#JK8хee:!)K/d&?O~rDWT"eAe dS,rI(DȠrܱ$p "&Q(wϐ qX:!w|e"t:1h|1 E?͒T{܌$ !NM19١NAG$pCOF[ ńKBᜁRwA:O4+Tщ5+꓇*Mj):\p9Icf q"C;&L$xG:d&Fr7fN[-6;A9qRt-+O`3Péit@-pJ4 D(AeB" Xv%|Q0=ՍcG- T+HE- (Ai)u(*jkKp3M9ſ]Y( ÷+CkR CRh@,U/1zOʷ:SVXK=XIIR1…i`28 ǥrkzt?bϚljrŬ=Ƒ!d5 $FzTqjN?dMY00<@'HS brE_hha-ىԔZeH8(@̦5QAWcb':ىgN뢎հ3IGCҔt%ivE %@i3nH% 踓-҇4bZ 3_R;&mS |v -mgP;1%Kw{( -ب4EvLKǪ E$|.dX!p+3VltnrA;Go6$)[ã5>S?!Z2$H2hIa)TF ]myԂvX@U @rMDt1xў6qloִCO[kif## ?EQVFa6ijnT+*ѩ\X­_eՁ>F|,oȷ4%?pWEXNKo(c#|"*q!lVlSV+=,pFśG}ꎗm7Y|\| wRw$Ab0tfwL-3M03ȖLH$8eF-rE?PCv'u&3`m|`y0y'O(OS3 2oe=traQ##&}{,Xل#P|R'ږ|: mPev.y"!UdU+7r/as+d45 ;3kC#erTfCsL h'. @{h. = FV%!H|=PpXu3=X*c TC#p/*!DL|d H ŠP[ԇa+Gt8'`t_d$tNfKp/Jx gD.`Pp~?@Gp_׆9|v h+{h Yz)1Ww*I(,9rf5G+D/d$X? M26F#w#&S1iJpvA7x! l".0`i 8)G@h o 0o$0ܨ `AruW pBf[NdIfY g U+C('%С͸ 0-[yRiؒF47%fCԁ4Z(r$Yr~Z6u!0blyAy{@NZpЋ lɃuY_Ou@0P8CF snxZ`ljpmET!nSZk#1V@T%!_aTdX/UV&) FZj'* PbX)Szdɛ>b 'ʑ 0LF@C 4 ْL@d Mix"ʍ4KvJ4Ņk{ b&7%C Xi1f:2#ya:Oi wgo6D [83HMږ=h* |$ZgUTf#+c0TjVVjgn1[Pft:Oz  _;Y𥪊OJg@ O {&b F0c@QsZVa@:kfJaYFIfDa @?{g\jrʬUa z̈́G?!.ZZZ i_Yq*z屜tgL\9H%FyHTK6EU*Qj:) ujFg _`P0qjg^0X@[+uߥgU;/iOXagYP:j vZTrGUKܵbuVV n_]FEk#Ta@ŬǶs[sovFpJ… k?Pp*|8XdX XeXu1[$Q slJL58cVjfںb, KVPAV7VIQ0fged$cFĆ+tjv>CMU phE5$dgw4[gY5Y< ̾0ĖX>J4'|.\˸)ËCä;I {=ikr3SCDvEY"!VEZnT Ǽ^Lf3GlY3pv %JeVJBmYZL(5De%vvY(6p&f=Gф:ey$L8Ѥ]IZ"#& atGd$ouIp!%8wHR%H@S:1R=F$"qI:7Zt+q; 0S_l%c\b.jfSjNBچXU.i4hɫ28<tzvԺΧzǫK͊oA(M3@%O7m!t->V l}.iP(%*޺jAC{(Hz46]էҺx$=rMK.(IT8"O?Nȏ')ʕ}).ƌ^?AL8m~te G#6zқ'Mc.銼+56+85_SPAqE@ @t2Fo$]MrW9-|9#xe? "R;LzKAf=+АέaK#^*~J7&mjr"׍yv<7+]Ѷ+32T "gZJt$*PiV)IKW IH O1XuRu!J `6I >-)qL48*T?LѪZc4]Qk"0 lJֲX K!($/( 0vQD!(D9=FǙztI.i760Tf7e(H)y@'\@fTZv$$9&{l\(aplz0<%QO!TnD~P^!Zx(P4  GgFI.kޒ=D]i;uo`!n@UxY)W2uNWہ~ VK#WZ/L"0,~@y㤐.{Y&H)P 5|+7'ޗL:S#J&3Ue)ߘ  ΈN7y@sAN{cC?L֝ P@KgXS!D%&=|COk6/ڮz]A,᧧o=oAkUvӏ䄨V~Vfenχ`$uv@S4~I:+55U&7SQso+3+]0OO"S39Sc~0Ĥ4(|m.P`c!j}p1g1"xOh{7BGz76ړ5~L{4ObL}+49Uh`gNfbHxv3QMu uj+R8K~RwdX[`(64}(LAzbG".q !xGA.px8RdgPq"~X4y{H1Ae4+bcPO'$ȃ%@r8SZ_Vv3g`&8343!"0#Xzz} 3gb48{Nc(Y8 <87f]Q]xq W0J\C"u?=*Bl3rVQT46z3":562x-(uGP8u]#)nIqi%,`pCqLW#eb}2xs?fzH#`]#(9HJr[]Q!i02|(NR!e\Noow);\q4!!p:<ŵ MH=U'\\ I O7 ~ƾM* Jj{ӷ X1Q*0pp(B;jn|()RV@ĥHЧێi P|ß 1/U#w!oɆ+.~gI vcV\LڤLʤ\L^Lv#'{"(-L+ɴ <}fzL~,]lCAwCOyhq˫%v0< @ˣ|Lwop5"DlSζ !":|LL "aCrX-aCӳ\mly. E`yu<ēv J g~ل YbF^H Sna^p昞Ag, xg{Rx9.$M(DR0ԧ~0$[n얎w ;*,0 OZHF9W4%NEzθ+sWK{3=Dl+f晾@&qx*׵}AN6'9~BA89SB:d$_N5p/׽-g|$8"ȏd>z 9^3O(NX#+'S_b ]]aE-P/",aly K#{ P!3➀G"<[c||Tʄ_b?0hP)9?La m ?HH㙎Ѿ*SO=_?%_%? /EH; 8xvvxxw2w˨vxD_ HLڧw H*\RD|+t# I"BZJ)aw0Ր,`bI͛8s\7o(""#:I,yN^OS% gM;Hɵׯ`Ê4ġ,P1J ԞIb!Uc LkeEVBnȓQOz+^|}fՅYTM=u+˔1c'jѰi5Yj~/tlXEۑ5f/'Go9-X MQ[d f͉*=Xy[eu[}ޥ&-'!id%Sil @qUX6f9v#%dmBePs^0傚wvG0'[uSKzŤW@-gkޡ߭&۽' W K/,vsx IdpUu>BY, g.i>4Bs@bxǛ)vup֧riBXP0NZ)r"vTb<8̃]RsHP*vYZw hw/Oi)y}'*_}rf{o#Ll6gG^t+:L71`1$@mwՉ&䒞FʜvjD.0 'ǭa8bq (ue.-vגW '/H~d V y|yvƝkIZZm^F9wkk[Y)g ?'6@,uav0V%l@|1|d'to%-W+!g!9!n$˙XVlľ0+ W>E ׵' 7+#v>q>}dDvHv2OOkΥ^2/t?pv݉/ZIґ}TPs_b!))v+"-L{Ⓨ x--~)=gz1^8-?гK^ML#zw)G4H аc9sz q`?^@rE)J5; KZ08Z@2W9Bo9] k3.sF(ٯvѝj(єȳ)9/TFm/xbQ4|r8i03_"’by5B.&/2XϋߵXb'i2z+VrNPل 8fLN8a<Y SYb$t*刖2ėlnG&) )Ӥ]FOL,mJdo/)zz)bPBMW :'ˁVchu&RT4OZEO&vԪ(ւmu(C¬L,H򇊳0/ĤZ!ᴕ:E)V؃ #Dcn+=e>XGbЍ6 @QMOq֪kNZ-"{f6Sʥm]zx7^rv;|%5LYu(MPЌb$%ȥyy 콰3WHvhA5T$UޖaOP.@ KY%W$7-9=K#3}#)؟CL)(XGnf1](|~GmPJ_^d2S_.{Q N*PHdaֵSv|s ;M,_N3"%t.RxhHRumc"; JfrK[E9WS/*}̄vM!inO~#7i6 yhE3>K&m*\fɬ̋hy VM]])^;7Bf1iA܏~> čM8K)6t}` VQnI,2*f faNbbQqJWm-;k-_v?T!vŸ!ي[b-wv0ڋ/K$H/ $ńsS߉*מEݫx6x LSrQ46$"\XP2Z} .BO "ZM*7/jbǨŵ'jLw(EIh?i;αd0W'w!gV;Nf MgNLr6RhC$YEWfSG|}X(jRA9{cs0KGsdp8:sT× bb2)G".\?hG_y $Ł)#{1c&l67+EB#p(DaŁ5&,a86 ?S& k&6tjH(E/@.'AdHGq8tRF%Zh A8Fs6#DNJ+؊VؑX%9YrIjq:w痲mYy)ydG8gd%*0\Dٚ d傊Ɋ{Y\vi )s6{ *1И{͆yЛ)(9{ٙ)|0>H9Y"fQwٙٙ5VT ) ^q:v DPF Lp)B F '-s[8#&±^v%s ?c : ʂaP8ǘ=Q ;0)lt@u&P"0r?s% #aBmp@!6@`6.6ZĈDzCjٹGMt(eBPh@gt@zQ1%XGH5;q;VLu8 h:.хÓBJr@ ʪ61zMP*5$ t vPgVZ(FS70EF{$wHbX09$t$LNAxZ1kXE5YlJW+8Ǩw Pڞ PxhPu ,|Er@fcXO#`ɳ`%uTh#OV/&IVPd>~xU~gR+uYJdJ J >vyD|uOG%OMJK;rX@r$qu8{Phu}#|cP8FW;vr7K٨ڤ>GC+t~Nժ2KPXM;[ Rv }Ocn;tEcT+UkXY{lvy$7x y46P7p͋^j W NK˶`$6ya@I@W" q , Zdbv[@WKne}˻lK.=eއ(LWkRBę٬=PlݻKtY*'q0k}Pմ3wpQhǻF;GkE'+rUdvi~c FWXĈN ˹뽕Q+֑1IAr6<bb{W`lj#?kAhG .qi5PI5VU*V̅|˵Aj y_1@6 a V:"c-b#A/:A yCHV06H)# ;,z;7ςIQ\;K>zzk;x-L[鐽xq 6 Ys0Xy"-#4,)yO\J E1Yㅔ#H|ea(j%h86-$'S%bӓi1TR|}#h-{#aPm NvP| #Io.c;_5BdQHar;T8-yEث!i+Hӌp:)t1Z7gc3"'$, 7*貍Tv 7RF '#gZwsҠݙФ]JДQ=ݢR\ϚȆC]]!} {*0T˱^-\1I^-\51wYVV* i0l}L,:-*&7 ܽH!~.͜]8V~pP GfNMZ_.< ^g^9ZK] 0]n~yPl^Q^CrN>Ins*0{.`(nꆾeݑ.t.M~EFȌdq1M\^TNT>{!~^a`6WAn~~>LN^֞p^^DO~ _sn0OiŞ<\,#= ݟ&GJ_m=M`.OHod?Loy10npP>^xOLoOOFOyil.@ss*C"u??=|1v_hq/ߚ{䦿0.G?/_/Kֵ6/_?8A.^Boo2pOOͯB"e1= */3*.?G>8xvvȹz"aa1֌a>(vyeZhp\q@[b3jȱǏ5' D@$J?*hIS&8əhjE@ JѣxMOO0 2-z9CίΕY,ҳhӪ]˶-,%FM]sd}͡C69ΧY+^̸q0ʁXhE+'&ŁolNȄq25M@ 0m^mg%Mb49|cIFO h874\V -` J~ MJVDtj`ԣͭnuRfS)MobӹRCO5ԣչtTz1v+Uf7Q(uRv+ЄC͚V`i[+W ؾ` ! Mb! $f$ Xΰ7{ê CZۉ4VQ /]L8αw|c!N2W_+Q\efrЎ60C~sn9ĄiZɱ3klھ^ Mo&giThR߂}#vMJoG<.{pE}&n'{6AjG``S+aRfaxap V6ih?{ W{dZ`\g|POWh-8YiPLYU7TQ5H+鵀OvW'~Z0~WѕN8]~G\GlVQ4aZVx4[iekdedB;؆lX o(bPwgVV&76zh_W_6H?{7rr88%@lׂ'X^=g3Q@peh%Z~&n N _=$%^g%Qj&QCePH^ۦmIsՄ\Vw8e1ȍP TWRmچsp~R`c`~P~%(}Z*>b =  b `0* *pTpC b*XQ C'X@I~6O2% 8:<ٓ>ٓB9D)~8HW$@H|lrwf~0mRwd;uVɕ\ҏ(Q^i函ȋŋ tU6UHP6'P5Jfbs_aЍjIpZUcx0 Ȇ醚əm(V~ Oc`HWݧhaz19IIyٛIT*-0Ml05i=(C?= ^@TEA}Op9&rwa@a bD"0!5Q"@ )dY @?y uC D!0D@(Ou}d'l>zF H$,ڢ.0ڢz04:5B rPZF{B:DOT.`sS%p;^9]p"]dХ_xpf+K vZ*! ] T H{a)D D:Dty`8ypj"@QPO XQG N.@ pګ0:'940m:9*`zjJ3`3:ZzJ0e@<v~x>#9+:4 /" :˫ؚ[KjOO.@D& L$ *.K  6Lˤͤ ΄JdB2` 6 !0+=>*p`{4@ejl۶k9QLy{Y ;e  Z '03/_nз @>6jĺpLJ'`6C&:U8lp)L z3[{țƋ.;&$)к /V?^ ج @C`' 0 j`3  ;ki;뿲y;'KenKm=Wg h. ٝfҔ/>l.f~pt`aGj˰L+.NӗTNK6p plp- ߙ-A1(>*@KBkhm$ -yY ^Fk)kB?LG c(@>AKӺ,d탫ӖL/>ʌ&;KjcFQ[5T[u}ra D }+F=G+e0@ksvplK^A_K. ׷.IJh C+K۞>_?6f.>޽oK=zh.Ⱦ| 0ۺx^KL7c܃NK3/PT L0,H포j~nl&`I;==ޭ>ԮIsy}ys0xfëY^髴캓Է8 32&33jjj23660096))99>z'63jjLj& ?Ga" 2''І݃ܮӖ'jLHOl H C69s@Հ&$&d*@#rM6PI*H̰E0q!T2jL_ Z$4v$aC %8yC@`jʵk6dc@&z6R%գET5@:YBѢ Bk!P=*8#]DAJ,Am0ՃV2 =5#pj4w=GXx쨑y : D <@O -O>H` *cV"X!T$p@ 0&K.UpZ$ ;ܩ+u9DP M25 Nh?UWlX4p9 7ȔjH0W+w=!TE)%9pMI 4Xq D2R٨M`T N*hV۬Z}P F io 9R Bsadq5)eI'] hLzmM #L%.aIX3 .1#B{'_brܞZħ]ѕ92jA^>-t i rD|4&pӥ c :cJ+E@ duId{l":f%YU1ZlHǯ| BbZ " aD%\v'Oc#M7" tvu)hs3JTqpkP崾6Zk 6E+T6g|a_I]]N]2HÄ P"C1,;S !` ˾D$'X`jU0ȵ$& 谒z .)!FaSS7HN*ՖA iPF*" |2wG;P(I0iҞ~" 5taδ< Q>&`y@ij-(GVxU?Jf@_ȣ1*5Gn \mx8zx ߑ?^쩊߫/+U1- 30QJr/a ZhVʢH8G,J B 'pf:SdC_j~BJJn}T¡ x++Uӭ'HPME#6j6Mq Wѣq4,v<'!Q'qL@ q'Su?6)-,: ,2̢&g>2 7(=ef/&,aJE$¸n#i#Q ?:T #R("k{H 0TPi?(hAq(l~I, IE\+-Dw1Bq6At4!X0)ոdTVjU<2T%u툖&8Hk=>4y 0#ORK(P TO_JPfsnP(@52żPj²$UT(.1JR).9$DZ\涄G2 9NҦgπ%"Go<8gVhQpJPt^ٮXz|w=єN3fDQ>@P lB{A7pV<w|X]l \X@Mk%hS]=17(M`nv $Ά 󮣏PJO;ٱ\fkq Qچ׽oaW1dϕ %9 4kj9K)$Yd2fB%(20\ @BĒCAl񮎺HU'ػ?J_TϠbƿe > y3xk {20,/w34f_  `u%p^RPWqerh5u\"=$6 3Ft7^Ԁ8qׅ%Gq xOy, OSB/xl9aA+ 6DD VmSzNmVUn͓h\@ #qnp r_|.Po/%f!w΂ERЂ1h^ ń PeQJ2p? Ecz QW3 XRW0)A,Q TLQ 3H&.Q9 ,20BW@D7k!9 XAlNSaW1 p:яufG FGgtavWa&.u8QFokc,0"_E۷baDbK=%Q 8*@.hFH5S796x7</' ӉOٚ X{ vmQnz:1w`wa`E(Ȝn8 KIwJgА@Q-$as #My76PL+!`i^qeQ !s"E GK`LP(Y)ZC"P*p~cHႄQea$4`5PPXQm 52 E 3} ǐ.Q]Ěm1j%ސٰ6kCI @rGP=(l)Sk11ln?Q Qi}-NHwK P, R @&`= +S+.G".$*,(S7R针Qi' "8q'PL iY~HK/B"sQu(ʂׂp#TP0Br_ > :xq7OBY 9>`&bZ&[>lzK)nYIYH? x : `~QSlİbGJ$xAƗCR&,A^85K&ɆiΣ4aaQp Q J/C."~gaǸ( )0i++CUL[ h+- Τښ祐ਓ p#G# ˌj2$0 ; b $ʻۼbtOahBkC +TB图䛾T -@@+p+*i1@=۾l Ҽ <0 Ў+˻6\=@hkՃrkN =:G/C l\sC d*7B?!C  p G ]n4r%+夰@h:b 0= TxHaДltqX9N=t|~\ʫԀ` `Il|sf (@_k_׃8=rMR!8 |ú0| u<*㷮PߔtM83P$ o. fsY|&8s^*;J<\|0ǥ \} ^;ȩVhSZ;l/ 0&}(*,.= )'x%|<>=;?=Dp>p==pOpD`b@XZE]B/H#I$lr0Ԭ=>Pv}xz|>Pa\p=sM~،؎ؐb@ G9p]a0u(vM׬װڱګӶ[+Ьۼ}ھa1@0 &6;>=ӽ-lldk*QP}-f-NC0CЎ `h sOT|΢ŝHIRh2&xk$& >uNhbhj_\lT኶3!G0%Fl]ȋ QFa \>@I@QSa䫲*LL>pQP2uX~ nd9Z1p=jnɐ1rt@!re1>{el+!^T~|>`D0< kYxNSNWn*=h dN$΁>^/A&n[LnN\^.@W!nȜ9&VG;<^B?FNJ^J^am*0YK;[^_xin ign\~il1keǴylO h40tsǼLNt~d+ `α~_b_ Dhjlm_Z/a9@hnCS~?i?ZG~QCRџ93rYٹ9oP_5Obq2t&?2c(P]kSW@gN @Ԏ>P@O !e쿊P/O@!\`3v*.NNNZ%Z%̌GGϖ5Z5Z%Z ٨eI(aajR'bܘlBd ǒ(MȒ% ,2GeZz\Y/R (H*]O@ʣ*Th='| !! @1ƶ۷֪ݻ˷[ Z6AiҢI4^ѣ$d<h0gCK[Pi7N,AaaVdEKɻe{ ?IxʦȓC]܁sX>dI] Ocs N&ko[rdғ0eY@||fCqT7rHWQ) H"ț&"S̵xseUWT|Xem֎i<)DY$Fޒ$PF)eLVh Q 1l4I8!ai晒hěp)gcV tÞ?8ݞz)蠄 (ceiF \4 T -pp1҈%qbR` FS.^.]=5yq]vfqǣwe~&ݲ6F mj9$Jmnm~zVBH[r%#tɦiuک/}'Ӡhh>*îdiCuRZlRl,oRt)mz.s"t+P l 6v2cDmkb 291IbfgbfV=%ɖ\Vf˰4l60Ct=wx@il yqʬ FI^(*%S|+ 6w%W~+v9"]๊颧)=_M;4aauثc+6"A]26M]} Pq$;y;Y9OZ5 nRHxqּ8 G G9c_ 0D5z[54D7˖þTInt8UA.)әrV+O+s?3ZxA]9QȀ! O,aʀSB>c  [EzaF^ؽ0~ 22C#A!N){sv $8lPq<*SU|,cIYڲ.s]DIIAD! .1FAfcDq)?BL/b8S<꽄8AR|:TqCz qs@d3JЂMBPaS2f5 Q#@tc47z (%Yj+l0Jq,mia 5!pBj{4 3 7: ck,)Fn_ $JJpZ1)L jN^p.[(cR)OL/~OHC?31"i]@Ex;;3CJm=.}#mCN=0щ&wZJS%kXp)w۔|C5x,xx`f *4[ϸ7{ 7YˢeQR1F 5''.ӓ$ιK➣=:jU6jdƭ1lv%zʫy!_"W:s  qS|pN9P^BDDKWcXzyI<!>Ё..yş7>z3$Jӏ"및U.Ǫ00O;hف/}?X_kE:ҽwÿ1C_ߡ?)=[H=[,se5e ؀dԕ/2C+WV^%^X+\ k3`b,؂.0284X6x+HC>>SB8DS S!x~PK؄&)KXPWYv^f^i8kl؆noHoptXpjxx`pi7]` T؈8Xx؉9p؊8芴X؋)p) hXH96XxӨڸ؍ݘ308(P؎86`xȍ3`p& $@/Lp ِ9YyI9"9IL#,ْ.9)Y.Y!<8ɒ DY#ٓ-B G9LiPR9T);PKwhÝPK.AOEBPS/img/install_loc.gifGIF89al!a8m̖ade7?jٺuˈw/B`]́ȼѶدtyzw}X@8Go_Wezܾo3-0@CCM{s{"/:{r{sr{s!, 8 %11&1#!###11 && ͎ "\x\j"kG"0f2*8#A#F|Gɓ(S\ɲ˗0cʜI͘#LOX F;:tA FBą-[õׯ`x%ٳhӞö۷p%Kwزatիn\]Lpv˸gL˘3k̹gvU\.?[Fcb2D(q )$Э; p(_μЋ;|uwIBߕ^~ٱ>w~fs}@݃끧 x5v ($h(suιxo x0 oQ őGL6餑JFNVYPbYvi`WrYeJ&hiY)tix|'^V ci T J B8 P) H馜v駠*ꨤZjꪬ꫰*무j뭸gTFEl"x _įdjȤ˪ʭ.zk.ߎ+kア>vlF_LApL4v\* _Al1E'V&pbjH뮧k.-rJ3̹ƌ@-ЮT hTN>DBK J:A(@ G SU (q1D_$(R7\q~ߢ h\7̳1i4\-DwzATP8(qA s p.45 $$ 5l#Z.XZ[!BSh@;8>ib))nಿ8˿~fE: ڧLg*XBG Zz@/xBv3aBJEa &Ap 7Hd)[΀ALoeP)1@RvxZT-vQR?8MoS@C0@Oe|\7,!@`;.->9̨92 F+  R`"Xr`;@+,` `@4 R$HhI` ` VP I+C(Lap^Ƚ(\@_ $$Da[BUp3tPBτLuPބbPYC-Q,QX=y6NuIO9'ExDVP|fxc;w7Pe5$5C;)9p5kRaC/sUw$:T-&Zʢ,]W4v"pt@3)G*S44lj|t>T/>8c; wAN5J@Bl^Inn$B1/~ YG)\W)p;9FbG(*7*^*_T9Ȋ蘎S@;'4;vhI(uv($rlBxSt)CW@ 3*WG@#.H㒍$Y낐2N)*20IQ@ao3^P2Qu ِD)& +h3R9&Rb$jB&2+L,dyWu0$W,6%]9(^IJ%j))M+jI(o 'DHuɖm$z&si&l%rDW{vl %&yٙ9Yyiyb G9%ғ^A#!)4ɛ1+"֡4yY!aaG qI䩝ypyș a)˱")9  # z œ * ԑ z"Z!ڠ灡ڱ#j 2(!XQ5p5PuFzH1JJzLڤcORO*tΦ_l`]:dZc TbfڥptJZawoyzOT:p:qJڨ`::ZzZ :ک J೨ @Swה'"(b $o*PŠV@>9p@0SZ52NKzKIK0P3Zz0*ꊮ@uT1mRmzoʯʯf[}ک + KʨZ sZ>(?3)>,SD"(T5 R!L' JE19 sP@b6R+ Wz[۵ZKz40T/USڴy:";;t[|۷뷄;+oP+Sx kK >o;[aSkV O7 P@S*KFRGʤ'L+uhZkDЫkf[N{ʼ39ʶڴ9@%𶒫t۾:[{˺\˿[m:Yz"H;jV0rS67p#[8I*,lzE¼'mLIS@eIPHuP&BI&մl ĜHhꦀuz?`uڴYjo w ]>  1@S|~ǂ̹+״,y;Ǔ\ɉ5;%06$ E2ĨʪlF*E:K oIRtCI)\L ʤL#fԴA7pZ[N[mŸbL9ǛܴVl|,/YuɃǐ,|\ Lɚ:|, }k%+b=np^> 5\5Y욵W;. $ZkkKcT[]X*錰]F}H}4V`.c+o >4b*yuP%Px4%P=PF( ?VяjV#R>V*0ypւO}sWpKL% n@nݹ =YU}@@{ (>)eҶ]*-ӹۺe3ۻM><ͪI|۴SWO\ଙ*0[0gMu`cj}O U.@V0a@Yy=V0=0u]lpe c{W 4SD1=n 4Zګ~˓ M1}0.=MZ_8;kj[jНJtVs2P2+eoh[} o0?0l0^F_^-脞}z< >閾nlo`n.ٓz۫|>!>L &?Ӻ=^0?]{3k:LxPEi2`UFVUOoN|@5>UVV%[me G_N_ۣsiXb?(p1^GB$@Po鈾QP$Dn= `LM~+-12 ۨ_ >}CO(0_;>@3F6{@$0V==300A{jIJh Q8SoS[ 8QJQSo_A@K"K !^1p__¼̲_ԉ݊S|*sĈ*\C92a 1cH B"ń:FP㍘)/Qʓ+gp< ]DTA 4UC,9J!*#\zZ&۫oeml^̸K͜ǎ'zeu9ϠCק+nYJ!k4. 2*pH9R %$yBC%B2@Ú=:2J{nlqAKy,@PS|QB85e_%vK1 ਉi``2·u꫰:O'j뭸F a>D(QS (ۑ3DS$}p B2t @qC (,džvDqƶ(@E5 oeeS 1 Q븡 8 +؂,3b*7c,4=PEB,s|ܑG@qD)*$P^ K2H'xh2y!GM(F? T$]Ng^yA1pV 8ŷ\EeH+@[U[5 ]!&w~m-<:5ꬳs3I)3=4Pct ,\Buv 6C #x )ʟ"iCF7CW>xdh Oǂ)Y!K: cU(nBYfVRtfǓ 4)V&P!l$  jYP\ qkv]]Ww5ԁw4nV[LBn**jcoʫxK|v1N"3 c2o`;6̀M BZ^: 8m6L )r@K ĠS# 猇[~%Pf([x u ek7 !ojkx&7tUtDY9Li.%!J t+/(5C3ry7SVG>]97əx`]0_ [bXeU+ yȧ9w0ɨNu3%Kn,l9|Eh !;S4'\oՆ% / _W_plAlNJ9Ov}WT.[pX0 jʺuǀ .Ц9,dU;=E e V" a$e}tBy 4qL#(q2"ep,֧ wDvtu l߻7#۩KXRh~W֧34f 1vW)thA%{>< VHe>p tx Hu@\wa [ 8p}0R@79TkRB 9 D vyˁ73'U1 o˯/kyF ᶐW]NZAz| FbP=f]¨25|ڧl }?Dfk @G/2(8O,_|EEpI/1^ŏ|YN: ob` pݽ譮tz0M)zbb߼z=4}i7-J֊WI:pr zrI}lVT[]b(zVq`^*OU_b 9cIօQuͼo\s|o'*+ 0pT0{щ1Ȋd^^tƨ+m^s ù?yPgίSdQͼB8KA & )V80T?A`wxUP/̙خ'G ̯kت]}A&?) .ꇒY(+8::zwd+0"t>ۉ`1)/0c ;0( ׋8]aU d?y?8@]%IFxS'"OzZ8 _kj!-#Ѫ I( A+?PJ8/ξ_ka?͔G#O9>Zs]jkَa?lVL' 1g;1%_^.a;l^޽W{E"H v ]k\%ckSSbbyybbVVêbonbͰϟUxnnwwUѻUxrr趱ǞˬUVro"KΠ*\Ç Dŋ=q5ԩSB~T1XN\ɲ˗0_隳ey VײmΦtЖr'zRu\<ߚAEs}XPЗgӢe(۷"-ݻw?m u,Ea1jǐ#K kb [FgO?{L>ʟ{*՛7`Apux _ruWУ?O,س|uMa9*.&NƺÎukժBoIqQ|%KsO>(a>bfatv衆z>3t=Ŗ",VCvv; SX#-n6bLw\r *8UiXf\v%a(f9\8ufV$VKb/J@~kI:érE%.楘foJ馝*jir;tYg] %b9*7v;nت'<meśh!EV[F}}`M*v3幰Nr'V6kjou/]:*<'m <[Q -+Ń 1q \1n5$0)S4#RHvM:%k4~9-Z2XBtiR{YԪk6_L!qƊB/@bоؠS2kPhdVƋn/>OmmYlcrlUnt*U.ýqwU4{CJi%KhEӲ_H4==- %3< tySwVgc#YYZwypxnJ|׽ 蟔_V7KΡJ/)a򕻼[%GQ/u{ v{7CҶ򾀽^HA~WpP5q]?YL d8Mm>hZ>9r.0pJ-5_X_Ort%ob"tW'Zm%zweL6 x~ =?x{XwolwǵvR zLQpЏO[Ͼ{/Xw${Fz:ސ~^: SzuwP%V Y%D6h_bWzu/6uTl&kc|BȗA3~&x(*,؂.&X~i&02hCW1w_TCO D_gMdm8pf7hTY&pjpTeVk9p2o90l؆nprw:g~v9x Blj1d:V^l/FbVdcu`]T'VjC6Iexb=VP4L'>&5؊+(g5H:xXh5uVC]'bv?fgmLbHCcLe3phuEVTqo f]VL`3]2 ?F>m؎xvt>v@U%/p &p œMwCwԖo?v ߥHTЄ66h<㏺co 1v@I;#g[2Yn`Zː?);U`WhZ)+8DYFyGxW k2%U8ͰP FuZ2y07[ eM?#HDZΐ<"Dr` b3/SP_ 0/rrz%MRw9U6VUW ru'5Hٙ 0 W 33(c3x#,\ G92Γ;s#;D; i3E-U`3q ~P_  y)L{~9/_AV@@9 Uwٞ,RP!~x"AxMhW"a{}8sy /|=@"E%Wx "9u V0-8 466z8ɠ%)JL&[.*$JyEwZ9PHYyEZFz\Rb:F٠<W$8c Q b wEtZvʎTz(z*Z _Wx}PrǚrڬuJ `,E8Dz\ꩿdAJsx֧y}躮ڮ:+ꊬʮjZzJ}:Zk{ ۰|J27wpۺEα|>m,۲.jZ(!@vA*1 Y"ٙ暠1H}xۺ(-J:j[Y[b \۵/eclnm;pKr[_k슷w۷v| ~;+[{p[y3OQ@ߪ*;5Lɵ{c{;{; +;{k̪n+;)jS7b=+!r9t˸ۮ۽y՛;ٛK[۾{K5[1 !GsZĺpRld۵+ +< <&\(L*|*ٛ@43 RBQꈣGƊqKHL \M];N \KPLC[Fl;'dn]̵sl^Lwl\Nl[C ^j#&EqsQx;;Ɂ| 0l_ń\0EIl[ʮɐʙʱF,˸lʳŦʳL˹ĤL˭, ,\ʺ\0L͢ ̹ݸ-M}߽%NI=6-Vb[F)=}]" <>F%[Ž-hG2w|Yǵи}L7~^@b>-BE(nJ79t/H}[xzy/}n>^>!}茞萎#iД~闎ޙ>>>O]~ 1⾰9tsTy.u~ջ玪h^ĞŮ.Ⱦ>.~sJkn j+}]_Nfmf֌~~מ} .n^ca⎪벽cn "_o+?Ng!5O6;R#'VRs_1+i.q` S?\`&:r*˪BIW/L/0Ŋn,-ӥZudsnnOӋs0- ʼnݍaX<dR0/Oc0@o}__/a řXd޳?/?_P d@?ߢ/d`߭ʯ_/ch?au}?XXaXhdddXaaaRccdXRXX--dR-cdchΏd\ahasR-ߏssh 4&(` D,QPa e0+(*fL MJ6q3* B&."#EebQ]thI2GŜN%t& *#$0:E 2iht iX$ER2Ȩ`4K` {*M%}X e:$sAB6<4cK>mRHkPsҰ2!HXEXVuBTIj5d& KABF- ҂ P\%^/i R%-EZ!cjXw )شW(,B 6^~yesNoh2dӏU9PA@ )!QFdVMMaE$јVtTLtQ)XGqX PU/ /tqIP=UJATQB!]-xxUTjzWs\S h؊rIPXslF=}I= ]Ƹ21r@Zh ]HsAR#FX-JXh8,>_sD{TJP*Y2!& ; "$hH1,͹%*7a[kJ3˸p*ln#V2!u"^G:S6W ͱXW$=[vCix!u@S\*1T5YUY@9QO@SXBK@H/I0TKDyZ;.B=τqeRJKb[[֯|F-qWLhO^b9x@*.\2j |8ҖK̦qAsx5TG?_b[<2/+4E,\evJ5oV2C +pwzC~_{0C( ~fF-ҜvE텃aXf辚T(~Q(ʹ·wP>l  R0r82ud)Dd;#u#H,9)+pI⠹$tH(&Ye $/<`ZT2WPZ\Q4ejM0]$ODž9q0ЀS&>`ʌxe|q K>WI \K!՜mqGWCx$. IH,S(Pl.)b‹y5 M?E(yQ>)Hқ~z@Dk4M*AtG9@ L|fw *ͦ*$Tb+(< I-#T3/zϦ1[JqGjU *j 8-6mSbX&`, bJp̬ -AK\ZF6";$ HN TܰJ>%tr J$KMU# Dڮ' 0D3%=@K2';yԠ@MXzAH#&W8xs+%'`;cRF^LduҠ}J! Kmi\w\m&Un,Ӕ"z/WAZƄU-Kod~@RTՊOxa i[E RlŸ > EQBxL3C^4xhm ǫhcY:*0̀d] NӜ&>D)r0iպ̝d$g'Id"E{[яӔrO2r8n!GHDsdObGRFH&UR#)q$l䦀%W *UQsC֧ %;'y\eKd'0\m7gUv<ߑlN$p9ެ70R@(aw[#`7;p&G}nt(뚂;܆7^Ԝ8Wm=iH&T7K$WR<mm ʷP>ilKs$y wKsזU05knPw?nr|c+~L 3yPgÏWhҪLebv&>nxʸSt>+$!]w$z;lN&l9 FH5WJqF}VX9EYtĚINO 8yΈ71:341a:,L=M{k)&ZzJRO8:DY,:a:[)/ +M6p D>s` qAUT t`HY"/Yby_mvt ͡/,r.& vg412" RpH -q4 !.b@]D ؄P!,T<sgP3t }VW0+>ac2 H@֝>QSR.R1/lp5?Ʊ,Ƕ!ŽPn.#c0nMkA)eK;'4'>4f1)NN821-Ǔ4:m;@s`?Pmg"fR̲!b 04?v<̂ mX1=@ wF”0BQ 5GXʉ A <" zYp+E!=0"0 )l1Vw-82 |L`)ss~N "D P  :2AQ20$ ᄰ:%sQ^0AaPu Q!>)sNhz.@t. $ m崓X,N*N&[n29}2l['%2MsW)B(`,BI*n6,E g"85@)QV]0 @ s-"~, p$8R~ER t~ɮ_}Ѡ@ Հ X/Gʋ>\_ +4>q!F : ޑ2?١A >Y`z0 z!4lN t|v~pgxXYXXcddcd"K !vnRRUURVqRqqVR\\)RV\ U\ɦRd\dhhhdhaXhXcasXX̩Gf ~#eE2C0BYAC^BЂ,aUWb, I,/L?,.<&OAtҍ8hȨt!*4^! (" sZ۪ᤊ !\|*h'r5PgSDyagj؝ )4BXIpHۙ<:18!x1NYה&XVgSl,uIf9r4jI0&o)\f5v~+iTd Ho.POSb7)p$: )ĸаDhb1Y<A* E}$ 2DÆ A R1f؏HiCi<-L R9 LpRBVa.V ,/F}0ḨЍ!X"%`LhP2a&cJۅ6D/ZȰU5c zU2luѐXiϼ91zRh"ZPםYMq%ѻMQcW;ǾHh]ASyQJ<*Ϊ#*1t'V l-85ѴL)-TF8m3E Y7&1"L6OVVA[(z=Bt1G~|q!xj2o> lDTv3(4(;HuG-3~0 v`DBM\0a]R `㰉BW5aWDŽ!Rjdh" T%!j9Kэ3,ՁGX",?R*˅-oye~C*X LLQ|)bo!an)[r ]s9>v (+nV"D2cfVbrj_=ȳ7n[5@Fߓ+Dfd!, jSi O`VDM nVE Ժm!m4f OYTr 刺 ( %T6Җ¥/2) j 򽘂3<<#U33|,P8X8DCу]=)6- %@Ү~M^b@:@:wv6j}QcE>*N2)&\j  JOAB{jrvn`կFGaQ!2-B? }j~dzU Js4&C|*ӕhޣ'VC!~eI)z[ gyP@`gsdۘ G#UeRxx-8L/C `2Q+1Қ(N`Kw `@•ih+v>XdSGzg^v^)ov^vU\D|Kzgfhqr(!QX`0b1W r0trr0cFvUvPQ-s]k7 >ROEytUq^@w?sVQtHHeoK~:b28`Q&Y 5ƠXR0ʔ9ɃFsUrRŀG xR=ڀp^sEǔ*RS9B#wg? =U+pɞ{CzQ_ aITyw9)$\[eys#c\$''{~E2XsXyɈrs9\xhyDլwyc|׀<*i˃ ]|`hyx+Xsi>7T f`Ȗ'C@${ ]@\' L -`A|@1>7tfrxjU@ H|>Y}3u !!rвWwrhC7Wz*O13rS~Cʲw[Hy?UWGu2/H~)]QcScr](]XXa3H\f-g6\;gy킦pbZ}^hS#(]vDW SQ@A9hSӇX{W#Ac"\hK^L tG_ԸAtҗ*'>gڹ{q=`g+/=B)`| :w!r p5S` 56 7uC G'V -WC a |`ovF]5uC 'z1˃U_I WW#G`5B*A2 le/q$<ikx 'D3Yӝ[^Y=4-\%qי3VP;?dLw}[&+%s _Áftcf-Z9VQ\p}`ӵaF=D=Q#%]C;`,.dA;H4Vk2OG c3$Gֺ3a+%C) %7s [l~n6-aZq+P!0&eA.)IEްsU UӠ6S8BY[Rp \NR=N}8qC TJ%ו s,z!f*`A9wrBxMqmr;XQ*Db)1zR*y&AANl#Ӓ#bFfL$SOO0#@1PC#d)d;ȿAYmu5b#! Nh [0nH0eO @P,SF dcaXa X cXcYacdc cX XYaXYY c]{X{aa;hd̡sz h/8c038'o眴c>8Tt"`H_¡?R@ۆԗRd!_hg~ɕc` R>,`!yOe@ "P0{vrZ p(N +f.1P ݨb,JS$.6$ p,‘^c wf[ZK;Ѐ'+#0 IBiv#_ p(\0רI\᠔BtI~y%d2t(MFDVŽv],;wDҚHWPHF=cRq $4oR`n0Bu/_ؠR$2"WL#Bjb;/p 쫄)J!] @Pr10] 2Wh!9 L칈!aX]hUظIt$1`~N8/4dE/"Z,cxVQ8i Qq"3lI  tC$VF*uֶFؗ` ;ffѱm@!sh+p 0P>= r˅>qXAq/ǾWq{Zc$"Ai%+ξgF.HOd?zd-u'C\gť;{_[aSP`8ŧE!{u~bLvZԕ@ł%)|{ tZ rg|*DZu"}V\S]{(wZB1!h@H\W Q\#aV[ p~bda0xuwt,Iaԅ\уD!VcFV`#R\E9 '‡}E Xe~UBoWC9I"i$i0byiiyT* @Y%Kϒ'ZxZa{)gzzܥzQuHbllχ\)eadLK^a _bDžw\D`¡v^!!)6kGz֕؊b6~ǕuZz!0xzX al\lWa8vXg a\FxuP`G]}e'g7#|[PHp*Y)6-P<3ؑPueEMu#I%=wfOG !l P%IX6x~V`[( )eelΤoQeG}d) >[VZXIp)&Y<4p-5a&!gZ[ȄXKʉG.E2gU0%& 72ԟ)oǻh$<3f8j~Wz svada (,X^I`1]6$Y& [+)utK{an|d7\:_lx>rv 5G^'VբG ah^_hAE9$6oR{aJ`>`[}8:\bYkO,C78+־7X;Ai [oF{W[q%F!|LL\ g\֜! O|]&+K|̗* Y{ {׊ZzR{q0ő|+!I\|WɺgVIǹ'BPv%buuWbIh iR9xQiVU6{7S xr}ZDI(}fW+eY YpZ%'*6t' dQMUi qDԦӖ3q" o`"_h! ־ DzeVX\2(t: 7de`wqs~}{6̒=~U)`\ z@ J!U @PVf>M~o" Xe(M;`],o ѓ ,+ sD/  - +@g>$ @/y'}%^T$B0 .iH B/JU (Cb?T ` 1Y103eA06Ԁ6 $TXqP(@0A@R\ /" ^c 5`GE..FJ# FZVrghS PT  SZ!7@060C%M4A g"WF` '_jvnёۺ8c<)e q&fv>R{A C=-2i3#7C @AY&b"yWJM.4  mj0t:FMW`Tyb} ^A(I?O3"9@6}5 0d ` p!;Ct@%& xo?`1`'BB1p0U?$5FsXgaXaX Y YggXYY a-) 8K ![& XddcXcXX{{Y]] HAQp!_ƒ#JċapGX@u+L"7v񫂈a#T@ MӦ=˖-o+'vHtOz§OHU^jCUYR;6caDSņ6n~ ,J }F͛8L͙OF3%MvUFZ#GSNx5B[c˞-a}QA ז/ĜYr4ʓuZͳ˘53eWzu]qӆwO޻mGb|+ذbNJg6G@䔙I<7?uQ]g ;]y 6lF(L2= ~s(ӡd%S2_qb8xT(hjmݨD1"wS8"&߉DB]X]Rی6)aB˕)㗈AfyxSfD? |M9"6w8]jgj*U>nzh*k拯o+0 lpp /pÜ> p/[6 j37䖜P0lݴ0,̯07Unf )]"@tP3^ԫyǜ*ȐYltL znWQmڜ{l-oS$#!69%-fg7Xa]pW.={wƺGZsD᱒F\."帿J.Mw5΀r2M(8P?5>{*.*>/uG+wa~;ЏOG?p 0sP=JAڻv}/`?ۃ08=_u k_UB\)~' TaBH$366gpNgpyoow+w4yv8t]@'q7r5pi)gqq1rJrsG|Pqrַ\؅^`C}bV~ulup^rvAbvŦv_~WezGvƖ`\w3RGЀ2o$vz[uwh0w4+xȆnu[u0y%w#ȇXv~x8vYe9k} fq"SVf 'm߶sWGxvGpJ!)Mv `qnyy-p֋whpzf^HRqJٔIxXy^PVHxVxIUIrl9YɅeh%q6v~XGlg prVfP`6Ipmw77fw(Y0q@T ,y< M 5y榒$)pbDvh &yw>k`zG{Gq/'gr2ДHILɔlrSq.e9_)\ʞr:ts︟7fuHoH t pApi/7vhl'lPt`|7*&( qgW >X}{.}}z0E fy{ׄZrTLXŗ5';ٜ=r~qv(h[䛱8Hvju~8fNe kt(gr'`TPZW̝B lã>& =zT#z@܃=ޏ >8Ҁ 6c Wc P|7rʗrK(şfYRrظ{]Ζ5" U ~pn[/p7ku;thfe~_ݶP`B;]k֎|a oP$Ț0gN1?KCK^bơ]GtBmv]vf~wXr.t>v^x~z|~>^~芞.OWiW0uj xJGewLbB i@ִlzOTô:>-`=ʾT>^~؞ھ>^~~dM?) >j& PhnнȅLg} 4KW/?/"?$_&(*o +02]6M8!3?=5DAo7S?Zf0 `f f`ee0~N*/$Lx|?N>ëe {+<  Ln˱{< Ďަ˳=ʓ{oiւ^ 6k~pT "K #  Tggeeege ȃ¾ฬ窲䵧i0TXp#J4Ѱŋ3VHPAa "1, 'PR\IeV$0Or6ijOH iQ$]z4-OFEٴիXj5 4f 6kZ\ymځht](/*KJ}Dpby#?<RBJe Bp(p0ӤQNڴ֬WV}idh la+׬<24+ĩ?KL߻w:wPKO~?JWihMU]!h~`w^ µ \!UvYhu8ul@@/0X6H1J<ch- y$6A%\JkrFeg`M\%\P Y(9p t**-'pxVgG Ju~g JIA^xPi6Q_T9 0ej1ꪬ<'PLYNt!\*ta:R昂T챐PɚT*VkbX]^+>ěr;pU]i0A6k\*;L0$< Z+i(E:\Y"=w&l ( @؝\7%W@-J3L3kIY(U;vx O4LJPA2M1:ϡ$1W,$ќ^QfͭV;-R:\r*mIxaEUSZع\{6cOmh=f`&f(OF,apoȯ1+|y¥pm|U΃}ko~?'~a[{'{7XpnrNi- \J,חG*W!F=m:B0m8Cfȼ͐ӫJ|Pw/P|{74_ ӾQH<"X< q>ӏU<)Xx-<\iMj]5 (BA'JhEPd&:'p"5 ZgS´BOI'95kܢD'N q O OiD벴 EQM讎v8=Cp 0)H q$O\Т- ' !%ZYs̜D sp&UrNTf(9-5 T@^) Ape'3O4J@i t2̆lzJH&pp9\ZF/qu2B^ 6'S*bhK1ttQ(66sa[L?O̱ YP/N+^NA5)%g=9BթZ5o"&*UN6ؾz΢B:QPs $%IJ7Ԃ ./:dV9*O7ޒ P&Fd! C#xA*%IuHkBHGZs*]-U4Ru*bTK劜OX="VڞIsƁނ/EWEb.x B=CPm&I]oE9 ZʠlQ=peQBգ}1-~lءĵ[!hi?SЀWjfL\Ӻpwk>7(l_YIzWBzN%ֵI*:^-hVviEE$F1u -ve2g6NCiB P*d7&;8a B!d%xU76q\[{ w2G6[IpD+]ub[RgYsxݝxh"ó +Z\MgQ>ZT83Lp$mG r_Tu]vNǣ:1&qLYŮ[Rw!X6śY+lwuݕpgx5z5*[ͶVLcmO&*rGCQs2\go[.+{1 XpӇptq$Ӿ~kޔ+l ۺYNe_[*eNۏ2wg_m=,k:S߷]kxkRz0хK]Qv[VɦT޷&7{Ύ=WFus˶WW줍~sܕ;hiC }a+}6 t_SQlh~hy"sgMޗVfVRz r81s jLwEX&ZmKo,Xv}}^T"*<8S2{^'Ls(LRF Yq7m($Vh(EFsw.jPvYs|Ǹ{8wn__9Ikrиǒgr(5)o'qwrq5,&;U3T@֔E\pX8kȀٌoU}㎍ZI t*E|fOYL6q A#'|wI|%4{{¥ӆd"]6iҗ\n.zq9)h^(=)Q(0pCRppKw[")h53 ~~(jy_~ʨ."y[WdfFW jgZOΩrI!_V빐@ڣw~FHf mS#m&W {:jXzKIuQiڬW`ѧd=*/ L8_gJ:ĜɭOADF1*/Vzx@aj`HۡHujvA W! IڱA:Rƍ Xɣ9ʏaZ,*L@XljRfkP"~- zUG]Jg^'{ƖĬY_ Զec|Y,- ɐ*):o:ȫq KsF;5IXK%|/]![ډ^akY{۶Ƹ3y-@Z_Ig%|Wok۬E Pk?qTyGsy t۾!Q""mza'f6J~:ؐ,I'ڿKbZ_[Tz`ዓ(jQ3yZwvgU+@ܠзr_u溩aKQn %|IJ[۳\lwۚ#9kp"OӹZgY*K蒗fڵAL6< 7<0,zLj <_ccHmyS\2{ī nqZpjH% [s¢KGx57ȴv"9<7TQ=CFzF|h ğnćڍLVjjll]T9)`e!+E᥆ l;\ Ԭ; &FpeE I!wdl'Keu_&mLomgo\{Χ9ͨcZ f z//1³ke,ψ(IЁr\^+}Zѹ *C^*wl.VF|Xl칁_YU n˶ c8t fH%Nk˞GP,UgZXmXKE̴K֢ݿaO 5,bsɀMs?ڗ؏9 )z}ΔFq[uV×Ӫ >BH-p$䘓$հ?hxQNڭ-{`͖Lu;2;Kl~-@✞{ۮkA˵z,ƺӃ<- Gd9;}њ˜ ֟mQY-kW [Xjߜ0%.pl]oDf!yv =Ķ4̽ImLQH}4}[9>F.=nڧBY޶H0 ?>8awSLf~x]w>z!鑂JJfx)w4EAkg  d߾] P<ά~`6ܳymw)zma 4skJ),>޸|y.8ޠ-.|>B Yt.uat:,bMR%pۡYj\&[ ;^NrNHoRJJsgBSR+-!5ک+uNnPQjcXnKk߫'ZPX+Y E)vw?~gD$R'aZsߠތ>JAI3kjɣQ'/XXo8 AYxAЕ+Lg?S8 ~~NNmZPT j Ya  TTPOZOmƓOɲZWWZгʄıѳOW߬jjPkkejTk"K FPiƭ٦SYH$*UM(V d1K,Zq_cț84dɪN** *3ӧP dB!.QLׯZ1ᬄhIN۷#ɕG>}kVX$+ DHQ%F(ҨҤ@eF#O)>I4c]>hgӎS*R'A"YW$Y 3؎+ JBRj+<Xbl|9Ga^_B 1oXȎ{Y<(֜g&i d9xHwK%P>|e1 %xP0T@ $ `6f$a` %Fc}OU0 :  6A|'j]+ 3̕V[X0d@ IU N@`]ib0OtD-v)'lśP"*ե7;F!Y6 $&r?,8IYwldbGaQ dvP@Hj~пd`0PTP shA xL@<!d OW>p%@h$/R'` Xk$P C|0I[ϐ   P$ @bˀ Ү52p6h]SIsX!RZ"$%-)K[!W-<&MTq\62 I00,@@$rj0@'@ :VN`ZV0({v2bZ% P|ڠ@*`` VVN$<[\e m#g<"{"y*&x=ݜY#;kLJ)Vd3Rlb9Zvםu5?!@s 0g` h13 ] >o!>0 C ]3'IT>JFڛ~VA:⇭0x@#9Z$(KYi&QQZG%1\e:ƈE&IL,}82``=` X 2sP _Ͱ' &]hrfPnR`:#hUO|a L F(C 0)`Η0 );eS k6)m5M;2{6eN$@XJ*)tn \wT3{F1EX|+`%x< xB +` Q5PkTWj5sTN@k`qiz@cTVf cVqh ^Z xpUF]e@}d|Ss@g"m5o7oTusuLuY)^7Z5 ~R~nnmeE2eke"+"Rz@>h,pi x $ x{<]87P|f%xM`Q(xx`<yVke|&W'-P0<f` x0xH`x}$KsgYcno u(vp%M'I|( wwe@  \XR';zP <{0<HNNJXp VP`V Cc5F(xxvՓ`XH3cr R˖A~Vb57Wus{5Qge T%Q.mPoF.@V摣xxƈ|&xG7'Xjh&yAPRNXAfBPjy7>0xptCdž%;A%}W긎pɕ27?%G0?jJ`.u"{7)ji 8xpUpMʈy 6tb0)yWFy B 6Y'xt0)xXxtN7 "3&4FiuyK@ֆ1K8%4sXnzډݙEj nIJḶItfrٟYj<(UBHT@a` ~95Vky& UB` yA&9Ip-`ꅷtIK<P~B!Z H´mO d9ngُQ&Xz }19(a6zA;i8xBW00B|< DA~BLP2qɤfnRIoǪ¬^<4 ڨC_6 x5(6iJ"П+ AV>?960θ:T@)W+ +p4~ɹҜ`uphnŇʏJoc♥@]"$1ӰtI`\L+x(hk*{[V C[a[\Zٻx*B`7x)Ёp{rk0pdXٔգTc:d\MzvSQjvk7[Q_gf~0pCf`Ci`jqfJi5e_LpU EceqUCC`U_P ` Tfs{h>@KC$Cm0@+`,s&d` vO}=lDl뛲 "F /IQʝ2KK;۳&2 .hDfheWU, lqezfqH\6‚^ßyD0{KvWE0|6`\Wÿ_Ly0xfa^X\k5WF;D[nCqȾ( -mhu wWzڿX<4`c?3vu\6Wfd{ϳϿ{ 51`״D3,GV~rBV2ϸ@V_r4Ƙp"HDS-!mp̎0VFa>Nܙ{<$ePҡJm$K2yBOT^Fۦ.SM$f?^^, X^3].M`Yj}͚!{'u4.:Q N.a#(꛾^+ECwN0VyE^}#D̹$cߩGVR?~FJ龎#F!#l*Mgi0 =A4d=܈95߾9f&8,5UzooQخڞ)Ð 'k:.]T nW-J= nd*rpCX@lA7 WS$Eč1ٝ^ҕԧҜ"B%o'o ]65lR hDf????ANC-6D젎lg?rnQ7nwׁY8D.{h^v^Z\ c?ٍ,U.ŗVFzofTb״4PmNm~ff~NPZTTe YY--a]]YajPONOmZZN`NӗZ~ۄf׊畞勥~ىP,Z{KY cV2su ƞhHɓL@Kc2f0ɋw* Q2 @$@gfͽkѫW"IqEwZTSda ~%*WPM&8rq.gb9Q*8RhjuFBr 0¨d<2gϴV5Ħۀ;4IÌ^wh^e*-"CZc_8WĒEkGbPDɾxWuߗq S&%{x-l@F sHXdPP kd`fdP }iF$f$&ANd$W " !PDPdp$I@CH @iB@e]P@0)j!H|Ɔ1@6Efu~ؠER$6ɸZ((HEI@> l%Qi3>bs$AJdX` %@ 4h]I  cQ `O3N3pqlՉTR lIb HB!cw$BĢ<" w )oٌa6čha S zTD`N & hJPH6P @`Ch[g")uEBF9y `M}k$A2Dy.B YA2As (X8 1 q8;6ljip5ke" )6 j @QfxS@h?, xsłI,lY hA*܀ 0@LZaEQp3Q*%w)I%2 `d>p!P`M6 eڒ@&Cojf i$T"55O@= P@B0PRyn`PZ:ō9JIjT6ߪ҈AJ(OlY"3 'fW da:@ `@ qd(~Vlx:TQ$ kB)4VD!!g؀VdYMBMQr"JMnH*Ur%"4eQv$:.#.iP$7G,Z$ 6yC3`` I -@9YFV d8@y& p/ R6{a+C,Z@ U]@9MbnbMA菍pZ؀>pP5.F bD &#"37C/g!#p`sWPy["ngx+l KG 0-ʬܓ50/ܐh7 G\j-EF'ODPzTĥY23cW` 6p3p A' eq :_@ dZT4 Lù[}8oUR#kiEfXe R G9P{@HlbyiPZf p4Κ.oc1ee9}!n?# p0=ז/E(pG1v%4&VM?Z5S.P\t; %f<ɍ-u:&@7pڊ?*&}@4bcKnsn_!En n\Km0s<ۂ<Ӟ؀,"]/rsAU0x)95k9H\vT%wiB` ޤ_dʪ|VYeD,)8- a `,YU ɕ$(e3vevPf*@\z6Cma@mseu $9iZ%}Wlw>[\7oxTu5GaR{H\~tA}S"65&#ymTOE:XW PVU6S%[\6&[.9R֏D".[A~TRXRUk*HPԆpCi*Gmc~؈=O\0HyBK(tw 3 \)MEN0O7SF:C83Gmx偿fe[X{wBp"<Qh'E@' %ViQ҂&61ObER;W [9R""phyxf$o&X<* (av,: B<8L',,mգ YEm?saA \ȅ+1 YxjclM=vR$ w%c Rٙp؃8V2QGP ܹwP'Ki{bC8ɝgefa(glsb@eWz8 <o)_Cpi&^#7e|UbÐ&t~pP&%w8 ao5lA6}eHD&ɥԂߗl3XnSaJa8p h-ĝB8T.iCu~\X3%uiWr yxuyf*X"ff$Ŕe+[;tq`^n*iir'VSQYՂ("zFW&&JM#tfywPX +wqL+ J.OimH vg7c3A70P~@iXaH)asP FyrlՆ@WdH+5~V*gDiiREfF= BmANiAs$9sTkr_t%&W{`Y]){L/WhTy#S)Oe%b?o69$OY\툍rM vB e"wqDY*ߧ/bFm@u*%I`Ai0Ht]dxxWd֕UlBX" E%b&['{XC t闀mI-Ps,aX-8p-@vcaB;ZQ`8 m `+K"o3MJcq$yM$w @7>Xg !C frP vkۍ@gعKs'XPVxWB+ڎFst z0%Xy&,1c"zM[y %5# tV}9_9A |R#-x~jR z8>w+F= `tʙIeǣ[\pX"s[nUIGAWicfFM`ZXSk*[iF[Lm{7" p8Ǯhx8SO<t{k@?wb&vLU*Ue$k٧`.XaBvmʚ{`am*nb meBC *5X˖b0$ *+,WuUp#͚7V;AOqXl ?F )fbVE;I"#s|Ttm.L _x+9[JHH|6 Uu/B#Hێ5]{@v{I@n$ze-E*gA^(;ggCHGH%fSkD?|O1`3Bc8t{q0|8*nv>ZGW8'?3Y:zyO0ZWia9@u0dMPZE6Pd "Kf&iP&Fbb=@ ǁ2r)E.P/‰ UY%JQn={85YX+aEw,|h>aXY VmrBdj^]#/WVY#E(C0I%!}**ɀabquVG:ė""!4KRZ@:CIC0J A0@"3F"Lߵ1R_R2:U@ը> W!~@P0C PS§`F $Pn2^~%? !DFbA!cB )D3"4FC^1ҍT/p!tE%B@m0iizpT%BBc(~ /-H$" p2R0u0%9!a6'gh3@ '@M i Ou@RiK66?34@I1c CH4XNNt7*OV33YPcQI@6#.Mz[V h= fr0HR1Cm@:`I=[jq}'R`?q[|bT r+)e<rn慾74Aj8'n."(R͝7UC*Nu/ @6 $!4Ur%qNIfW@IT##m4K04d4N4 6VS(b}afkm@Wp{CrV}[NP5Nz0'M2D#("˞(1K Bj06NN6kI~OZIPk~NWIWffCPI6~NNPC~C 6:eeaXXcacXad< g eTiiiYX6l8o_5T1CÇ)PbEwLB8(łE(\O6(b2 a@% eAe0I(@f&LȐӦFhѢPfq,ԧB '0ZUD*$a GAڠ̕P#ВWDP?d 2Oū0D;K4^&r Դ, Gd,rd>ǸI0Fx]dg;6@#tإ "?FmO -OiQD@FdRE }0w`%'ЗUm0D:qT0`”SF% fd" V Hx{L~HQL0ax]T@PPjw 4yL{r3itBxTdf1CE c1!TEv FL$ uXL1KƧ>OvfE~Npm`Tmv[OXC8-go~YZזU)w56d=%bhe[hn_jMjƜ#OnwܥAš72`0k~O<~APC_`}qQƽF_0lH^:@!TKYiV!J+.6*Zd{ Zr*PGJNRڴVHqe/WNWADh0!!Gc kgt<@x=)^<OuW&4&$OPsOg8j>T(bAaRHtRLLK* 02aē!Ree. &ϩABf-Жf8nQ^cԸL.Xh:B)H j fq F10A&CJJt.@ƟKLKD)f03wы$mZsҢ&H8ygxa){KV"17RdB%+)"NjLd*K* z750`@%Fp(/ˉ6%THxI+fkRa  gy(w/tG{2?~ҿ0h zxx4I)$+tM| G<7Hcҷ>S$UXB?V)I5@p+,ICq26HȤJ肖D>OB,+KIإskIœB!RkLZ‰g UfdL'dgz14kpT|&kd2 3 Yd%28K#fc8waB0)bNPgЁ?r\i 0KhznB$,M??ɎtjI:@(Ϗ>4}ը:'P!pBp BPA XC45X&TS 7KRf JB(`:MC~I Q$˦j> ra a  0`! c ūG}!yJ+?HC!4dI I+k"ӸāC3K vE^4ѡg>Icr ! 6W\ ӈ~pT 6X&``RH A%5d8S0jyKSc$<g0Ja?8 `Wr3Q g8iZ&}QGmXL`!S=*U^E$!#@@CF@gphþ /cBP*5Nh$ 2̡Z p<;A # N<}h$}*/b@@XU qFL?x1$ 04#|(qO ?" @-8o |&K&nLB%D2?X&_^kf`@޽ќfjG% ORNܠ/K'(BK܅m~CeqWТoi[썟m0 8^{!AIpc-.7Zp>~a v0;7?V [@h>胉Pa&!v)Av^p"kg\݀`r veFf&xtB`Y +I`fh!j6p5Wц` @@Ѐ+47d@ {(dp+! eߣwg Qfk7{ %lge"FPWFP@* ~ PÒ` p^p5 ep `hfx5f(hk + hv-`+= (9lOpPЀ-5zˆ 6'IpѦ՘0,kB`UfI [֍nИH! gp5c]plƄmyFe0%Y%[Ð_ qT!qh|v xz+bcl(`p-=v& @sX` fv`HuXju]uQs; )`H+vk 8klew7v yx e@r5pGyvjlx' ipl-II4ǎkdžvWl4l6'Aj X(AWPw Sj%`n3Hyᷦ(ZmZ6FR19^xlZ u ) qjkÆ@j,*%0{`|hkpDwXyP /a|Cp @קeS ∤s3hF&I;@;J y%1z!xBࡇvb}ɩ(x` pY<D Љ U)k+j' hx (gG*0kl Iuh\t>buRxvgHȯ?ָkvy gz  а60{ pz95:{:˴A`ix[ z : z֎:DHf8A{ÒE[֘  WFp0 0~HH`6,apRr*9$ y&uH4׫-+k 'ADp9j4aʿei3(Iy<p|Q] )| gpwJh׈ {k m;{먬}:uz ?p+Ȱ9xDhW 9+Go(`z,Ҡ 6Yn઀lɺ6YmX<֨k@?Bzpje홒]By^W=L*0*46{+}/qt@gLph ) dYc adR-d ggjIPF6~PffPZZ~66CAetID+ւ+ @ep`e )D~gf@1%YR3D?`D6A83PaC) t>0AyP h1 B@L,+sPmfq'\icfpF50+$-I-hw@%JX?H,ep'UTmX܆UfXh Nm)@rѥ׻w%~P@@jaH![eC@9T$]eFz2@APH !ϒDLCfz*1P\ IP`̒Pj, 0YXgh@I<$3؆:b1%D0TL+WA@gzRt`~$a Zh;uS'1A2tuhA8DT C1& tAV @]d!paPVaĽذ# EL09<=l`A v9,/N·]o0&-v~XҠ@rY;C\q@ & it4#<"lкTPZa00`# #aAM ́ }@,2< $ ƀ0H BApPKRC`{!*z#U|+xWR>R\`[Үy򐈤0mpCBAgM.6S++c cK4V>NC]Ymb =XxĂ-~ #ՂdHL ̑f@ 3l:݈2 l*tL.\Q,J u ^؅(@-Voi?o-, uy(u Y? %‚}uPj 8 iaa}_l|P9|B hǩQ ߔAP( ')`0 ˋ$w]ofxՂp"&e] shO Hd v5N.$"xf ^FUIt'PIz 6 0mް1ys븐}C&)8~[ͧɤq]Z?^.ܣ˧P 0AvP'Wǽ0.g5 ?27I `Bl  -iX#4댸 Bը. ^€,!`2wrDc6%S໮8,zcs\[b4{ G`qeaUUIQYnor]h,17-h<%8EK'<5 pdc.n4a#{B%hCd%5]PjEPA~%*sTxCO`;F4Kcq0iK;>P6eZ06vl ewRLȧ=dj8v;Cu7RL7>EG766|^z@h>wrV>2V`Kj8_}Set!~8ja$z06GTbg; */S0MCaE&5]<5i]NcOANpq$q࢕@h^FE04N (hT0pFD4bU\?oGh=T=162euAmCR~𐂣j%D5H`5 nR#0d5^sܨvyY>v{(~G6 `d#s3v;ړ9iwSvAŗdO%|}~A};D7 (8^*CO4Wcb#=t7mi򧜛43v%C Ӌ"}|tegt0k`3_g ~j֏X>`:4X֘_d xvUvfKmkugI#DIv0 0Fa :<1> F Žd(A2R;A&" 3(rIpB#@3qZ`80(S 'c N5( k`vSȃBplIpUw3]0y v|*fqa@ p:S>=IrE,EbqOJ=bC8bBT.>7 ypw>>q50 : Fa0GR*2m`<Ϣ2 )֪ 0w\%3bʘ c3 `F) AM0b#>,ðP& Hrc |#-DX$pyj{#zP ھQBF5 QM&eة6aژ1" |{$`*̰ڃQ*# 9GbC }(XLTA0(0 # 'x2q ޒSp "bC@k$e3>/W3̯VAca6D;;< >[d!7b=*€* *n -gil!Q*=r"mm z~t`0Z WU/$E MKS+>>+CLq7"8:q8KGw3~Q=HGDHsDz+a @鎒 XnNĠ י(01@ S Frݾ@W=bg`yrg` +()`;(x*&>Px~n0s ֠@a Pq )/3f Кi@xg&bk !5 `|w\">ϼ b,U0$$~@暂C kB3T׽9,@CFa *&0n e* ) @ ?jdzccXcYY TTe T"K u~N~mfPX+)a6fBfZTejfCO:CIZZ@[+Il xf0N؈ +qC,A #֖pyNb; 3SOgڀIBz5 2TP& 56̤gn#؀2|! lX T)-?D-2{\d ~6 ɀ 3B(k+}Bk:Ɂ *P(!?ۄf,g:_o 9 ~Ӷk'^9B*۶- ٴO ©G<5"K"CXߟ%L,"(|B + ^$x&p"(ba'P+ Ģp؂.KmLm<@0\X3+ŭ Q8&p OQ 6[i `pxco٬`fɅ7 ؔK/ԅF'(AY) M m |I7tƥWPR,>M3`DHFDTd`kvlX]BfVHdLni=j [F޴qB> @A#HeQ)ZZ:fn`Oe㍕d'lވW7Xf7;XpЍ fi|9mneB<&D:Dd4|α$!} ~" %xŃN(N{0J+8BІ*c0 `96#^7'BjBZj>oedcį:a6SPo0@q$9+Za@6rycuf :N<";}x3ċWvҠ}K'% o$!9VȲ3<Ą *!DW q膾lf5* e4eHLxx-@=|hb!!D& 4FBb' ̇XAd񵰍lx<^ x   (c% (9Xe R@H I^ZC 0/a?>T2d:[1c@HE7m@@r 5\RHc6kaWO1pJ(m +GVmᔟ@=c(c2^YK@Nmd\d0WI"ʈw $7x @#-#@eo]B`BC5Pls""GBA#9 WM1V w23HxXG4Ӎh!<ST:',kd3g1R(؈S_d'$`9lb#[ˆ; kZ dQbܨ+IBD6&ـ P`e % x&&ȕ1A!yw)1d5C,+1ZJFBI8SӐHu FB0H@@d+I@$S $,W$c5T@Y])IHg5s2zFځ BT(0 VL%)_|J /Ãq`aB4 ٥1 WS?+|JF+?Fm2™-t OI|x ~,0riDN,❱Eb@r#,1hՌ /F5Gvc^׾"Y_ƍ v C;uɽMl S2p.Q irY!9kB2uY,\kۡ'`RAxBXȑ[0ba`@mPQ TH@ 7n2D&[ -X_v `:CP! kk ʨ6a9(kS .zRVGv5ޑҐw;rN,n! |`TV6M.Rz& .(80uw8 OI]N2{;N (t '!g`^8!2 ؒa{v7cemYFK^t py3e>w%8V6!sU3l"8@GfS^H]J6[Ў4"؎p)Y99(;(J_L2$oxy9㖘"&b&H+ Dx'\X( {U"zU8kg{QDh6ua{0I9᠘ vFDOP:k|X4{m,'baxp:)@p% 4z4)Yd53fJ^[hDvd7GFxDƅm@YfG)wVb%PhrEWV\~ֆ@xlyh`ٔi|8iX &Y|^fOb$6Y3"5mw"6_:5*a"9wddf4r gp}T`KÉP `}"Y>$*m''8<"2{ꎫ*zqI3Ηȁe3Q;";ĘHi ǜ졥 j%j΁ZwA\ULv8F؄ #Z j腢Pbhw{DTgV x8c7^Z bI}* *[rZX" GwrWfAz'ϖ2kVM3mk#[l[RGf H4K` 1K 5WM4$[g-:VJV1 ){,)"AZRD4&d5R/*}.}6AV5XU!xr *dqieI=8ۦJA7[};;" [ [#t6WG,˴ౄ۹y䲑*a kr4ceeE k7Jf;D:o-Д=wWgZºj!w8zxoKW 0w5G'WTWu"[R*@:Ѧ; [KT% iy^ c`k3tkۿ,+(\o rtG L w Fj`$Z^k{†Z6k-ܽh"J̸0 M$3F6g]ww\? ]ɔ\Kb+iW{[`l6蛻/$kk$c b\Iklɿٻhӷ:5jڪڂF6°-" ;%::U]<ȝ0Lxc=ge[u5sغ"d+6DoS ǭ]u}>d^f~=Z܁;Xgnp|hLiΑx~SmP Z^C3yF8"zFa}@5= `nj:h"@0l&#k wAGުZ.ҭFK|^^ sȜ _.|c~6yn {x*`z >-d.@_e><5 4 xu~xN:`"pܝL 6{,p붎pj-0A|,?+z@J !h =:OF`fH$ ȯ.C+}є1W #Oa I_>-!4 ep<;^ `AD FoޖoPXτNV_n,MX"=OEgcg6glO.꣎4 _VⳐP;hd_)?쵛 >Ul$5OsMgn] TTPPiiZfWPj Yc]TeekiZZOŕɘʟ~ff֠6ieT XXcccdaXa*Z*$"K!0@#X0Ɖ C餤6~,B\{ ݢKgJ,٦O'N(RdfQ/²<ʙ#EZ\yҳhnJic J)BF_1&p5zyDaIvسiضi|m`ȓ-lQU]S:2`:ů5? |O۴^,XĨG?,9͓E1tʠ'؃i1PFma8 ]Ͼ ;v(# *5=rh&{~L(I FÆW @%` 6ؠ|3^&G;ҏrǍT mqNDEDŽOAn*}&X⊀vjɘ+F2 e~gC,Z;#V-yi[aao&qkN&ft@DDEOEG0bP)~b DG,O,B,Tqg {,\L$s,1)0,3,\8~„h(m'.n!JW#!UeOFN#ZHP;c V @eh||5|-qŠ`4`6*QGm'0Pw[Yj֥0vi/p<$y/w"<{݌o r[0 W&x @ ڨh?V ,*VBSD/]]ACXFyHMu$`@$ eXFi` \ȈVYrzÃX)ckVRKg*Ebog"x#خ 'ƈJ̓S5A(@jȱTqFY iJ2+(! g}BdYJ{L;4sULW[ۚۻh px_k Vr5bzh+YZPsJz'h&F 2H!`Zr" am?;}";Kd=69N xNDmӌg]V}XZ |^Qd}Jo1HGNy+dl-P-\tDXqzHYa1\[i aG8ٱ  (aܿiZ[ڬڮSTUGdAW&]RřMA{ۡۼC]Qt >$C̔V =]}J`eUjTpu5$K!J"Y)`\P"5S5wrugiYMP'p!6,SBY9 ZP8:A ~", ITX">".$*<@Ti0TP7W:~ Q:<>@Bm G."6O,BT^V~X> #\81h`5!a2/1< ddP-{Ō%}쬃x^15n a 2m1 |#cI3·b7!7@]:p!O@*:2@I3^D9г+Px^~AOO , p| <~/}>5}/у, ,1pyk"4 tb' >$Eq#t&2$pz`=χ0q9Q$^68/yq}hz'H{ N!ي >Q$`%O ]5]0l;z.ּQ=t-* @ 0gIkcuBY'lDbʅ% pтŨPO8?:Nz~ ]N_$?GQob> J<,zެY>eiQrnO Ƀqvot2&wh){Л l7kP{;kBlII6mImOPPk aYY eegj0`0`tfTTT--aOzOON``fZNH8~%M5 LEf@lRɴ@TNz%z[ޮ{fH'3<. B&QGeوB)xQGC 0 $cQTOfQv\ԈLԔSaBJNTe@"xUW_%pcb ft\t ^yL^_91 B\v`)dihlp)teZynYX 4JѢ)4裐F*餔JjJY`I(aA"8I% XiŕW8܎#[@5$41 z-٤| lS6F+Vkfv+kn24q+k\qQ]t1 05ꗅaՌ^m&!1^Ό[iP 4KJk>f.W:p|['mH'LPG GTW-^dGN]`SDMYlpts tǽvZ 4׀}[]a'Nwӌ7G.'L[~]8AF% W7h#P^ ~&,P ?& |;|d!5X-ūBdc\T\$i+>ɬ ٌHZp5o9pk'3Z[6Ǵ zs,\W Rq(L!Eqmkl(F,`~ ` nrc t DP +Qd29׌+0I!P8tb!@`tV<@ y  p <@?l<2B U֠B 8` 8k\`m .(and` 8&O` vp@b-r㴙hBml&;I;r؀5 1&sk;P .mkSO A> N4+C= hM=6,{bPƧ*5n }q(3tNKo@`<0a=qlmm/FMI_ۭ۶#5G85V [8ue {NV \v1/ܒ-C-oW Π-s=}Vl7С9gٵ+8FwmWրҢcY@B]7W>PMG-KJ~ -UfP:j%h;[98W^`hk;+wh|^8TVxW:,A~/ߎtwKkw%+;D$wU޽xպۼo=ڽ(exe'h_AK0QZ9;ܵ%rCB$"=4(t]j`F]5!jy$fU]p@ZvAvT6:fwk[vvVyJwknn,fk)7yvG43@xx7/`vxW`Kpyw'zLvP:5h0yAĄWswSJ%pl,,(wsl`5X{`Ȃ{Ƿ|؇~8BM C8ˢ8WF]Et<"2` x+Pjĸ^`HHmWoT34`vevwk7yz0lfh4v^ YG4{yz؏xkY^C`cxayWynyX_vgA璂29|Cl%pe8.ue^OS/= P4D7DqOي3D;>DC1Fts?&X]Px0Spi`%_v8m`5/po JD@i5XxL_`ȄN#džO32`C:GHnESFbGnY!`^lAƙ`B#Yrx`ɛŹn䖚ْd4WgA97D˂:[Dy<5;xGC1#:a٠cf&\) 3ؖVF@w1#R$# ^TP$Z_73` Ivk(TayD7 ِ6Ɛxy)Jt96LJ xv YmLj-fj7amxX\ ]6v5d /1: :$O<qxdן&C%D%\efg)adh<VRZJ]tYb6 |I  }2HO %B@$N5Vjw7m9&yBÑroƚ(ũo tX mfk]za67aed`vUv$& od~:$[&[9T ze5ephZsO/;H9;&&APÆzMYG\1Z8 \ c]FrXL G.Ihy~P<hvxIA/vxCxKxoиC87zEh9zGBk`k_{v:k$4yfW˸; K/KU/;;KD8zI7E/X%;NWY{؛{_XsDYN;!OdPqFsq$pg($0վ({;PGx#fX *HP3!zzFa˫dkti`1:6?peƈaH. @TH6ãB[@yV%/G[{%(tG Jh1El ī2”G9Ax@x[/J@@"?:fv4vC5PcevCac&409Y#lԽpnr^N1@nj,խ_$e0GOPsS;#=Z OM#I[O}_?x?q&$z\?_tv;1D,kg_j$<??Ń;ʟRa}e@ՏN$>˩nO;mf I0\hM* >U?~ZOI+x[[_^'uu^[lul^Źžlѡpupׯۯ縶lը^^v m۪?_*tȑ-rZ`a h+Iɓ$5T˖$F) ZsO@L˜D,Q0‹iHJT(W`ݚ5V(TŠ cfb-[3f&inػW߿~Lr+crLd˘/@gfPӨS;Yͺװc˞Mۮޭ1E&)F|K^>:ӏN:'kϿ/ެϨg@ =aȗ?縩@F -.0R /xс& J+5NM4XAƇc5TAB8,SPY"U\uVc'YhEv Nb Rdfk%\O>i]X<h-WZkV]ihlM5 4#lHhj(lmj~qSeiA'_YB~s PꩦVhLdFL :h뭸j 1S`1@"P#uTRK5TT/VյWee#Yd99eǣ_W4 ׻+/lpBeY'fTh^jZ,WniTJU';^EX$?ף1|ߑ%ZܮTw<{QPqXS08Y ( SWVg5TdA_]$B;@XDPB])*վ^{# >F0̌GGN0sWNzjl|aQ0 VP1Os 2ʫ1lhk9Q.|YV6P3O]hh F߾/o{'aXp͍(#"PZ}Z&v#͗e8}O8׸L,{X:ǹ&L,YL|p )NgPNhj::<GDM:(uN'X 4tA @RI aLg;6LwS2X?mX *Cj"҂e,cY˩X vX5\h5`eaJV\Q0A! kHDӽФ+ ι~InPoRl!xմ.IZDabGzgTIh4]gQI#7ThV ֫nɂ3v[*7[lk5*5x(v*Yu3iIM gcx'6,a2UR#2N6+ZZY. ۹to4:ol3PoRsq8\j36Qu,8=Fk9Qr<2f蔜ivA&U&;׏XiEH~cDobz%ui)&jـTw9xɗْ2^4xSxOA9Z^U1hG_A,2Tٙ7P9t~D$UYYyp\Έa6Au؛8uiƟW>s)IZ 7+yZI8c9ua6l㘂C okxRs4,9yO~~em<}~IzV2 9c:j,yU:8Adؠ30CKw-_tv0v̩#ġ$W_4ve,$}%7ݡ`X:9aaMIB׌])UG9JJXcecQZqy"t9wxꖗ[ٗZũN&.jJ9$_p*?&Hns(!T=OP) d EǠGb%!3`u۱ D5(W11MGxZNQ2&Ibc3;7{~/o1/kplW㡨`%Jh`;sM*"L(c>HIX4b;c:C!(HBz"g.P[x;fa_Y!Bjk 01!< 뱎$ k+n:%w_eaiW, . $0Of5[~Ӻf/U3f`)T5pILepaE f=Z[k],84#%4#Ud;Rg > ٛg, H6(;js껾۾;U-\eʧ||1$<\|LB aU f SOz!<L!,/K(<2D`5s2IZvq!$@'3T@'֟Ij4"~T_Q5E֊$*)狾{h\u7Y MFȁz|~ lf\o2'KL*rwwm`\ɔ|ɖ&ɴ ï.4t00<~eK2%lgP+Q"VZ93طAxhۄTmy:Ի PZ$m/.Ucg$GptF% #Owڣ$[,,V1ff;>ƢT |/ DQE.O@:pE\:r^\FoK کMmF'L1}BT({)pt`;0`X ǹgi nTsc]KI a2?~P4/JqĄ]*a,]@q"jQ9acW@Ue̠.PpA>Qf`ipZ`0$x3w0D"-Pꅾ}(-/eplpr?t_v `>qPq@6.bB*!O \dT?_A/a @`/6?d & o/ [AA[l_[[o[_%[[weePTeeTPjg)^^uuЗԃ/  qRXXR)_p슡_^lՐ%# D,Qixc4 2@x A (S\ɲ˗)SX0AD&mbEF(zJѣFIҤO-HPaWifyկVG,KvgӢ]-۷n )d>P ? I`~(^-(Pa@eHXA,]ީհ0Sìɵ85aB /j/۫4M37n r.B /'X0z6M0_$1 ǐsB2Ȍ:j^u{kaA$R 8# @bR &Pha^چtSu ~(@$V ^l@AHB =XD `q4 D #)DiH $@\dxDRXf`;pR 1T`})fYfin o)tީgsdoafhb1-HFa/[pYAvS #pi#T!jꩨBjʪK#^E+r0+뮽l+zp +l zT@ySAUkmVlV0#N8 @Vlqhj@ ,0Fp @ t@B 54CMTEGq¸gI0U.)CQ˕Wdij@Mh@inUs43Iv,TS5@w;P@"V`*XdUv/<s8!,PvvZ(-d@ O37Ī+ @,xf q6 [߻@`9z\= 9JW_-_zX rT!X(p!vf%WPgUd~ lqP7p㱌4xRjdtA oo]W)`FJ%$ilG&dLKD$Y){I ߠF!l9[v`ڻlyeBvvJY' .N p`aN*UJФ/P|0HZ|E&rNrT` À3R~4u>IF9 sM #`@@8.^JK(0 R: 9"4F<*cQ%giUU,3\J &RF2`\L\fCon4KS#a B,jgzT WZYE 4ti0h*bu*D25Lki?;7dNpV2\U`%``:Kt?.V' kZ 65R@j淞֭Me)&aVe7bMD}z׭` `&jI8_~3j/fǘ, Sj 4- `jMrP~ufM(_*X/NܤXp%C6^l0GN0A(' VKn.lQI``J5,ETW Ղի0=+~~%kpb:VŬTXgcԠ+@J)f8bAƯ?ES!! Z- 4 z\׳n~2 X@9'T)W3jq*//7Z3@aZx+MQMo~S [sb@(X6,SqA8(6v[wIJįY8R4hpqF65p3x0cg-lTf%E%Eh ;X̕X 6N*+e21S3ܸ+]_-Eչ)8ƔuͤK-.[lΝ,m T:^imQEJ,|X@э_ Bĥ4';fjr+E_Tȁ7ƾ /WS 3iM >dc+@X2!x F.i$%9,g9EoL%j-D Ieݕ+ U0:qqgp 1cKeK$p`fPN>@}U9u]l{{E\BmUPW^-Ʈ&S]aQj\E{' f1KcXhſ@FKNL16cvq;ep=buet^Uʋ>E7nUxdB/"Ab-8|-A4U_+Et g BzVn` KvʵZU]Ƒj'1~/K3a]Ud'6ope<̖:g_+X$DchyU[`gOW C S`e^ewXj%._4-C }ڞ<1E"n{_ldքUrOJ׊6e`3@/0'*2 GY3033ha+){(?&[P_fm\ߧOgPTƦ%$U55zXy ?z%A # A 1/#AA8nRdVRSqqhX+"K #^WWijWONNOgwΞA% #A1ϕ8fN0OZOOV)pĩPlA$-Alv$LTQGknuh[s`)XcYQ @Xb]}ĉ0qh"ߍ=;'a XP0& КW_Q E1x"Qy[njl/|"^*g(i7O >wc{Yɷ.S-7uPHAU, BA]ox+[NP6L%hc# :@ڶzWig2qF33A(8NWrȀ:د A6yIc;CqR8` 8Tڸ&dK G1h<51y" pّ`f8 0o $ )Bo,#<;s($IcT`%ݑ" Rьlc)7 ,gIZĥ4l@'T|SaYf.|3IjFɌfV ysgyH h"svt0E m!;"=l; `@+HBІ:hB Pd F'$PaEDGJҒ(}(:ݕ0ʢ>IJ(cVa!71@ԔXRMT MPTJժZX*/4,LJl$\hM+Qֶ5pU䚝kjUwm@o67`4ֱ@d9Y²lfxլF9 C`C(o_dAiXCp+M.r\ e-@F ͮ=Ȥ xK^w+Ġ󺷼u/tuwA`(4dM#iɘe҃>O@ g(`3L1\ O E6kXC< 툱g5l8nG6c@6wOd De*w aG9!dhA@2A|Ȝ0dY 98-8>ٰeơN \xbs;(0$XgxiBI=₮ l$3M5Dox7MK!J{^wכ}{. fz2O4˦-3MV(i(p2BAO5=02`t  kBכ)T G 8sj{$|ИUJt[e(˅e {q397c(s8g!c 'b`ġlXp8Ϲw\a;dO1N?!`xLXJ0ON[XL- MuQ8PҺ׮vݲpIdzHd0MIV橵RLtO;񌟀%y0Lw43^;.xwvb#<(E JL2NT_S>KfR6ȗso)g8׬ )j,< 3O۸n-Py#r6N~\BGULle 鎞ҟ7|wvN7oWpPs'v[F6ltWvh$al|V>:>7|U$QRDyyyyo?q${6m{TRԅdZV6V")|T|rwq|drg}ֆg}5}a@g8~^w'N8ws9'*:pYU`tUttp “HB؉huxip>w36C!xq2Huu~Ћ~@ (v[Z7k2FGl3I$DpOVqKSBSfrŇu~j&WqVrpv}'9gMg87gs(yCQSTD82؋ø`3ٌz`z(F98x`oAAdX|5'}|{Xs(~HN]|4wXCV19E: sSАHWYd[ kg3a٘ 3 Y!F!ٙW&S,HVTV+nRay; 6aFavnY]k֓ypuxYyS,qW<8>a`o)zFX{(gadP(rh|IsM8~ssqE!^⒘:Zz3Yr :Zz*&> ZSɚMEy;ynFa0ZnyaYZZה郎Ti$e'<KLKdq&cPgYfIf f)w(~%9|&N78:x鞗9Z|:Y[fѧC-ʡzz Zjjܸ>HrQh(:Sj WFHFnb[Zk[)vx;U_6`:`W˙YgN 1ǝ`fwȖ'ږky|hf+sgzy:y)eZFGq s 5kZ< J(SaWa[HȠŰƪ ]6Ufco6ڱ=Ue?"Oڦ8a }h cJ߄׊=k;gܚ*b JwXGX$9v uR%}@#˫{Xqs󏘫r6﫳:?˦ڊ:+ `>ˁlu <\|o2@)1kӚ m,.0TLx8K% B?;g|؇iyy Gkp)ws*\<h-^P%2i !npqSGs|rox~ǀǂǃn\Džv67#Ug´t`ɘLɜɚt0uz4<|kC?\|AI,yĽsg U˾'~~\|hh8h0?)F&)c@c\>ؼ{d$[҅}҈]Pq's*Z4$44. 4zq8+8>7+:1}?-UZ}:q pԸ`J 0 Ҕ$o^rnt~z|~>yzFш>BFeP/U{^\f+a+ ꈾ.)B!R誾[q$[زne?7žX+NŬOǜhGc bᗳz^~؞ھ>^n蟨]@1ޤ/W>%b.o꥾ojӤ6< Tb,IOҶnQ6}+Şm"~Kg&oļnv:ūͦ_q1%y>@B?D_FߘH>Mœ,F1ײ)6jX޾φ %*6b<k#npruw/- sNPMsuڭ}Y<=Z_ڨ/W28ڌ %ۇuV;`)p P_0)خ?_<<@O/e{җDDQ?^rh$Ss_{_og:'VVbUURqqbxxobyybSxr"@ /l )r!1&& 11 # # !#!#Ǫ 6)솰i4A"E2fƏ=nQ !Q4ɲ%K!]a 4X H8p JѣH*]ʴӧPJJիTEhʵ+СB~ ;,ٳaӂ׷pn=ܻ֨x˷߿ӃÈ+^̸ǐ#KL˘3k̹ϠCMӈxX8(;PKo}~jPK.AOEBPS/img/jpub01094.gif,vGIF89ax}???ϟooo___OOO///!,x} dihlp,tmx"pH,Ȥrl:ШtJZTbzxL.zn|NG~ow{\}vxm~`rkdݼd\c\& ߄}C uy7\ )I0@! , B+WX0\)!A;'84RA]EMӟ,]NH@ˆ+P> 0pB"(`pꥑvq5KΝ|G~Q;@W"'! OIgJ p@7i^=R?tTI 95$0-M8gqӲjZtCm#j <꜖C\w\I;xϏB<Ћ/AUa?S]`KYJ%`;ZyDwA/gUFqVUM~oE\2@:5TZG uYQОExʄWD@@YZՓ!Ya @-`@^E9 `BPc"/va P҇DRJChе5 X`fLkzѦ)oI :_^dFh*O%`jXfC򈠕iS?N#M]G{^]#:vha̶P dXDaVY a=8i)G@Th*gTh `-n⠃zd8lj:樁;n +Cuͥ"(~󀙪.(p!a]zM=Yƒ;SuAQ9 : ;k8ay,ZV_$ɣuVe"~Va\ \1Լ$^ $hK;Բj }ILRƵ:B[ qź qP!S`Q谇Buyڰ11<CQmI{^.M.HUkQSϸ7{6IӨ8$Ѥc 8.X衋`%ΐ!GFTk Q'0&WIXdL.u&/aL*ԋTLH\`-;VU|quP b.IJ _$kQw7OwܣMs O1 es"f !oݜO͘M?\7T#}~6Tw*c [WCsw>8.EYQhA̖YɟK:,7awt2=Z~)ÓvJ.= k x|2gudE;c%H~bjGX &7epry xf$2n$`PdkS2a8(i0u'$2"2\)"M1؀GiǐC.EoG 'qtNx3hmU}WhpY|[V]H|_ H1`PjZņrHNPpwCtv!чO$|y2Bhsq7J:X (7XxgEk]hko̐pˁqٕ s (G@(Ҹ U#)ʨHΈ*R"obo;y؍X@| UV'3) ȇȅ*c'AvG#u5@$WА`V9quV@ƴŒť 5 A'Cv \:x5@ɐԑ"DT(IX8)[)@y_X5W! GB]fL PeI &yf]uy\Ę+ЗmIhuC%Iz٘pٙ9ΰ(;~(1HI`mȚ|/S53mp29 jqn//dF\A )7otaQx\1 Y2!2=ge0VlNY3 %*h$2B(I 7 Ud8][P j`) 7U!\B{Cv*[ᓠzࢂpIBQ6O "^A؞}Q@$t&ߓJڟiթD1# j , Lj0 1l`*-M l ul1A6-0GEhل N< KA^@"3q| /ڦa` !ncpP)}j2:>b ʞ !Mz3ru[њ`*Jlp&&{: tb^ P$]zP`QQWArz[{sm󺲳ɪa PC8 { ++; "CGs4z;"-K+twDfG*2?"+$-kY4r0)^&91Q69Rpwq#^϶Kvu{}K0;LϖҪ(qr/H Sr;E#_=ZU;F!@,lS+w 2rCoJČa̓FqDjעQ@8-j@|lToqٳ%ء֧ EE ՞t0}a-eM-\"-ț=(ӣ6XNJġ,a&Ӽ2OV`WbG,P,j )ŀ%g jkw'im*5j-B VM:Бg ͷ'lOe*ҽRΆ:2 ~"=ved 2I!Wn/jKS"6N AȤHK/[lXWrՖf*z)@|3bNҬ3 $ }$Zg#\=OE3g&cE 0 <|7R6cfM83 DL~3'T3&x =0-0|\ca, ہ q"71|{@PɈX h$EHTbz( d!00QP4E%Y pP b,]e((fvN'vaẃP Vz8Q'yz5c 5`тXBjWF* zPip%F9طvK*N,+O:%G(miБ$qUE{OhbJ ..kV.2 /3Rjb@E<1h{D>r8UV%$31ܰxRYZe-%(I@B4f| i*poCi$4j_O#Gl){A;4FAaj 5=y D+,qj ~ S p-2C 0P/๐` `wή)Nf0%aI&^x+yÜoI2v0«N7Ë{fA$M:"Nbx<_5ĢD:W8"O: b^Wn0!}J1 ge@`Dη|cZC0&LlzN1-!(HHX&ؓ^d^W ,|F`#`Mh#Wg& f@$>)D( A%@Uni$>I8')3gi3I#\ " ʃ]\H9&y7xE|CIm*AdM4A-9⃂2Ԭq\ itU|J(qūpˡNۉ(ILVcMpJ=VV;=nyU֡v|!ց˪F HHh&nB%@S"̘d t fhIJF,HEIMs-! `CH "!Ex1tH`)!$D1/! '"SAT^6#!6UP#D69qK8@C?0t Dl AԚ~SIFbjeZWam8bDT!Iy T-K`V̤] 0`jTJҰ]0Si- {*ôM-kQ–=@k"r]n[ [ַ- E $eLf$8.J{6q*Va$ 2%^E.&h?47cG@Jn O CO&dKVC`\ 6+ ddf 03f͘a9Ӧk $~ ZX m* fI/Hjǎ C6to&g QG\#NΒ,ҧrd"8H?,cLC@@DvQ8yYab,ͻ@Sh(P 3Iw, a5p^Wpұ/3C"C5HJݧB jNW mT-0aDdCIj'jDce{&r}I:kzk0m>Ք וֹ #ΚSBdPH- Ppzx0`D;}0sB< q&r.7b,y|AhN|Bj3\JI aRpV BȳrZ b = Ps<"km\# 4TCX@Trr)u7/7F"> Y8U u%=d?{nۡK\S^sE|2+uSt>VDl%:v">k7Xi(Bu{J~'TvxBpQ--66=Mw'eѯ~L`_lgB%S ` K2]:הBzR` ` ~`` noD0@0<\lX]!Zd7p xp@ VdL6W:L f`dHЏTE9$ Qa>@RdbHC4ľU& %K$;JzCT7׾X҆lS9إ-PVY~X—T"C1RAlLX^RJ%U*Bˌ 4l| ;L4mL0cc.He@Do@E&TEe:@YQХ[m djJm!N(Q  &&jX ($N&i2 "v"(2g@@)F k't8fCeA4]K՘˖' ,p]6|A,Z%Lԣndl>Tg|l }Cx2d.5̥xeL M(̊ϴlDb:n X ( |8 H^Bfhv^ހ-GRH烂_¨]> U=@܇6ÜedNNЫɌi&霂SAs2v|Rg֩֠Dˋ&U" !(5FjAtF^j:M!j'*j ''Zʂ靦!,) /4*/Rez*+؀.+',jC \K\1jROQ5p9.|"A xFl֪R1&n7 QRGV4F5\ZB*vh!Cjno +&*ҖQ hB ll2ցx,:c{H3$,(ZҫFA[?;d 쁴:(C@AzE clʊ}:lP؈ 1 Ͻ)lFAEJFxm&)dDS. $E"Ӏ fl:f7F45U-‑BR.:{2D3JiՒdš0DOXo ErlRhЁ !T&AҮM.g+ko^l͌\1*0V1woڞoh| EN2qΰX  l mQb aOkFt /M} 5/ 慜q&{7PC"G"<Dь>0(ZjrrrcqƉxE*j  EI/ Y2 +5p ,h $@N+H#!S(r:K:N~&3E&)~>\57R?1>os+&p&{0@2.4|n1Yt:K4]sӐE%ZqDI:@5$rRJ7.Y/3LƸ A0mES~ Y9#:{c_IK ;(`]w V0f[s\1K`۪y?v4"(?j[;uB:Y'zXEcRғ8O)"b4ZHa″7=e{whiJll4f7[W%:sUMWI9lH=撓xRxdxw:Cq:9q)3z]ֺ::7sܫegyh:Yx7i7;SZ{zrѸgz8_DoU+"6{iҭ,S:ujszg EC%thP%H K8 3 bؑ,eA&8] ŧx7=z"IDHÔt94E;{x+;7鯻/+җ:w+~3;> ?+/;;JKtwks{.;PKO2,,PK.AOEBPS/img/install_type.gifGIF89aks܇{5Et>1e e Ple> )Eh H*\ȰF)jАHqŊ3jȱǏ CI2œ+Xɲ˗0_(r&$@G:S :ԀQEr0ʴӧPJJիXjׯ`.JٳhӪ]˶۷p5-[  QH?~80Èy@-3 ٱQɒB4rfp9R*Y)K[ʤKOйiʳefoC1"8hߟG}Y9Gny8-i;nӫ)Y |ךnm-lfO|1`큇a)b|tucmYx:j&[Ayp[vZhFh3Jט'XxA6swqaT?$w5o^Tލ[Vޗ`)O7$Pfp|c7 聚t~2)l^]$P 0C`0,؃yWzR%`@ߤ^JiP~.X(~ꨒ駞_AJj~'xF:馫 lZ}+T]J+묹)}rz 5魛tk,]>>РM4eа@ /Aq B@ MPMt4pP`wʠ2Xsiz.SАst >GaPgZ4֜^|fkϥ-1\jTߚM`-nj:7ki.Wng6e\- /́E)j+PypqtD'װAp\ 6Ǣ| LLE=D^C0Pֻ<+ >z@ .UQMbB:hEYh|% <)K㰩d Q SlAaSX0'aJqh@e)† 3MAH{i + ƟBk8jXA7| 8Rn aͩEZ12ud,fs),6hH6xMslgKv.*#gE[u,4@"mAj01~@ML 0PJ@s c0$ȶlMܯɪiId hgIws/ш,m^.0}_R( 򛭷i 1fQzja5p$6,SApQ|5J2TW[A X\x9[߄`+KŀLx岭.{]tʰAbX/(Rܖ+UX >:F 7vBA8) x8 (N.?;u?P$ʔ)W,8*4vMOÊS4.(T)u B@"h.iuX'D`Ňu5NꙊ)8SiYy՛y oE5݌6C[/ITEsix{'^6N.HTXSW4S]m] t is!48_(0c`B l`C7[P}GϥG#Á"^6SMV} oΖhN^tzi=7nF35BQaoc9+j (7O^7^-/<&hzz?}黆w _u *Oz{=U..\7ٌ}܂NǬq$>7lcTs-`/}yX? W( `G\4LwM]Vro6r_o#}hq? 6wCהVTUKӷvQ`1z6CbFls073Uvk%SAzD\bobWcT5u\Q\c 3FXq7v`G0B(pC%;^ AQ 0hU< lhdUnVZ"UW yֵkMy%_QA1TAiW.;Q-pXxsh1fyDD6AWs)yI›#ic("g ɤɟgA엠 zxzp~Wsj=7-R)5:*"gNA=e*:ZzGڪ>ȟCPag%Ц\)0Eʺ̊z1zЬڬѺPʬ ʺ؊甬ڭˊjgdzgʮ 骭Z⴮Z1;[{ ۰ [ʯ+ گ "kn4 rB`ᠲ @67+::>˳=B;D[F{A J EH+KT۴NKKZU{[S۵` ]c{hQ{ke]; oj;v[J[ s5,'2[p P:۸<>۳@i{\N˹a;_[;[[[k={[iaKw˹kc{ X|e`8 tۼ k+Kr ۽;[{蛾껾۾۳[AJ[ [[uk{黴櫴:kU{Л'l브۫w[VUP&|(*,.02 04_k*˴+| k8?\[[ + ;\;,<C;|Epr(NO[ .|~2=Nrp[<8;BD}5MQ47δ%Lz[ S U $'eEe PFp.(Ç#JH CȱǎCHȓ(OrL1#ʒ0] K m̩2F,@I!H-%%DM*f:r P0TG&uB f#UJM&R)]("a10] - AeRbDr!lQǮӨKM@w Asͻž8K\U?|9sΓK&` #F]P5FMmTWJq5ݢ5ǁf^.k2H%"` JAHE.7+M`W!e+Hz"A)hp j@ 0^Șdr$̪/')4 jzJZlE^lQDu]H:ƬR'o[5_[6bTMח]0P@NDy%S4Qs)*z#ڃhFyVLSCȝ0]QPd0iz٬-&`8pe$X0Xqp84Mmx#^'TzNq:ۉ'="b:{O#!rmH@ P}!D@H-h$D $}I Ł @H | PCFc `hN3b11$2I 6x$/5Tg)R-BRx^f,IMRr-t#4=D2FG>.C(V0!sd 0<B؇'z,g3UP 7ҁV&]`; e3PT Bn=YU)JYt*a-eK,0Sv͗]y38BoԦ..T B<(.CTL@E#WEA-yB 2c fXƨ!t\G--٥k~sA}3^k 2q#da8Ty6Cj|`*;ߙWp 0'2(5P%0 _ҭ=(JAz`ñ`l`](vW5lnleQKh)lS=?5C }* 5jY&66fCP`BG!H;E26.n Ч|Et̹uC]M~3,4`K@k ]豮 jC#:شD.]i5rM(Y n]!rX @A1> 7 ƾk xzu7V {". a) }6 G} xApx&ed1 0trl+W@H"d0yix^K 49='/%z(n% !0_b]>20"GLᖺ [R_*$(ۑ{VtAAFh͹%ao+,2;0C" kR  6Ms2{c6-&YLJ'tZ&{_%&D&)51}qdKuQdG`G)^TV=g`+^Q8 ?p 4~iFjFJ0$^k=.l+"Ov0 zE +p pH"f{x<HRGhVn$8g-h.'Quh|"AvĂ)0 7p% (1PX(q@H؊Lx ċ/%W]PdְX% XQ4%A/Ȧ%@3_7$L$$-Q'Jtt xnֈćgq@#P P%E@119t*%YE *P! ytPyy $0' LX$!9hdg,Pw%`[6@pVUG RE{և$K$%ŗs*nyƏrYvYt.xTdrD)`iV~ yVOoX)<62w ?qWO t2]}"D9rDJ8"7&04Qx! iA2;d4ҒQl9|HwSK) .YQƠ."pb5 N0hW&f6giƉx&v`VxQVpVpqQwV``<&}PEkQ~8 M9 ]GX;@v1ҕ_eI<řCCCؙY2=-ՂHSY6)@Qyh+GiuhWacp6Q x\'x#`xZGl~8T180G`yȰHFI+U0@3Xg%x`ɁC:_IRfY%u&S u>6a}Ztڣ7ڛ 'l?ɥ=xd7`GA6PGa rNzwZhcCWqƀu u y Jg(X؇sibky a'_Cʒ8%545̉DJt&;ʩ1 fz 2Pa`_!+ q Q<\6xAu#!P>[7Ygi!ϊb (0c q8k]]`ҭuHE|\;t ik\G1&Z娒KQvgě(qS{w{DZv`}:x, 1 41rk[)$JÀ !V8ne]y'΂a \L)kd |a*q,\F}H.;x2cIh@;)r^T1rwTlơ2lZzv]Сn ;+ӰIT +7Ұ١BzT=oʾ<[;6LGn], 47w(,C1M1%/ )Aa[`ȹʾ9>*鎸[a@@Hh =6 6s$\l]`48 2* ξ^6٤B8lmQMC ĤV Gvd^6* y埡 +nZN(CqͼIG=2XK%M %HD~\{?y@祖o+xW[OompxB;۷Wˌ[_LӾyG)a@?Rv/y/$ &o;泯|lo,'ٛ=t  77+k+U'eEe ڌ㎟饣%tc`n ֭0k& B1fYȱGcBvGR$Ȯe—0cʜI͛8U e\vxOr&(M\ƻ- 6>; ٳfGzCɖd6"RKJw߿)芦10Q▏`{ Fw%,S(W<8fkŋb5K5h Z۶7%6zՠ:sBNأz)>;Ν|?3nGF]y5\6bE!@ TZ4f%F < nP"R !$"uc`6Q( XpYUȀ#Q(cq#7$8b! R:U@9RJUTbw``aihfdi`1zHdQ^E>#j "ct)1 t!H22@h>RZaMJ p7Dх%@z%U*䐕`)t]z) h Vk훅]-wYyv՞z $Z 36c$lۑYv Z+bcn7ZPE @ҡ]LiiH0O $YB,qBv5gloLپ7Sv4eWs_t؝yQz.Q4^t.2WJI͉-cL0,VwL HF|밦+cV$ˆd#в.3(ؖmgs.4fG:sjn4e~s3|~d։*hL=" 2Yz|9$W2 FD 7@H s̀991tp{XctM`S,}#z.>KsQMY  >`4hA:|]u48" Dal&& :yP54> AUP^>) |d†"D2QN#8A0 ;hPnDeHSZ N pBU7(vxh +Vٜ:Ph`--Ɍ+D&JiZ- cXޙ+_ h(EE ka7iF !JC,8&/4@^Qe^ M5@A ('0YAH(9M 쎺pO;"g LJkd u!<)O0ԓ'9!nn3jjFC 2(e9 %C {kT݈V $Ji`U frh`(.MԃQRHQjfx90pF2f"#Z> ,VTA^71UaQ-ZGG9R1aD(_ӀhIZU х1a>1i N ;Zqv/  P T` D-jO֨un׹հi@`p mfZ{t އF4ƪ@LHДUMY}hZ @^ 7 K`DqM  ac#T@+8cwdE j`Zw L>&&3 Nΰ#,â|&AnrTyl,}+.t9W}27g12ca+)Cr?AU:Rj >M4r{ư=lDu!$UGA[ {#*+N9W} ڞC$b^Xd}6n .ϥ`M%2MByQ94?RMYAV#sQ̑Skhdc0VMR'Y3[؂|we*:e!C<whg?5] el`?W_̣CbLM)t?DerŇ MLyF'#6X9VG Ce~[fY7zexiXx蘎긎؎8XxHw7 B ⋬'lv/gq5eƤ(Us"$2t(JJ5b|d\]_C ,sCwDxeXK%#&Jօn8PjK% qpelku(oJ`2VyXZ\ٕ^[ُyYGTxlr%_.WVŕ/el! @)GȉF|"Gu`xwdh;5u0t9J{ro2|SIuƸM 0tlOF0`9Yibwe RːYwKT\DMPf\s{?W#Vu@Mmj6ȘrV_|E{ oUAz8b)\&xfW~.UWwxٟ^IH5vh Rw(((5׹uz2P_bw<{JMt &JRn0M*Ukۣ5hxSw6+o] ~7tQpa(T{(XZ\zj(Dw84> ^gfftu."Ơm b^C*1&iT4R  *90]`(+f!JW]{e6G&r#=c SK61(5Qzbf*B[P7]Y+[zT7fh#l?d7Fv]ʺڬȈaYF z1&b Z>W)*1d*ƠD^1;8l!b+'06E$lˆ0"1#mD+:*-$eƪ7PaLrac%W0? 0(pG1c0c)vw2M?X(JLb X{0v(`cκ<۳>۟ 3Sk"S[!q3[%`W@ڛ ?O$k& $, 7GբQHNK1++`ȋM \6|ZLlL67P?[HLix(;cG8`Ʊ{ laĚQ!I5K\NPaY4|b<Ȅ\Ȫ˽=>0ƜjS9cL|"lx-F ZŢ^lȪʬld BL8d1{Tr ;x< ]UiX̪ʊƲE|0[ˎ-1;LxA{5Kv [;l`J >+ˆ ;u + JT9FPc~bn-;aCv"1ՆK@c+F$F092N0ʔRwb70$)$lJ  =FhҶgi0|,-F Kճi` Ɯd}^jD `UQ =#ree'1 {"M1ar@Z"#o ZU'NN@+T+"ݿX[#{Mk1|hZnxWL8K7KVi}Ƚhmae]=]}ؽ=g n c$ ZԵ`Sm m2+B$*#qF 3F1"VoλWxe=7n2l"?S{ (@`3v?$(kiP@]VWT xk]Fnm]]Fo0/c ^5?u #{SFo!#+l:$1k$7h#L2a 8z =VN 12)^<)61XLTg$u;rІfNN5c( / #nQ4)J㎰p`χ!,KjcPFO?醅Z(RKo>g= _lnp c Э>`(QMFq88#^[uu8sSo.k?8Rh| BqZ#>@؀c C+\ '84Rd;.OOv]g6J:eL#JP= Q*}/ݽ?o`kE_BD87x/*DFy+/)q֧<9zxV+cF ] VVccaa$V++=]ccQ$k^(7cñ$'ePTH`CUDP%W2FȱDz(J 0] nlP ."QXcQ jϒVF%UYZpCi2tKz2wprc)M#(ć­WF! xHZ0[Vp6aӉgKWbwok?~`6}oʐ P][ B,L" Yx=2cX~@خ#EVH!P7 e`@dU %tM8$PB^teq K&:PH*ZXZ!9@mhD MRZRC4!4Ux!Z/L@6R!_)U 8+p"T,YliJX, X<TxJ9^ɠ GM@YOR09t!""ײ^ 0I)"k[ټ(MJWҖb1meB T69ӌ PZ{|HҦ:PJaL8.JўXZ{gKR*նpkf^5Z*XVv1=r/|Ɛb:jt]׼R4|&`7lTyhGKF2,eDO]akh~1nw3vUe][D:r b}KZ<2S{b]g簹%+L ؍|D.xJCmjYL=0}`Km۽/4mW]6 KB)w7wy/GLW]ޔ.wL$JHNYZbE8 7M9ț5j!K JYSTZecγ `yif&y ^7O0_g}Ƃv.3JWδLMSoӠ5z|vb)jMCՙ~549N 9MaO9⣯8){;' #ئ{}݄z<;C-}Vl(z#e<|zN-tl4|! /1tQ|u5xg+AߎhpOVC5v[7@<<7/sc<9柾;ceB fx7ZK.=ٴ5p@vhOpNnqܭ-9y`g@ET}qK/}e'Oyϼ7{Y.MU:x'uۿYvbKXяiӔLЎu؃+iPtfRpm*B}(@ UT)Z#FLB >c)۱+ 5(oAo9C$+"5@N9-C8MQ#5iaz2#T؇hq!(k9K aFAΙi$_x\i,(\ W@X*^I =襚ڡz y- HhJh8@7[{۹;[ !#n",7p )B0H }8ܹi` T`[0U#PPc;OcۇzBq%p"d:{[{+DWpB %Dm+xٯuJ?0CF{+R)[dx{ ,y%jeQ@:) hq-ه7:)<}Lԃm0(GdʳU%-y`WJ|5(pږ$X5UWxBt׈ φĈ7JLabقBdh9&ɜ$Lwɚʤ\ʗGʚvʡxv"*zeUV%7sz+0 d~mh>j cn>t}0*m Zq+[.[BaYQ=ȁ  YH'L` Z϶QL I5-%-3پ=g  * T^3Hv]d3 3N}f-Pvdpgp@g0O^@M"p=N]t`uO?vdrOwnyc(FN@,pm&xB ߍ ƎJc>xa,ghLZ` +"~IBdR-Bcj (mEeKͪ0tWl"('nlr1+.s0ˋ1la9̌K=NY 0D C٦j=qkBE/Q\q4"cL$t`;2m\&KDA6m,,-~3΋N3+i Г;>s~ i+^tqs#&n(X ĞXpJ4ҵ# @3 !NPm\ 0 Kc?`@RQ}Q@Q7T AݱF[ k-1 W (^Vpv14`(B#ೇ ~J /3X HlvD5fXP /$0ؤm:ARTY*wa3…`1V X1@@C-DjR<& %EX d00yo˞JЀoA) XP_5o_>x Bx$PA;X0`}WpCP<1ɝw܎NA!9\0UHG pӐIR^f,)\ ̠K /e4 ɜ yw@xὄzPA0<ՎZ-u{cil;)1 ΠG~$ӠkL7x@WP} +a5@(G-Dz@kٺZ*3;!LK KL@ i"4v,C`0 4EJl4v` BXŮsjILB֬=¦5J pFQ x&y1xl pܥ?`D <*%9Zj.Dg?+SNnW( KԺV9Nctcud^7ЂloS"8NI I2ػ;y('?0 )~;V `0-xf#9ŽjQ.^jB>; ,7`GpНc;[^8Xa~ 0m44$&oV/>@A'a0\I_Tk &i?p(1x,Ht3(`B" (t]!zη~ p(t%;њNu1Xv l#/zJw3 ??bkeT{]w*B~1&G&0*D&gr]bK/{ TjNeb|o8N/fO_o[iw{- Q,</G R?l3`zw^Tggj+'=~=畀Hz _k?H齧EP1 VGF8|)mosO[ؗ> p:汉 iXA z@gaO xV 8N F pM?dN FSF 4{qzؓ=*{^?x3{AN(B$-},؂.028}{Gq8= F #K h +0T$WCXp=!2bu%?fazI6151t0+Pdpx݆P46!B2!48Xb'[&0dCPeSY/C0DQbP hAnPzqhwgI;(W;83-RY#plWdv;PAQ -`PJQz8gngg؎Xoxke"*хhNNIip1iQHz D1F 8 ur X 'mo{gQ33-n@p; 9oAS" D m ?PdwؔNPdݷk"fPB wX+TD*;(.= qG PCYLq1t؈?1q@ `|t8d! NP3 LD3h@B0 @o t% w1p-DD/ƷD1H2!P0|E iANP!xJq 2A!3a7qZЅ@XP;{#Do@| ;0B0pn @-Aٚ ڠ3H*I5]PA%!H16dX tDA,O+QP9 2R1lGQz}qv9O|OY ʼn @;pb!Z\Ww۲HA ц~'`,#€f 6bQ  m8~!r`aA/X7'4:^oX<";2 ^хo2AH x f&Y4/N` VQq(+Lq:hiao!ڬX"(!+!Qp"j }A#J:&A(k!op *A3giViy ~: h}:8A *b;y,p(f%q iB|60,79igɞop B[;'$͒:\A#C+~<2᧮GiLD)P'B /ia@ 4ng7'#xIʼnbG;fa~xC k# DO b1  \, PoP}1i7q Blqw~{fۻko[BK^ XHMX~zTdX@(-м H 31⨢Pzl{F*ń^hFG;jxHXYG RY@(BGpItYg6ILH(ۨ8nYer{8<2`s)q5Sxǃ>}e?#F`t?W.wmɘva>??cn{%>hFbd] SrLh?*p"q(W@RōܤkB^9yF=,(WwrÐiBElvcD=y6@(MEbE?h=hGW=C?\F?$ ?å? q4dfnHfQ7IcN>\|"eȑu~,,0C{#=LUNʖrE%=^WaPSͧBuRUQNsc%sD?#df%i787Ε|=l#dxudD=V?DrqEOCPWc_Y?΃fFDEңXwWSd?NLM5wF%*-z&uuӵG0 o:}؏Ӧ (06fVRu*4Plt}?TTtlN>P=?Ue$XENM#RuFlEjmFg=R0Pzn?eIeF 0&Fۣn&W?}B[ oз]m}/d5%,`xTbʶfX?>KfVFLH>p__jcӆkE(7P ?'?#.MnMYfTe4>MZfb$WS-@ ;P޺o-ޅ<{HJLhmi=1(HkViW^-l ReG LϹ,N A/fD| =;= >PAato1,R5=/I܌(((NQ\Wa`=<+(82u PFB -YInHN뺮NNޠVNB_̾Fa4GKƓX\ClV txi%̶:mH(Ph*( lW*gAgr;;Dg3pCgck*PL`"8 L0ϳOpSo.{"*.~B3ߎVA{岅mQ }J=E^o<  X ]γbOjlnb?Y?nv/.{oMgoo/Rign 4 0 O\Pk?blSx_z~Pw-oh~Bavheobgw\w0 C ) !7U/lNa/vq C DĶgŵ3ͪDoXW' x"D޻D"Dg殩泥󝂄@PACC #J"‰!E"C-ۡ`I ޼)ir BZʔi?yb%׷ar[LѣΨR)Vxjְi\yFr eN-nʥ'RɅgi%;${G Cc@ *U\, 1J3dTPVBuuڸ_r1Xeֵ+{*Wl{Ϟ>(T*^;$_>xb1^QbK<|Cp>Xyh%hQ( !(3)[kŐۅ![)V]BVÅ[$bT9Ճ,Z)SJt@y=?HD{$aB)AtA|F6}8^#MPHK@,%eR|tHW bvyag=^eWX%w\ CIkc!؈کCZHGbɈOI%1j;-Jd!Ԇb'WOIPDG ;8 {ED{B%@dD)*Kc#!,DAdaitDYdD!_@?J90,3C\33I֫*Do3JR3Ș@PIDz`־1,w9pShPڂ ر(I Ǻ;;.%A%2{hyH|@hADd'|~隲SQ#k4{NG%`)x;8lB$oacs'|.L)Y|AOޫ[7B3KBs0 ^""<,cH:- X& 'S@@*S 0 CXClfVG0b3Cp%՛ؖA\F|)ZAbtUj5Jn%qJz^3]8Q̙qF&82T쁾\" LYBIwAjBMR JNwbj oX;dNXʠ" ""Cb^1DiT0B0k8"^`{4B=/Ps_;m9 p$MP6Q3# N@[-Iz%|tgO3jd$PI2D0PE#>p^1`[<-Ľu}b pHgIƀ .ԩp |  @3e iTCxTkϪZ($&CPn-UI4a Gz (P r=J@v/h@9W9 ]KJ'dO&@^(+2PJPϾ-ЂCc,s8F @'YkIwY %DMR.c,5ZEzV$r\E)A ]sktUD-eIbTU0CGxj]?g N0O;;sôiCCκs7 :ir;rc"]M#`IP Ha{m{JeH^) "D HҔ34g?x(0AK@g- ; mJJ8Uo장P,v@kyNW+3pZ?I\$okx!*pFT!A+vq3իLB.qsx\9vndJq HAP C0,kY7h" 8-vJp4 # ]VG8?w\vxF3! 2v!.oAe[8A IȜ 2좿ؼ2~%N'h@vh7n ^Lp * pg  /s xejTik4f;0XbqRfO x@boPp:;2@6o/@*jfLj!nh`2YldńQ30cFRcʸ؄ZFbA+4hu4)ymWc@S~cg[W`p Pxrp h%i wn^*`f#h&VR0zĂn Khx^9U vaf-y;iqC$(x(hk hx W.b0pfHZ@]|эMŒHIC\T|A7A4S7uQhCBbcKi$Bd NVgWie0 X`f68oxH? h@hjW(o; -'Zv/&i og0?@?ojw 1#ik%KUb9yq47jZ%3y44g\@Oy(ل@ucc!m5 %0J`BKFaj6yp'qpgjfDo.w-?`&f*H-q2`jB4ej6kğfh j8i总t#GB0TUH<2Z$e2`)1]T+[l9ܘS@cuf+JbQ] Pq-z;@o??p F:cjk !&a')a{X&"Z!fjQd_KyUv2X&bVr}ѣ9I9*0UZcؘ,Py"0sF)tؕc&AIf 7mo*7n $n_`# 9r2BWZDଐf2TijibPD5r_ƴxZƤc47a&sV&O`:UO  7<8SX!8eOJ@6EK| +dA#K}j]>v]p<"7&)c%++[T+C|Е~\92 @"APY$_`9 9՚cH?#HK:/ksz5XrCC2Y00ZPx%e :I1%0#gVpgZp3J8 :,&Uj@їM/#:`z}Xٺ]QmUDR(+G+eZ m_(12$- BtHPK0P106bTmWe0 t: ?c?mw:Ҡ 'w9@bbhL0,AA$AZ; YzHvOМb'[O[;Z9u G#7A6r: @Zirs9½A+.&DK@t>(H9?&HN# @@;@:|HmkT3A4t'3DB` AS2\\I _U.C1ʧj\CH:*A9c\CL#Wu]ô/[F͹ĔJ9Dm*>$#}!;ƟAKqZYZY1ZG)S:@04S+$sRT L1s\&TAt9 3$2C199ֿR9,f Bƹ 2}+*|cŵl.їDGըEbQ|7>`5/W71r 44B0c=NA8`:[HY_|1<@9Dv&9 c[& G3ն!:p 1Dς//@#H(S9 3Y CAw>7۲=<:۶{],3۲B˨;4% 3L ʽ8 ]Fʶ3UP; UK% DQPK HYAt 30* P[F 1}+99G2*01Tm@tEMz Y쵓0P@#$`2f&~8\̭Qܨ@/  ; (+6n㦋*=Mʭ@PP pT*z "P7efVQ eښ('DD,>GBfM%<^2@5PH3𱑬s1#]5[/!GM/bS.9<\SX1nGLh3⓰;z|?X`FYc"ls1{JJ-@AI23SA@TgdlK0SR]3A\ DК T}fˍD8ƲjZ.;}g M$"=D pra0&CP18FDPCCYzϕmhA `N& B9ucQ4@Ǩe꾢yR.{g&0;/\Z{OF ]QKA .ayw ;-A*C`*xNG# WBb䃟 ?nyp4',A` e$>BYAO pj & ZB~0"h!Od"*{_w ?xB(-qb&-@dC؂pCJP)@hZdG)>*A|bM`z@DAbxԗb<yCn0<@ WKҀ%?P06~?@w,* ҏ|4%M^gSYYɂܰ*3:\ŠBlDK:! CZ9$YQeGC*>"KDa eE7Ns@=G5AAEQqڕLjڿ\̊BT!OVpe?>-S +O%< A!񒡴Vȇ@N*'Mem,c *. g$m & Um[~۬ `B7?~Cpi+@~-5i{ύ.P[N|h떖oiY[0ӛ.ogmcZtJUK;\.yG`lU+;9_@׻5XwK[2{5]OzXw c@2]ڪ G!moyB(/j[?xA \`h[&@e-r|bAeKJ^)4L yۂ9T~T w MV*C!0a\hC*!*C`Ӯ@^lXm YS,C+k۹k.tW%@Xzui[~L_OFo]/`[YV[&W[WZ \!8lݥ}A:uJ0=93ggrW]EvtPby-7gWZ/PV`xpi]MA&wx:'Wxw`9bVDfI&Zi{puSg>`8\AQ Awnt'طg2~/D/gx#xXG5'y8i2@nf!m\ӅZXg5_@wV9&{&|vQO0S5-s@2`T6~6$^(?b4ndff{&]*pHdU# %gf@Qd*2bT)iWrA&c%\UےtPVs wwm5'z&d#0( tj&xA7G|*Ugx g}va5cvMF^GF$4oxFD#F]EG[ɶsyڅpu1]Ɇ@ I6MD Wϙk=o{vnwhfGBKlc?Cv|ryVxoXPERcPw$C{c+={u&S# I!pv<%HiT6W/AGTFDeRf>VqYI u|v5 V$ XeJCtUv+=T[>]$Je'?e>-uIRF\(v$=2 c H+cC=dIeG)=C5QvPWVfsSA;gU`]'IVƍ>4KaY)<1|+/ŹRsMc$^wtD %"YTvBr]g 4hb'xU$plզvd]3DbCYHp^)_x@w*vgAEbVv]-EcU3ׯFUx ybsĞoP'6$߃ [5i`\K\e)G`EVidExG!gQ>WtU#K}kᩅ=0V]'s1`9qGeG.{bUR$eKhhZ E) h5'xO )/;NhW2?0`ZvZGpuJ?vTQjڛ6|6= XvN0(>31!K+e3vB@D&`8Y$HRSA Qt+ PA@"P'lE JF:Bzzn|{g x!87O 6or R)[ p*n+)Jd'WS`  `~usH1ZK">*8?A&>&1ǡ&5 8QW*1&]UI f><+_q¥@ Z+: C1`2s%gáSQSܢ#*Bk upG1b q66oѶb+0Ÿ 0G.+@5 Yi vG62 ]q-6-[ "xK(v˙۪40ȜX#VI 0 C`ebvж9d ` *5whU3q 2@c7f8D g`g@yp `S@ Cd9 !QhĹPm2 Hmv R6)H(C>GPW  [C`T1!A= fݥy 1B:J@:HIA;(-I La oqH{W+A* tԡ?b?! b9F£?S pA@ Q֠@nfA (y{Xh2j^Aaq<!g0xL@]@4KE%!! ɒ,/C8M,m0qP->^I 2  CA~~ޠ4!KH24$YXr Y.+2M5@"ՋAK3#)5<ӽ}RL*%޴qa \np]~' Z,p>p!)'2j'璐%C10㈞8~ޫߠ!*=J@~BFKj zR$e#]BT `N!U3#f^gNiaY^Z~$!2 ƞ~-3TB >^nE=z]"% pn !#p~Ab ÄJp7?8P/ntU[=;*9 / _U/.F =5o-0 .V3ߎBժ&O)oCn!P8xo?.D nىAvJ.Po!^lm..{4^^/O \a O߫A?n^.^Ҫp-#&V@.]1.[^ᘯun[CJ`]fU㟏*.^ooAHhhKCh#()e(#;@;KH8J88" ڕ3ԤZ:`](\ɚ"JEQh(ċ<dŒ>"e8 9 7 RJ+H[F3鰴Ca:#!%p` U+$u( o!I&L 1]g 6!~Кk7K9@;Ш%{@My<`H^H{נz eLۤW$rl0m+=iE_l$L7JjHhZJkIRm+%BDx#33 g VXtO=OO} q]9$AY$CvVDb|9D'&!qe>eP9g6A]ۈbzS,m @.rB Z;qz^bJ Z0Pfd @ *u(YD03JBn28@ĦxB9hgTo"pg.P%;=>g6d *T/%g9̴|& *-;DĦB䂘dN r(\{c4 0H@ @ LP Z6$6sDA2_ 3A PDBI<@5!a?pЁtjflz>"}88` 7D xH#$dcK^(Am@nѤH/@BVA B( -@ ) ( P H@b[#5qlb@Ӕ&5قg`2f ">l~ m:Ch:E the)+#/+YiӞb.Ǿ ue_KnQf0:0"e(6&%:I2&,!emnUɃH! 0`A?8C]&4`D6oـm/%dl@0;h3 ϩjM~ LoZ*ZswdpؔU Bi+K##}2)eë@Y>N q#x ё} _jWr ˝GdALi.  @"Hm)nuۄ RB , Jp\ *l1x&\hY&\Au N2Z{7x:%UIxJtZ$NoYXHp>"Pmq+4̢ց $4 FPs {bdqTv}bBl#P6hnd@Wh`5 R.)mn`#Ê]m32^! ]m9E`Mƕ39$iCt@-xV N#KEP5L.JmEdI7JbD g#Ŵq qaS, e0;F+oa;f{l3 լBNUIsDv0i;ހw\.5LupNc@pҵR|.Ym@ް|.7߂!7dϫƛc|珂SoLԶvc vx``;dX }nu+aQ Tf%XQAK- gmfMuAxEy?LߑL$iGf߄Mop2q; (]g#L#]Ti@PNdVi)|+WF-7js|Cbj7s"Ps?WWLJF5P$qwb!P}X}~?d0#0X 6JfJ9?5LiwUwgyRNglyL'EvTCNMc%Nei]?p\ExfVN^Ezr/5s7x&;-#W7|As@tG(!W7Je}!GRTIVhX(~F~] =J#=#R\: 0* M?Lw!i\ՅS6i{vM?0#AMLfitVKVU xY;vz-N"`wz*g62rË{s{f6(Y)GPIPN7&l ֌W8mYm[8S u!2]gwio80gXC]B^h Ml5֔#i qMrA@uRGR~lYW!Gi?Ɯhp,ֹT1J4ZM=JA>z<- 2@+#{qQL9GIkPk&cy`7F f i"c#7> `UC60Y A?j*߰QkT^b F멢 /!ɒW:FY^꩛ IDBjR.#p a*4Vurz AuZKن0{zEgী,ZFaa#L: ăj=l`1SC VsJ:Q%<㑰 kl:S$v$СŬ@ݠk k1`J*jo8#% okݠ_PaALʞzFڋ:9vaaBz(ɪ`-9w=()=z^EptZ|X0-4F2AYӸE~`Vh|S&OYI`L=iA+sv`E5aLTW"<XIp(v83AD*`$dP9BHqm]3 0Y*0 uP2<@4Ľ,=C , -S8 ;G[-04,ҽ;d@x@d!OLHgނB80 )WRG#>2 0-!:K@`:BP-L o<qJf!2ɟŕt2„<<,0]QT3љ  j& "LW?`Hf? Kg(_*Y`J) i `B y"JЀi!1K䡎6K,`D.<|IH!;2dst@9ɄdPѥO{gNX,"h|mFcK2\mm叐4,a 'ozC r?H&F,?\3G5@H2u%^f̦,if%H+X\3ItvsX2:{7d(&4g@Ä @~ɜcuQR<凥dΤg9߱96D&DY2_l&]֦A4!P$Wq~*T {Q?iRb?`L&M}~Ujɴ`5iGNɣ*qvm\t L,+@"E.z6UZ6h+q 򳟍M-m!(BP0o~ rRšU{\T&0!Q,qMLXSY\gIrX `IcIT.;J90Ub.%I_Ι=pHA h@ػ-o 2S~k:C\)VN#-~>݁r4u%[Wx+izAUT!KX&< np|f E2ɭ+~/RLVk^tcC@z 3ao;8?P@Nˈ `?70AHau'3 p9` O5/2LmAiEf}J)KiX)؅))ˌZE7@KX21m-^;%3uqV<\2`n7J 9k5]Ժhɺ; ߂ΕuaᢔS~܀ApRC8헎A;rY0?[ՉАMZv<)G@ 5jFsx7 jL{7+a?Q3AZ!i|S5iB1BU4Z06:sUT"3g1FA4!sTCzB |šUT{gPH8#8"RPPb`tu2:EaQ H)d:hbM&maU&.#:B14{@H6J|*2P3@AI6> !n3CB6i=64Cop q[bPHA!AH @Y@j4@A~ND"G4u2 ZPw@bBz:0x(2z"Ji6J6AxFIy{L攠b &/!HK`a4@(50'}2~@!}0,p9A;/'1NK4 A xTKXo p!D P io-C\1@{@q{P@ 3Qp' ?,! HQ49 5 A9p } wߖ@q$iA@0XA[20% _!Y@. ~RH`LC`('{`%13uo s":x'pI q(Ac) w('R Wcӆqxj1#z%# $P '!pq Ւ&XA&371(ѳ":\(*_ F]۳2,4Q/< 0Ep30_s6PG#R"-*3s w0[BL (qre_1Ig -p&UZ"03ś B%8#g!"-C@ ($(. E%H& ]@ { 2ɣ&Aj!pPB!Ɩlٖ@[`|$qWrL\L$S8Egݕ4Q490zlтXPaa1׀@x @jKTD8HI a$<ӄz$w3#(HJu1ԣg;CH5wRrsJsQJY B:!Y8 ݵ]^( 00)E@y!8( i PJNjwHG-&|ʈ oZLT ";O hǙjjckcDᚬ* +#%yl>)S>IM6Pz](x[*@Czu0`!t6 (`ЀR)fFg0 ?D#1f![Ľ9&D^<i#zϋ1;z3%oz,YBL4F#䜳Kk9eW;- p~8+r&?xA$~PJ@@$4 H0 v0!Elx?HS~vpm$%'Y#H:T3Q>bIځ%Y;R PN3,?,iIC[vFK 8ptky~7^LB^H &–>Tю?x95֢.HPFHhMZ*HB@MN[jEE" Rͤ2(tH#ʸVI_FL `n;V@ )tN hZFŸh T$@}~htN3O5wwjuM]wCT\]rEXk԰D,\$g!-`3&@TVFAo  wR*!`yEՌOh Ƣk"C[) oxHD\uvlׁhGƐXmޠ8+RoN0qW ݺa?28o_ %ph @b"g1.1阼 4ϸ[L>)e4c#D"ҕS@VjxKD`:=6Q .%gGBzi/w" ~Bm;.l֭q.u AS -@IXxl Í,˟_ϳ{1O kzOz9hG]R$dbq'p'xv@Bnwx;q|ȧ|ew@|,q߀ٷ}}? #7j@cO8:,zG5ww_G2R{ġ$сDdX{3|%  $&x(ǂGr}4d1046_#cAExdw焩qdYX$Tb]Hv(S؉HGMf,,8 |QFqxG=%Gsv} S$BQ `+<8c"'CN%o0~/xUʕP؈W2W.ǥ%t32{7A樊vӊmjP&׆p8qr4+}8pׅh:hVW!xjL'@(+sHcHh5I'3xΥ@q\Hk`xci Հ11W|1 X;)!\)zg2Jy~t)89N&Tx2Ha6#1WY9S#GjHPJI~% 8N){"SS)% i$ zȇc`xDEqp9ryyu)wAz`I~?捂IWh֘# yV ,Q:x{AI?L)%DMbȇnu皼'?9Y߷  AB"`0uZhy !u!"19ZТsQn1Ec=h ptG Stt0[b9va 0 Y` T7="P l@LAHr v Z0[@bST0Ԑh $ 0 U0OA 㰦&Y f 2  I\ZPIO  B{HRfHR7X)aHHdRpQ2퀅NoцjXٕ|+dBɕa ,PpFciB!SJ!UZ EH  vq .* "z0k*!SE b+JrE=:l bH`Hʕ(DC^"sLU%! )P(sஐ I`sd}}0M~ $)O"z KP 00OB c u* 22Y7hbA<+Ex䴱ڐچ.I%&de+}JJbx}hi`s'0#@/B@P 0Z R[Gq,O0 Y&Z/sP$$`Do@uf=0FqDAK!k0$&Z0Z~P(0l I!02\fZp{I-:(]2P\|O ~! : t ;ɓҠC0XSg`egKߵl˘p1&w,}[eB\@;:7ɸci;Q @ SI  )h >b)5k/s`a90vp`lv1 )(0`sF@;.'J;@_p$j)Af0UJ)i~1 p(O/J :9 K)Aq˅0({@8sqȉ vgs ! Ԣ@ueN8)\s/1 JóJwòC,p]]CѬDr<;T7èKR$!۪m[@b?0লL9}/ssD 9Ѓ?6 \2 pD?O"R Jn=ΖXA?`s9 ?8oI 33[%A0[0Qdp P y: hb?@AnBʌzIpn`FsZ-/O`7E 9ˋq}ANxA^,}5LfϷqt 0aYPвcPO17#uZ8 Tp>LP?bFUJ {A<(@bjv )MoSlp-x(k mf_n BxN` `wBjV7@BU u{P y6" x# _N~ 94Fh0 y= ?[00ObD@҆/"?`ip(;0x? "9Z!#u0s§3y4ì=qG ;,4'h۷]mЄOwfSP` -ZLZ&QmCux/$-, C?BmY>bZ- }CL/>na/m7{/^E=N5MQMyM|nMTBs" ߔ#PEZ^E}S/|낮/*/wpTc)A//2^m^Eф=pdOX>Ҟ1*eڒ)'h|8  )VhfOGllDi6۳`XDߴ4rx7xcsaBwtU?@bUI0s@MX;&K[i-m>@E 87Tot>$-nnE/ NFOrMW_ϔˣ^grM7$MbM&3g?~40 1! y@h>x \$_2)_R|?>iDl6W]EQEˎ-P?1-0c%`ZA?-O-?#2?BO;?2?A-??C2 ?BBb L #R( W?*Vi* *W x*L?-#  OOB2YO -@ @є @?ܛֈ2LAA;LPU h!@ŋ%ٸ!Ǐ Cɓ(S\ɲ˗0E< r:عӃ@HA(H"]( "U9jʕկ>~l:8AL , S Iͻ1)L J(qA4xa~`ٯEaiPO2:LlPŏZk98 Ȏ9?:Xڡx qBFL3NLaI*bv$㹅TT]yG/FFGavZo y$cȸq NCL#  f~?!!q/JQ@@6) dApΠ\D4+##1K4L<6kwBPzz5 L#‹ٺhg0B8opgs6j`7TGBvDdA΄1IAl! ) P:T&OTQU)V`u8VZjf\s9Ÿ IZ+ HVr9l&A  ֆ(HoG(, c nT*&Y(*h -F+JwnR RCOz *R;Y12fy C<"l"y6f$4{>Z$C_AADFg}B* /)rP$|2)'%RɓO3Ϝ9珦:\-I4*<$hD Ҁ DEp<@׏d-K)bV@8o? I%%j T$R.Q4~[y?RzB! $3 @h1ЁH-F @ a3vCLJ RABr?jWRu1M2cF zݩ .er?"My*~@-N:$'8BπXmQ>ES}-nF\M=;w&OL.PgDP<,V'DPM_F'b^HuYb?M"'1 "Gb )89qnl)7q`d%u`R{)襑i&2y{KU"\[x"9/Q>"I^d Kd  8ϹLn+-eI5tLĸ &-h8vA$q6!lH"ir=*Vsw0(N%騎؎:ٍqY=c>kDP~hgS(t uvX*\AQ'hii|Xn=(MOt1CtPW[$`!&827)'UBsW&JY@]w,gUwGzא,ixh'T h;Ww )=1m9@C#:TiIa%ia4yX7c9= 4;#8rȔZhY >CK-⋞)"]wi}&xt]##Z<XsyY%|)~Y3I9;Y~$yOT>h1;2]yywwɑy+Z92H{9vv؟є#x!5g7i. :ziRgoWvHeȦUZ7zsZzxZ{J}; 3zwB:Շ%*ʖ(ǬE1JKtWzPʩ%cJOg:ʖGDEm^gأ/ZW-Ҟ~j#>Gu+wy˃9j)1[s^YKNVkZ1Q-9BP L%F{L{[[jrhHj˷#$i.sgz i'y'1X.1]i*!;cTbJ6"@ihۍ;30GyPDjS0ڒhݫ={%Gx˾xh[Xi֓Kl*@:»lI1P|O`X.'~ H zƻEQ"|YL>@O7zVs/0+e5haW2Ìç#zxAniDjsđćxNl1lû|ۆ- sO!Ga] 6(Ngt: Di&=tI?zrz.i!{kȈÊÌl;ķzj*$ʰLgsY@ ;">긴|k8$sL2\(1- C<ìܣ;}܀ElЮȷG*,@$dD{4!sbyB=*l܅Lё KLɣf@w{Tѹ>?+{ylA1/|s9W{VQDTG J1PX %ؐgܼI], z0aВjމ։[]h,{I i@BLN%M2;ɢ׶ =Z+Bm]6 L4aigh|٘L-nQP]RX@2$s;<> - hwm}۩v!-=líw}.ܣ؅L$S@U Fg E] HLN#\s֙dXyzv=[tzB+ݳw|rj9) ɭxΡ4aʿɴ~tэI=hصn n|ӌraCd{jZްL{QNNfm2v*ჃWlʙdZŹC2g J-qYZZvfv^lPY+<=I=oC̐k{uÕP.i~uhή5w ٝ)tXG:2$'_S~Xf1m=5=RF{/y~y)؝@@ߜkȤstEuOD^m2[1G{ ߚIeNJwj $ *(AAZA; CC@@ AǾC; 88DD33Db(!ec-Z׮<]:tH$C4h?;sQ@jɓHÉ5xQDƛ"EHT*ѣ&-y3l@Pj!JU8֊ WevDfb{npn9sMhQ dyπ""]|a" AbMٱOC粥Çk^ БC{RB}<VnlRǜR1Է k:v^ͤmd5|yqm`2a1~kr;"ڻ#ǐ@"gYg>G2VZDLx%HBo"qt(r63`s\&wh/K,wxx4$7Xf^kQk6a{#P'XaDr@(W8YO$v|.tKɚfQG4n(B/bH *X> FbuCejLb ]X夦gF`DM!ةR{T bzx9УE p3DcG@.D!U%_ݶˈQq.a "*9R pP-+ti*lA꤬r-H%Nk[eB L $|Hkh+C-2P2kAL䜳g"ᩐ~aj^L(?' &"o!r"6۸o0bt+ 26CxbI,[*kCk1 Ȁl ( +f,nO#3&0bUܬxBSDtx4K+mMk9Q"YMQ`hC6'viV-\7Z߀,8ɇV' x@JZ4 2v/m.NbMMQ!E( m 8&HAE 3w.%@x ᪔7WgGze/!3AuX,M4LBp0#V(QHd**qrج?~ӟ }iUthDkho$@t6gp"BM,ށbWHz$P_ui! S`dAFC]Kq":  C}%%6BuNT@)R`04Rf~*`e0*buFH 26jAccꈼ;s5Y1AbF 0$|5ɐ!^QAR[$)- 3A$!>OΖ|!.UI|!K, v)/숌2q}ÂL2fRWوYaI攮1g<M0ŀ1\;YAK[%3,aسW?ꬅ<7WDd-4M+P<2uhQ@fPE7Q|HKZғDt&زGi: טLú  O! PL4K;r$LX5Qb\(ֺ6L#I>Q;#գQ3RHa+ #L(0t9 R k >6,\:1SP : b  !QӦ N@Zq 5YgZ #ayv\@*'h#,,74 NGQT)Fь07̔nu݈ݡ4.u#F~]l6vdSpBc$r&<(~Yr $q3y  K.{~"cУuH6/ Wjoib%^+>OiHŠW f6$y{T#@YP Vhϔ'J}ɔU8P;+' V ?Xvf)\7#Ћ-NqLc3dUhvVclg6L)]Ʊ|lKdJ+aP,h%wڳu8\dYj>Q5X6Z̼}s^'T,"M)><02"VqiLԧ]LmjFsfmGe@:Ý{aNGȼvۨvӶd.gS& +P%Xzgu`0z$NH].%E pGL\zMIeWErѺq+ζQ snv`9*FT9U)~ iZwOޟĞ벻hځâr)\o{{Q|*G szd eBCɣ٧wz|m"O09&P{N+vK Gf|:A||qaHvg;ِw}giT}}w;*5S%ʕP2y,Py#gMGtA?Kt9Tuoa[5 uuaXa|$!؁yt|Χ ";T&x}*(xq'swSs7SsF"*;(=('4at'TzWO{g(?[ 5PS?$fmWY8v[f]@)U|fR"i mgp(]xuhݤ1X50.?9>V7Pd$ ăyoQh@؄Gz۸9F:ݰ |P=pMkIp`8OU X׀!.Ȋ@\p%gw3lxq/Hhbä ,sy~I7:xIHVFJv"v+V"XNN hpRAv{le(Llwא ~ǐ7tR+z!Y(h;S)P~i00!ICyVA؍tA' #grJ9Z$ O5,>i{Ӕ0Wxmw$Eh7TiRVS@5l-9Efy*8<0t,n"IǍ8Qf($)HiB@X (VBkVכGk(nafp" hUWvM-@r-6RIJAPdH2I\ǒ)HdQN9BU7Zh@iv!z|ٔ2FPlɐ!=uɚ] 暰 ӟj3 @6W1); iV o Z9:z q)v$Z&)Ɇ*ZL,.mH5J(]zFc9g6@WGIM9uJqZG3=*V/,B /r%H u#牞vf}x{lգ0fV:sI>jOLF*ƑoWUY ]Zk:Jkcjoz/ª1+ bfqB6ꆻgI)5<`d@ӬN8_2lDf4W` _Eiʝx@Aq* sڂ`S yo<{dcʏعĤ PZAfR5#+y5ۭDy'# xf(qp :swzZL$ ׯ~ A;fqCu<1ɚ!L۰ =3ڗ7 QV+4YKC\m멑 [cK JA'4Wx37xb}(֫L^4P~i)ٕ4t1eaoOM): ȹ ['X S#I_i;9P9pP$ 0#@0ܓ ͗ B @ D`61. 5_<<xȴJ\Ȕ<&,$"z 3'F=+ɫsˋi,!2D.bR5Zܫ.RItoGBsH竿ǾeY`ں{([f \A i8:B%,Z|i{Ķ΢QA@& MxJ\L7}l tNGgTc2)QV=,U9вܽM,FD#]@E{a qg&P Op-- @˵\(،00ِ]ٖ}ِFě/8kb2<J,AG}jg]%D(Bէ|պZY-jR-ѳS96"E]_{}>Kg!20؃]  ؍=-cc@7پ=WcR 86ژ6ڰ >l=>FN@J@~GnHD>P^UNSNW~NNnqpL_c`F,60J n >}Y܉Iẽ= 0 Z-Q+q/!%N;ݧzYr?ֱQm;/P'`ދM~꧞$ꬎ멞nN''N뫾~^%LX`x;7mÅ`:3YtH[QE#T̠YgE:V#C#">P5O @$O ))'$) ) =6WWipRL4e(# AZZAľGzQGKAw 1d3ȱcFA(\6r2hu -wJP3,ᣐ&BCѡGPJ=DĤUZZ&$J*M)Th `* ,`bI-a ^siGÇ(^VA];w~OCvϠCH@Ɣ+ 2Hۢ۞ikW2޾O똘d!3XPf"$Ag.]t]29FO@it_Ͼȴ (PI",^ׂx :D(V ^5HXv:#Bۉ(VZAEЁDT36%@,#<͘hLH\p$].5dE $|WC-WWSLjhSKS|ti{OQ@ %7*ZmW,h &;औVj 8rʋ !e^"ěMb;\0~%( .(B*0`Ii!fZ2+Dv+i~ JZ 5[F/[HHs@Ew@5,p'd[ü bȚ>4 }G-H&44 !?!x 0B*Vn\8^*ؠǗ Ǟj@d@e~.H%ږLZ,{R J@mQ-)PkKS A%qC@  n|;q;6ACi?/0Mη&`&G r9E}V8 8GǙPryA(˹0tb%*SݦRv:x FbU)@vG:+`wPtb>U4F8&yq3p.,T 5I [{R|'/5_GO\Z@hy[c ‡?qX!k6~] %o>ob&c`."NHK^jB0K _8C3M'@X$ phT3Jq  l>4,v8/jXA x”Py{1H!&HoJCiO|4!5-n-KiR 7{ZǢjN TG; L` 0Q|/ji^j).Cё1հϜ݃ e7Ǐo#=x4rĜaR2V[B`;%Q7@nA %B@L[E+yi^Ȯ@*JơYJ&vl&$>}q8JRIE)RJC2)P*VcD f;J̧-ȅ뚙1_hSCvl`dc{UM5| :;@@QdUt{n)w$Q>XI©u`D`Gmn]k8i%"aIN/br$nb#m/S>/%xaqk;-L][T&Hf;Ua\ݥ<,ܘiA9> ne"5>y"@y3#s0J̪զ6Pi|$َB**0y;+; F~HnҖkP ٮ9`QN%BüCl!0X*9#TI A00O陏Y OD2:<ֺI;I3RgIqV`>X_@oꪾ꬞갞JiqcҬpB!"-P#@Ȏ[ڧp"}ee~>Aِ>JߠHpНJb层mg @āV+diR<XJR c (_~N~J >7l B wS\^`bd/͉l`i*=ORpƙlz660c_iI cnUWߍx Ww[_hy)Wʙ{_o--0!!AdiZ? ,`7`]{QO? H;NQ8$^ QP%%0%$W//%K D-/L(WWxx$)$) ) 5WR/22#O #Xi/wR)~(&S!&Y ÇHHb_(0 o 6$ݥ8r"*Q Р! HY զ ]Hxa +FpB!ӧp  C%ZjZWT(HE1D 61la22(F4ҠFC 4EÈ+&o&M 'ƷE"iN!UgV cÞ-6۶sޝУĂ1^L[n9mۺ `FPP!h(å |Xӫ_/1 l`"Ab7gS CIQOAx Wa?! Rˇzx*aP+@M=%#[%$@Q@\U$b0H"[ce^zADRϏXfii5Q edٙYDWLoߖbgk|rBasP tхDu iBGe v#bq妭 `.PcWR@ (ȠH @X" գMojXRw82J]bh=Nt*)Ԕc8!wg\b})C(]BAd`&kBI&,w²WX ҅5%ġܡ$z 8*8ؕ#wER(%%\e(pxԚ'~gd C8rY˴0vaŠ;(lLBRqVK )v-,7+L mBd :9b#CGz#_qLԭ)nG*D&| ,Hͣ䘃E2mCjF~n7MP3a~XOH|_ R\sW(D5p8%FOa&^Gp'Ɇ 8/PBD9eW 6LH/O+ȣ)S,!l3 !ouҕфI24 Tw!s L0)`b,&j$`E5Vъ`L+Ȇ D@0 aZXFD$3$᭜PjKbwS %FБ401Xo15 H7 &`#-4p;@v@6dCs c10v5xE0E7E%c VQQgؔa.)˦BP.cl+7@(!NVK15ctP&80aA8VB#"q31Ntu4- Α0Tc!o\HYZ>8#q 5 H ;$˒F2,@$k&MS$,x|SŊ(Hew&%aH$lαL#1ģ;Fx `f/r8Y"q2doߛ\1\Aa*V<=cCwq~+t N(( z9FD/0՛Ld>; pmTK^6?j@(O Zcjls8v2] +hD%ެёm$CfIL5I KxCxZ^&X*Q[Pˊ bDڹV!Ya ~{ E b)]xHG>S) 0'!!"䊈O)G+pdKa@!~פ,;ޚwUfFoմ֘}HA/t*8}> ߚ 615?a%9 [:6=^Iզbj)ˤ>.ADP'(a_U`5o3zXU=^:x SS6P7]`mB`\[mOߖ6^1h\2<Q<4ufWŖX14^FA핁!0B#A13C2Lʖ*px&( `;ێH*hS4 %l ;=owbxLv[>ab('a>ƎCKpŦOh>2+<`w9Bt`^Te@5[vAs^l@ Bb1@NFJBo260F;o t%7QZLT1h[hSwSh T,1vcJOv]0{Ud FmFwMGwbxEkVPxBy60)ܗSh`vWe}1TVTY!xz|zBz{ {na]b^ `^|`Lvb3)&ǷF"wM*aF߶{u'h\ f hCXv~-|!LC+7@F3cDm#`va}CoX`d 5ZeX_#`t}xwLn4aWQ$cB0`Pb`+8/$\_W_tP<>P)T iDc'icU+ N(#nBqs&68"`HwHb@'\vRxQr@ZFy~MSfFrsW7?FT_sd_R `d3v{B'fC&ELfQd5$ }% |:`ʂ^f4\$Y5g0svHidwg?Vi&P ?|M9`WM^f, wXfHϨlo b\%E6X&HH#t.HZDCS7 IE8v7TǙF\7u)nhqNO4T '.}:Fwl(\hsdl0e8468!#ƗaDDrRMiR;U8"5m{8w?d2loѷoGl)%iwUYi@g)1 yCQ2-_(铚K 7rsK&fM'vUO 5 M7ZAYTHʹYÜ@8vJ&AG& iNܩ6SrMfFwlyal$F@wi]]0wp2%*DaeNY;v-!M)m zrgCh֩yvUKvWfM0sH`~5A2EEDKw0zHHzqh%Ȕ*Wᚲ5m{})zwwA\怆U` 'Qwv7*Q/pv-t*ÏESe̙ i `'v 9,Wd]ےn#&zSy(י͗,ؗ; ,p2YD]).pKxo^Nsbd5VrjR_Ϻ *s(zb7oc8l7y)ˇdZHn|kXwb:JF633Pɰ@9ŹgtIYi04lgl*6w+{"&h+%~V9KGuWuʹ^\7v[GvG$L-I#&tٌPŷ8$j&-9+$b]V4kji)waBgҧlDC?`@/- ~A}D)}ފ}v*G&`6J}Tԧ{ׅZ2G)ME g𯇹YɻИI3X 'zz z`oCiMѢ.er`"rN6QrL@tyV1g1Z. T(u: iʉՉGHv/0Mqa6ȷ F |P($ D$P!)aZ8sDK4!Ed'Jwe>3ܬ2S{,:ȤB j3Z'e1*ȶbsUQTgפw:{u zerQ)sƓƐT71gwloyZ6eQqhZ 3QaѥDeb9KHÚeQo2vot/x  uDeC_a>a={%31qP{7N%@f;\9:άwfD&[d *g͌%I%ly|iKt>طģA0Fd5lP)W :5PoqO6B|/Cw}lSuAOasj6KES llLmg0n">@}I5f\ 5Ȧ;;드FLhhSY26uZLȴ!lFFq%7z>eͅw h{s[VgiZrTu6J<Ld#"PUͯ:SubԴfW&J) Gګ,I#Djph}QpS0TC"EՉY3maukTUd`:KCfF$l W">htR(qP׉qQ,^fVMRd\\?C-j;,5!!7~v*ՆZ$X)Z--Jbte )KfGl{Pqdqwt[U%ܷT2%bb+>A%Ȭ y޳=]wNQ%YcKMYUҖN['D!"MFM8sO.'TdMABzᦖW%zv;+P+ASmޭ4/uAl TU$ObuUMW}XT'7v\'iFlP*@H Hpg@gš`EyTKчQ0laNppNcKuK8G$\X R]]tѶzwBSI^M&t* 9PYN=:5T۝CC?mn;\RαGS\l\{uU-VSxH/B:ĘecI )qodKEy `T,XYBҴj;J6%LH oH#WlEt'$EE44) ) )>l=cppc(6$tˤ̯t)֠)ͳl+Nc7VNpL(4e(#@@CCBZ`rűf*\f'¤3j1 NpH$Ó(S\'Tf8s̙a͟ vC̨(KIM>dH%B]b)!hӧSֲTaUP,05*(:b` $HaiS @E,IqX16fǏXSŵD9}ݻXԻ~8v͙sEK6^H|gF6ݹKG /w `9T:Q"EM^Dqpv>g,0n D8Bu ؟B$ B`J ]1A;c`@ӲiDD;Gs^uauVg\wݵQta`0@i8mwd-@?.nx Bhp@VQz?ĂB燇.gDNo$CbAhq@ѼWQ#eo8dALO}C>hxG/E@vQCGԽ r[ntp:0;o@ u@ HCZ&HA%x ?,t #@H  DB8pi#tQ9,톮BwPjL! 0~j>ݭn\MyuG'h'8x,EkE0jDwٞG1αP2bPG1L nH2U4 ЪjUSVl$@ddͭnW 䣢4_qԑc#Ô?֍)Q*ԝըERպ vۃv;YOFǐn#McSo%W1R+w4|I2SL(3Y=蕱|Ezٲw^wcfM&fdR$NA_<;p~ƟhAZFt{tb&0Z>7vw(a~w=ZO_L^},!rދÓpAX=Tn^ 7AW>W y<?1ϴЅ>>OU;);OмQJ"uXm5? po*+8!H{hJLٔKiKi^ HPVyW^=k`?UfT8GlƐ! ā;"YvH{|XuLDYBRԒ/:٘[BZ AYCyEifЙ ə `e7PIX9:?9e 74gY{pyCi>C?C!1+m×$9py9Yy虞깞ٞim;@*%:7G-7q-ubv_;K*@3СYz"Z&:4NA*DN2:|8{8tD+@Q7N rp|lsr0a9VzXZ\ڥncm% 2-;`?CI:.@Bz|~ʧyCGJc@Lz3sL:*>ʢI48DFjC-ʢ>ʪ ʢB@ HZr`|Q0uO#S丬ڬ%UD\S& TޚSYzڙ9y;DHz8ѓ:j`ӛ!7sȢ@#TYmnVL$C-khJe"N$zʚ()*۲,.0;2[4{68:۳<>1Wdv[IPN;QZV8Z{\` JKYz)CʛZff4ꩬC6{x* DhYvK+@6q91YSЄ[{۹;[k8(Wɣopw#Mxx~x6% J-8\ds zlĔD@ڼ:VDg;%Ywa:+lz*۷R& 6h ɸ+$띒k:;[{{CK:t|q@&iaR|( :L"LJ@΋’ K -foy|ېi~fKGÂ(Ɲ.aJLNPO.T7}#w8A۳7`9b{SFfeT@ơ^)orpZ&bpxz|~X HsAt*/ZB@gȐ|Gȉ6t7 a|d#;W {ʨʪʬʮʰ˲,nP˵˶UX6k\cKL||`WIa~ykh;I6l켫 6<<| p @6`rPR q]} =]}]ј!]"=$]&}(' ,.2*-"5M7>@/%Q $bE=2?mFRB|8 ʰS"!`,[`h}jlnprt=v]x}z|~׀ׂ؀=ֆ}؈=[e،m!ْ[`}ٖٗٓ=e=ڤ]ڦ}ڨڤڮ`=۴]b؉jcڼ,-ܷ܇m۲ṷ̆=]}]ِ=]}=]};PK4HnD DPK.AOEBPS/img/avl_prod_cmp.gifGIF89au !an_be9AȺKjŽɻk͓w4m/B`Ө ׁ쯀pג̶vzzy씥@7G_dtҴ@CC2-0",8΀όń!,"+""~,**~~ĺ*ǼѶ~۽**ll~˽¾ 5 2al$&ÇoH"q3^qǎ ? Irɒ(OLrJ"e9n8 =wg HfA ʇlϟUjʵ1`xKYsҪ]vհp=ubڥ˗޾p F]z6۶1#KL˘3k6U.~A'X/V49x"6 Ď]wG$mZq#_۷ƒ~2l봳ޮz!wZӣ[}O|V{2pmWAq݂Fu(Spp%!uv݇2" :hn"oϵ0(4h8<^hr&lOdW$F6!t\D@fF<0A @!die&l&hoYw©|™r)蠄&9`ZhJgRjy.覜v駠*ꨄJz&jjYn*4)0+k&l.#<,[m2Rr+k覫ck& # E$PJʊ$! kTV9,|bMB5DQdBP2!c! !]"p %%Rz;(UC5`J@0 (]Ƅ; _&P8=TMa;a-U5蕑/8aZqu{!PC c8{Vr0H\0b9Yxmzh﹮9g>BqEOK]N0a[U2|p^e0CT-&&RO60]Π2;pE(\ */xfWV]6 e{;T/llv6 hbMw.L]ulȻl\z]m̮}%ڏ⌇aM@kZ>ģY`xP@FdA@jiHML)Ix@,PJ !,tCPxW,`p, ,,,@r`w./>-ΤPP"řG)B91 B*BکY+00㩝zȖ&R2E0 P !PY!%#-)I^œ3c8ՠ+t#Ӝyԩ+Ev3 U ڡHNvJ*&9K%\.6 >B$>72=ڔ#33S-I1Zu*&B]'a"h'(bsie(*%R¦(|*")",Y(r/j/lj`ʧ*/t8%6)Zjک:Z*q2rz S !*a񫹪!*$ڱڬ R"͚! zĺ%ʭϪۚ Ԫ֊!Nr$*ZJJ 򊰿z$ Kk[ ˬ {Nұ$[: ȱ"!J**aB;VF4VJWON݆NV5Xqpmֵ\^W;d[f{d+h[]nn4p;YtS@z|۷{ tx~+t;zY;xy;;۹o z{{˸z;zp{xF~{˹tgďQ4H[Ep+UuC{|SfWSWޛ૴x pOwp黾۾76˽i Lvۿ̶p{uw[p;  칿{k~ E(H)f;`p`Z1psPlEG10RQKWP).^n1 ,;lSھQtLm~~mp]f|K@zXsFg rXV:D NO>tWCK q4`luvz@^5ʡN6ܸ;<>,緎*oK&LK@ʞD?YlWܾdk|Nv\sXZUױ{.cTmNoVdZh o OpfcDoOXEh^,̏+/X! @ Lݪ5|u_5*/t'AI_?HK;,`$@N mPJM^{en[vF% |i©nހ\d .X]Q yҠn.'$ %J«őHj}!LQlp֩!Ĉ@l< Hc4*cc8#4m,i!(l(:IF-Omf\;ĉzWpt\0wqC.0*q ᧛'Te` 1ФhqC 1LN`f!/PK}ءm0uFĘZn3-\ Ρ\"̮@FG M9X-5wCXw-[ N9C D!7yBQ? MPUTQާ(!h%iߠē.* pn;xHdG8BxQU>ƺ p؃";T.BCEA-|8QЊH!F{-if(-jw zý @6`GjUV~ U M.phNEJU4#C9~la}qh Aja0w0KL5egx`??.hjTEAof"p)9rϴ!0 N1 HEYx6/x-DEqB@) [+ӣ CH g͜XGwѢ! 7Q㞅SZm} A.h_9` tkyMp/>BP\POl`9уG5_xPЅ 2OBt/V ǮSUA F6j*7-u95p%hSy{<%y")@ÝJq4j%hz@*v9} w=ppKkm0p|!QK/N:R3CM0hp3|7+xAqF:`'I+Z0Kn= BWWKx;;5I3"'aSjPIX@Qby#cs7!LQRfpzL'{N',Lg}a*M1jrR_d@2@csp=F4P z TQ;_S@oaz\'v6v0?" ^' p``_. P R`!tɣDR( (=@at6u%8n Qh]ZYAAzU $F]pIWU#~(Fq(KV}`UPHRpUPI`pqI`ɸoxIb75!By9WX#3A, ,G; `!ΤưOYvRtu5e&xuE5%caQQ HrI.ܱ|S GrPq  C @2` m{\8!@?OR `eXXC^D`tJׇƒgГR10Ua'-x%L7>a-#xԑ x #P:vBQ:RM0E2hp tidBPP ԗ O 0|tBPmn [2oTWGDhC2Nَ $HgSL=8Z$|VM0]jY>-9'6129cq)C0"F`0虞ٞp쉞Gy,bٟ )j2@멞詠䉠IL qgГ𓟉a "?D0|P蛻#v$LL-#>zhhّHo`@fR 9 O\ (9RZY*`7O QZR Pc2@[:2p~2f^(Q)uPJ_o@  +98J碖qYRHS֢Z}gLCE5HE]:8šjͰ C?@o,9rBI ; 0Z X?H?9(ZwR:IՖySWwC4@cY H`.jLjnY$%XeȹZS[{zI% 2B f8Fw86LOvU>=@'lvq`5 j(Z]( UMP@`@`#SWGS`W ZrJ ܇ZT7@x YP4ZF>\d( #۫;w8= Eًvq@tB 4 &Id(U۰iQ@JgiXTyp2 Ch"@`ۋ۰XuazƩd-x o-w+gԿ+))XKF]x󱗘` `1qr" [+a ]@R MċUl >r 6g(Jl䶔`(½?>Zf[H,e™=[; ޒdP?mt~($G30*T ^BJFB3/Spr+7r9}7 FxDoJ*uPItX wЀЋ2O`*is1{4U?nj/"?<I]2W0ue} 7J> @/;s X@D IIy MmF`C8!}hG!nNnۗK!́nB^~ݵ^_ܱC , s,쿠#9=  wopP+o<+,PUWaL#o=SEW`S`qSo`S<ooUq`o9 ďP ,Uο`Wou+Lb*s_ ߔNqÇJHŋ1CqƌhId.[(E\ɲ˗0cʜI͛TɆ ĂS*+Y*d%zQfwߍW+a*).ډi-,&NfUr*`\e.iI*8F:JdmjSYKp7ҙ' {nG,W1(M]}Zj>9ˑ7vǟVk3VnTP9=.C.Y7G/cw^}U;|/AK!kHҌu.\[lwgZǺxL-p :Q#B{ Pz4;}\h*u"y̐BMX[XAtE6+R^ E-oR!F`Zqp. A_Xp;*NzGU z|$$"aAXD D'>;ȗBA"K(խ]+Љz>;d':aL4g1a6u捰R :!4vh+S^1MLM3/fNMl&ALfбc YȀArA8 nvEGBT8A= Az-;7 .Ea2#ӌ^8t+R`dY m-y)Lc=7/ͬf^ e6)΢HMRc+NW-JA֫W JH: V`GE`# 9PpW!".ڃȬqC3RDs{br8\s$:X&M|L hGK.b.QuAsIVD!/ɋE 0,E6ۋ,BL96 t$L=)z.jQH:qE}UU<.dU';`,eqzDCWpE)VE$ !-/ ؍ YNa Fʧ\EJ;Dԓ=IWE{ݛv@$`nygbfѶYvdZ}b᭑>fIG)$P0r/ZDۍ{<&D=+d`g9:2R4gܨ(Z9ɬ: Z9#Rt݊s: ! hX9 Q_QG'Ў+tP 2I{@hOkK4Gt屼.hMiΧ 7{\rp:UN;O _;~@7!aw.H"+ޙ:/l~՛K=!u?^ch?(5y+a)=$i=(EUa_ɘ)wo7qw6ءO?gE.%;kRelg!LagW<;ye0Wi*"2 8/ _'=h$ X&CC}&FEaic+9 w Ew&gZAg$ZQ%up[ЦFmg!!#!|?m s7olԷs2 axv|AwPL oA7HeQKezqu|Q _69mPo~!S@q! {煂Q8 QQR]! wpp`eyqjXGP짆" xKA'DagaxtWo_cX g o o7v S!&GFUuY8 ` om8p F m0B]GXq P~dpS`uv!li5l{X0 "oAtP,p& oR)EU#WrGmpUHnšnyr;gr6vt?VaNOmNj't˥G`huڸpveW w0u]TgQJuX}]zP}TW'ՇcdExotxz<lxC ^>`#P5ǔInLQU0mǔd>G{o9y3ІfK]Sp_ o9 zp mC|=p xuHm Ɣq{wUg1mO6s))RPْ -a;GL)p&zВL*Pb3 b8 {XPQyEyy!_e>RP'smNG{8mFP mm6| Y ;uQstYyhFkZ2mFaL'GOS4 )Lv,PK1NtH{?xJbc[L wYz=Yq$y|hK/Jn!4 _n0pW |>w@' meކ9pXoJ׈!Ж# ٭\WFvo4rj<4}Wluj_ujmLZ_9{X76{J[7Cǔ, V},GG[cZ2)|5||awK{ub5w#8aY]pL zyyYh;wBYs3t2m;9ՖtBjLǗqt:mJZUY`De[xvCh C.(+{Y9G*ذ|sqK3V+c)(|`nL;!!(T:!c,1ɃԹ` |rjyV^ zQV'>GvKni0F_;[{؛ڻ۽;T#pj lGC+,ۘ_0m^pJ,0V[z ـV+ l++V w[[ʹ i%{HXDIcY@ 1?N~T S 0}5\Y 'p`Iv Rp;T\V|XZ+UoPs + zʷ5Hn;_:+j5R ?7ȤfHˋm˼Gu)bs܊hýPc!e9.GYiGI,,ɐno<\|kk  Nǔ{&Ǝi^շc8va_+cJlKàSgc~ߊˤݬt]tq9vȐ9v^vq@ϨJƛ ve]mS\&}(YLZQ5{A7|4 t,9 ͂ċEydHdXVsUXt PuGi TUe|z V| PcYX_ v@|plGAU -i mR| b ɴLF"R y$Ҙٚ٘g#o@bu[ǐ(N_pQ$W7Lata! -Vh|@Rpa S|uahՎ.QQƕpt ^TL[Q;~~;i X L  %Qwp;BTs9@"ɴ !$" Tv5Җ,.S/-{\A\uW6z j;b WP[zla@aTc}I CQqWkJ`RV={"ea. \yp N"] T*$R/ @:"gY.}@Y圅LNUTVum^~U).δ0^~>_ j d#*Az5!A Wi*-GQgy!Ó/Eigb+E"`n+R x Y@"n4 RzY].e]-v@KEU T*R=L/G%;绶k Oz]= e⹞:%R< .mx0C+2S'D(,:B5EԮSJLXlYv`+̫A6__Ɵ2a1 m¦xŅg]vڿOgOzGkDS0c(xT\ثXjThɟwSppooWW``URwwUqRvvƩůURRUӪq˸vo+L"*oRDҤQ~DWVlIHֻ]ԀHY*h! MZ1ac77\XʜI͛8sR@y"pQ?Dp$e`ʛ8q.eꠊN\[8Sz8s'-%>&;by]W .hLC?]hH0ōH ⪢S*U̙ځRbKF:ΨS^ͺ8ѳCu\`MHazp:I.N%@+KxL5Myd0t`G|.vHq7!F$u X{ٲ/(mSZih SL˃4h^an衄v($hb(b,"ɨWh!ASmu910E\5]o<%!ր1ՑW9dgTʕGC] 4JR_,GRVG՟,*蠄j衈NCclԣm͗ﺩ^Zūlj.uBRtvׁȭ=3[K4K361ʬ-?.9iGnWx+npxcnz騟z꬯޹.NλJ+TNOJGag|.TR,`_`|gpGu5r& KW(0ilfm!ce]:( tAi׸& >H(>h#]-]oHJ4.G+]q .> LV+ 0cבjȜa]_! !u٩nXÁLpIС2ls,*iCot8X:1#x> BG q#| P 7Q+yr0z +J_h!whXD!Ά%@ ŭ}3>̘u g66$0jZQ!>GO)p r+yXtP]Q "0:2)יB>00|(c)DTSW36 KЎ.#͎^C i@*Ғgol w @0D( C&]O`v !T2q@I$yH%R FMe>y"+ѐh4t2hYVp}\J׹ڵ]W}+`J=,`/rQiP@_X)u_h<Ŏ5_N6][ZI˽xb_l7{rG\sǗB 9we gOgZ]>%7/(E>'曜B!=g7~O65qkHPLY}Ͽ1 a}3 " AL`Wۆ7X'w~P x R Q6W#',؂?uWA9#\)fi.؃>m13HQ9<hÀPRry 0wB1{# t"G27hjHm(ZXFx(G`h\wu;"|؇~cd`X[zТFC2:Wbg}B8usg(2t}f9gWH(4&yW^x`, `  RpC ]:t ҁKH3 TtxE^mX (c0+FXh%:hF,V5hhXc*5ܥȎ)x]]:(`t\b8bx|HHHb((ct,ƑYU1uP8W  w FU`3'`0Wdy҈*(@RRmɠ*Ǝ%|(_cX؎P^dȗ398/8ȍ[)8W ٍ% Yx`}Q/In)y&qs<1K q&8 99ӥx{޹M7 :V,RȱX0u8ZI{RX 7+qݭMɗx)ޡ`VNxQK9%2y`R]XȠN PtڨH1YE;iV,l),^mݺDEП!4-9Ω\`9޿ļ+E\qUtRE"ZSatVlZ61NaWP1k_ԭۦHJ%->Q ҁ.ΠEю59]=Ѯ x. ;}jiyNaH](Ş.v`>dv,n` ޞӘaC;G. x%ϕ>P-Ë,hrN..(:8PE*.} y`=LNa>ɞ =&@ PMǹPl^_Wrd H^sbYRq#[ٕM0=)qap>(CEt0Rp0c/g.ZgNOac&d(8dR92%2c]R(8v4c]99 2W(% h&h( d2]cn(XdؐR ((yh(d&RR]c-4ځQ%D@CRnubT;J^0DX(2:A/I%*YE Y%0h,H7@KzQXB.,:2 KQ&ʐ [)1%%lCX["-;~bi؁ &"0ǐ#+@^%p*L]J/t*HsTFQCvRJixPwS@]pH Ek%uèF❣\K靠ȆAxd6'=b#dȀ#2PK"6pf ?ɥH%sQSqX#$ґс&Sqnd]+C/$ cF StI1L/l=hAFEVl,e##E(QNHC%!(1ipiʰX^F4%RUle'" 5r_܇U(j(! tQ`VQ9eɒC/ M"RҒs%ƥfdCr _|%A5&ٶQZez`F@&j,om3[i9BUfQ҅)H')K]kb1e) RPˉcH N4 u(fM--ir8Xq\k>d]>:1$yp!rMGv Ap,[˹P05 +{Hr[*B"p\A$G=Rm$K.)ςВ Nux;/r&,2\H/‘B;Hd - e-f/ /Jex-$"8 B ~c)5ˁ_"pZ]hMƄb%T (T@ ;aKB\峁|aeF(*8< !hY En+`+E1x2 A3B={$0ء3vz1+YbY 4qe vhYq,2\fDlAСp2MЁl<hNZd@FU(GoxŢ0MCC'v~|@^S pq,*N S0\A,Yn?R?Ri,V" $Q ^(Q4QTL+њ@ca^H(^Z!ؒP Y(pGA%Ia$A{i/-=vh8:wX{vWb62hIK0-1 e?q[UXfuQD0 m a\)J,` QYg LN `FȲ}3b IR\"3ނQ>+, @̌[u8¬7JW4vF{[)E1i0I8c` FY%&Z0⫘xfQ%9@w’vJFdd&bN)v")nayH8T~ jatyq P\CaS9.IVv! o(m)K0Ld^铈K#hx c%@XCL緰a#xklckDpLm"P/^j_:0?(107L dP@kt08Ft,F9؇0%]PK$Jd#ݤ[/D\V ÈqW ˗kÞR\-e#X#Ko'' EלLW7ȞD3S!3&"(1qqy!HloAFH:R:qI 7b4d,΢kXGrJ١X&Clo\,Zta\ EPzzF_cDcU]M*1̜:,R%dqǦf>W TgG#>_} g$Li7'nрF["{Ae $1e0q9x5)|hM4QQ9s`0~ֻ@C0,ʩ0B; Zt[!`?|]SOzY~#_&@0 vw\R}#W~'sw8J{#{(ePGu~e!# u- - g7qqq)a*h$ya*w%4sRrF5zR'Pq~f{?~6xwt@?A*1ws~c ]WCHJL؄|gr3"քVxX%A8CEY^hIWhhi y~BtY\X`X( KG fe%kV,h%[pab^^Hz!'yAa@Rщb nsswpF+h>~;@G Uxb|z7d ȘʈG*0,8~x]~؈GfA'۸r{?8Gx xvp(yRFdU%!7 $\'!Urg7aq=bMQ{X 4X eaR8{w㸒>PШ2Ȓ6~4)7)9;لw|gVP?9\2 ,ȎGp0ȉ4 ɉ.W:W6ge9"#a!r)vrr=Y}ٗ;7&`*yCY1 l)iyZX9qV}8Xi9x7  b%'yX)29=AsR"r4qrE4` +4!ד#p{v?weKW wٗf'wE]|Y}|y~뙌u|_؟g9Iiz *cXPyZ_8`8h JN)xIs  4'MbisyHPf-RllHqHVGt"Qi} I( 97E }TBإ[uu8bZڦegtڒn:Xw*gɈ @_%2nÀ %KFS1 1U80=9;@bCP2 sRtXPX*-M:zgʧ燧yzʫHHH:SP%u rHs/05o1XLf#o )@5 W:[vpX%v^:@r I8p~*ۯʘ{*g&Hw@D/P^05A  #.ce$X9 a2>n utڳsɯB;D; [JK>O*$ʈH̚ /U`b#*("**AF%.ѓ&qY&Y C{>;FE{68L XXMH6(9 艤'dc2=T `6J[B%g$2uGr9>Q>Sz{x5ɴ6i 6h*0q׉"W0EYAA9bQJR-db4b q1Zm`$AQrwq[v+ɛ *| ˹⽹#`.c)OXpq$p v#tUy` J*k0 x;zH|;Y L<7R 8(ͫT8~BiQpݻ#=ZE+Yt.6l\_3HվJ%OxB ^PȎ<7 M|B9Q6,\ŢVȢyalL?jq7˻5F>FU7wȜķw[ XX؜ڼH[`V<||̑l|<̌{Z꼎6xV#luZ(ػPj#כP<7Ke~e5324 ѼLJh@@]ϒ\,LNPR-Yh͕,=Q-HMȏXPՔ12u,@?ljl$~yՇ9WCЌ؎ 4Ǭؔ]ٖ}٘m9]|#ʢ #pٜ ڬڮڰ۲=۔ÇMے-z]ܧ-ۺ]}x̶m:G-Vu}~-~[5}Q[TY]WC8 Ѝ4#L۰ C-9q n1C^]]8PࢍM]( ْ]7]GK(wy<߹'YF.H^LN޼P.Ι\;XN>ZI]~`8H MM=+8Pポ|d^}cO^ 7ք~V^|LZWd|H}v '+j)'&1mqF~ꨞꪾjn?`Xᬄ$-Y^^~Ȟ^3Ma=о N^>$ N[.U ##\0 ꆐ U:>_M$#2ؚj^m9;bXf h /^~H)i"024?6_8:h?Ξf=TG;=/ /~&X>NK_P|W;*YT>8>o=0 pxz|~?o?/6O60_?_OwGp/?F`+yo )\GւNq  ?_ ȑ&,jʵׯ`Ê*BٳfӢ]٩p-kݻx˷. LÈ+^̸ǐa^joσ; l.ɺH? `ˎM6ȑlƬcf8 ӊ*V@E.]J# (r>4UEËOIcXϾɻ>߀]& 6`t܀fh_ra V`FP(,袋 H4@0CJ)%QF!R-p~ȥUUUX^e\ne`zIǘdi&sS&/)rifҩ/矀*蠄9_x𩨢(ߩ}V@^inꩠ9h,,ਝ'h  ŹJ,7K-(/̰fd,(F+V[m*`mn뇆Pkn֦n*+ﻵ;lz4,l0ePF̡/ qQL~ ,r$lK FBG0`@(ЪEr$Eݯ Q*HQʆP_ZHVXXgO^dmve sh5]m{~Da|weW_0MAO](`P@G5~(wQ037O1]g1L:̧[uo/oΪδ1;=/;L;:̻^*=﬋l[_ fTvw?ΊkϦBQ0 + ىBX(!6Ǣr=AuJ2). 5S w>){K W麝we4Xm/oYaCw.0o6ޱ Pю S`(e}T|ZWAusbW(UXr(eCα.;BoNt^2V@ :d F:d bu{# >3ˆI,]0VCp_^=)w"#Y+nc<  p(Qg\ `Vp/53b SP e XD#G&7it:vBRy3_NS.P弧?J y*{ZҔ2"HYsZ!?`@9#Q846v)~@,HlWjO2 4!EJGU " `ÄA$dCJԢbg(R(Q8x >DgLYJY3yc)D5ԄW*ݝJJ#i7y٩P<( `PHl(ڐ&5^3k#z(pyNp:1rr!SVDj8(Xu7 ް,5ׅikPp%$q bwS)VzvE߉Y; H9d&gWc╍86eQSy7kZ{K;󮒎Vp_c@8+b?CY!zքMbEMڲ7ejK]gf/ܞ,w0>\ kXIcT\ОLBbjbB:OSbfV˘77ҩz3B.34$<)d-ICSФ/|,%0ˑrC)6>.pD2KJ pj[r D(;@-Uiu#̝Süiڅo \}35)Mx=/R{ƹc~=ts0;u>':p2 )jM!]]~Yձ+O#%ѩe鍧y&\Et^_"mHg ,pOY# pj8dFx  īTal;ݲA B~s) W]G*__Z?&o: 8]KSXFh0FŗGl#Ih y, HI DL8;:nGm3t(Czaׁ "8$X&x(*,؂.0 8:PcstI:Ts|3>9:C>2ygtsE^:$D#!{ f`{d7vbHv090 f`6 0aF`,Cj(kF0r+u8yxx؈8Xx؉sȇz#{hvȇy8|8yXhH芟؉+N~wy\ކ@u7vdЈ9 ,k 8Xx ݸ 荃?<9(=3{`[` ِ igFـ ^  ` +ْ#I " 1$`8 +y>@B9DYFyHM)  1 OY:WZف̓^g WvC%`%(sY9ɐ[p| p ,yɑ2*yf p7Y#Y) LڤNy"H Nٟ 3PMY <ْz#CU5f@k:iyyi Qډ ;j. y ,YE8ɨJzZKw'HJ~@IJ28|:+f+j3 tzz (ЗI^LE`M :+EY'鞣Т9ٓ6ʨ=>z蚮;P`L(0cV[t fB&h{#9,<+9.9p K˘[I{ PeQ{B е *뵻y+Ջpkzjk+hDQй#:=s!^YikX[x/+9q , ;+Ki.˹y7 s{  ,۸PT* 3 ;I@m<ຜ/zt,fQ0p&`$@6\]bP{ P$)X#kbp{$9,{ !&˳+_)1/빜K벣IE:`4y ǀKi[ܻiyP1 yl*L]9p zBcd,]qY[:F` JqeP:KU{Z΂\n]7ISq<}r>l4p <ϰ1鉺9.: a* KuHVNJe>%\#s\=u."`=Cǀ@' s%, *5 9)/,1 Bo2 2E1 9@_1_&iXZ\^`b?d_fd C1pOڔ7`o vxP~_7 fp_7ާ 3r OЕKx-@@*`-߲ $i`$~u=񫝐H>(@U?`;?P_KaJol?`Y h_|My\ڔĆtwOfeef7QQ77OfssxxY~t^ F  &g\ZTjZ\gigTTZ$\2+L"~((3 b:bbs__c`eO}f+1Y- yj @ZpJcI͛8sɳϟ@UO8Izc3Ԕ(f2] +LY5UjS3>]˶۷pd:7& : SѨpa64kش 8rBC' h%́)&5Fm۳]#G, TNLU֒rسkνwi.' VoG BtCaQ^W& w^%؅ p@Y̐2zsM,n1k3yNA4 Oo8K\fP5cFd tf (퉀{I755oU1 h?p^GJx{qʳ_,jF(h5* & vttj>F6(b0@aPBл]9t. Sw*#SG%`;` xC p\Z,9+,y U 'Vtq*CM{,r ~Ɗtx)bPbP`2_B3.Sv#G^S8'HB:`^LA ^3~ < @kgLyUV͕edI˱-lL<.eARҨ2hL./ Aj&`P(@ ` xAl0dPIeP)PUmjG* j_(IֲxԔ/|  @^/CtD/FQ!QQ3D3G1R,V|&`T MAЄ9Dj[O6^S? `ۥPy\qUympkUGݚ@Kna陂@LT8ϔmjN\,+=Fr6z2]v&Ȧj SVLB{z};\V쟫H̀k껄 ᮸cvww=.)AwZW}M Vu@վ~#! 33cШ%N.ey2 "gL!Mijچ]oLT8r7W .= Z4*wЄ+O;~Ab>{m7Mn2Qܶ+*N4]MVNmU,[H"[ MAcL6Gzjh6vkvN0<ФCX-9_k#{0&@lW|.¢UF Z_+˨R%0߾'[N?W8&qa U>]jFV2 Wr'[00 s#66Cp"co۳yh@:Bk40;^y8jz@n[p7,ޡ95($.uzA IW-5`7R㐿d<ڪ}ߋjr2E( 䲯0~ż9go˪vOvlcsQ_QRG&2wᚾ}Ї迣M?O܏%G|v}`s~@]t%[:lk1'/}V?U}7X/g/4zPs>sw{7tɠ{ mEF|g|( qB؂.8sCÂJPQss s2Ff&tT|#u f*U4]SV(5=*wB55G8G{>hmD{.|!WR2tXvxxz$Ɠz\؅s5!@eH{hfͰ-i5N7\{؉H*N#i~Px x<7-f#:Hge`Ƈ|Ȋ؋~@7{ 0h ɸ~ȋ6(͸HHwɨ~ϸ%Ax蘎긎؎x8{GH PsȍX،e89Y~c苮q2g3ZP:i0o"#|`cuS 6>q /E2.` 'ȑNP!RB|`AirRXp걕Z^y^Ilɖcٖpr9tٖxqz6Ͱ6 y6!Kb& Lx;S152 1|!}9x@]a'9~3YyEKA lAOA @^_W pOY։MQ~yi kC# 4H(ʀOu9s/Mis1*I;E #‘:Aњ .i ǩOQt ` mQ0up eQtTi$y K9`&73-7Q~|^pXZV1QB1W/jʥd!FXbD%_ o*\jBP3_`1@1/AZzکʩ1&1ap 4a WaK`` J+Zzzu  6ŗ<(AZI:鹞Iπ|j BYii':`RC>j1y+B;Q_`a)z ` g.  Pf -ʢa &{(**{ 06P Y(YmFB;k_ߙ =33L;pQ{`@XQ˵@S McZj]^S+g˴b+gKzaQ*`VPFp+~`YaaZ*+ ( 0Ĉjj"$QM=fр|dP$yd{w;K Ny{q˼_Vǫً[˶``k嫼˽k˗~~`~pQй`KYP{kk  ۗ@j3f k!`D+ѐ—;; 1|>S3^#q[K3t+P3=߫i+`8l>X?u>61,nj<#; 'FO|˥2}٦=;-ڦ -Ԧ Q|K[͙3V4wW}Fp\ e `km{`Pl vqݸxޓl 5ѱ["l&Lɪ/-M[3D`Ԯ=ż ~L`AUM,P<)=>b#g|yK<.-6X~ \\l=ׁ ͽ$#ҝ>йpחB]mLصHʏ*ŰQ^D{㜮5~kpJ]]]k] u|l妫]' M}TT+,˱L-ԵM ~8ܯP3.- ^ۋ^5s~K~VK,>^,Yׇܿn}O:֥ޥz|v뽞~6T@ CN- m>ˌQM)Mv;\׼ӌ4\7#PڤP/XQs|ud] >yե~k=jMv O:ljݭȾ  { Y(<-C`DҾUo{˴ ~=s7/-ٳhӪE{̙yP4~L+ 2 Fy&3rUeaMپǐ#뷶2.LD.#jXbF5);~\QddI,cs̚bnI,OɓMÃCz[ecܨ*Pϩ j+Ηnu˲ k:w"c@~tˍ8yr|u#فCzjaf `g)EEG$I&$[D$M8)"oJq`xى' (T*OқqWuS8U8~#s/TViV[y#_x]A;,\(3gV<%(' ZAYXFrB+|%Zm+"h/@T,JEwHHAYզ 婐guPv꫿S5^r`4hC͚1_;ZM3g7P pcu )g&iZtjkh 3IٻkD0o,lk 7F+/ B&t!y{.k[CZҢ^!o;Ml8s @2FK^1JqjEG2;I'L)ka"0(hu]Fl],tl# /71FKElRYGrD,-Wn*Qi3k}gD-Uj Z '26؁5T^.{'>>]~V૵v5C8'E_6/26ybh ^;">ܕow0b6Y,'rYQ_W-1C(B8lqmPQfmm3('[DH"b8LRpЃPBh9jF(N:QM"h5vk(!Q]`7 @6mv-%?RLر,E>*‘L䫎! tƭ`Ie3d[ V!#BYqB&@u ^\=1I`ƘC BNHc$!a3x`Idy0š#u@g"h>s j q(@1MbZe! L`I0@B4KhUq_.+B-N|Z]7fqe\ oLp|d:c!!6Sgi憈T#yHhC:">>ǺcE*"+E:DX$48njD]0!NeLh=j g.:Z z n6<{h-=9{D4 Ԯq8|-Y{~Ҁ}KhOn|'}ߩ4((<~ 2Ku}/SQ7ݑM !Ĥy#zw+QE2s3{5~x|pj7d3}xk{k-} 0R$&~`!z ~79VtX1,z{d1ā(0 1bsHJL؄N/DH?V0Dg1 7(!p"^\]_k>"'XOWG-(9h4((k@^<@q(%*A *!wghm ϐ % ` `uJ[2w찀h32b'F&#3- LьHR#%A9W $j2 WjB+g2 wLaXS)S3ea~.r6Hѡ#9Bۘg RPݘp *,T& @, JI,ta w(-kØ26@8HSC9`XZah# *%L$q*%|&@ep" +p`}7"X8Y^[Y *( q  T9|1369ByV ꃑ\ٍ EF΅+nI+txdr*5)7yxؓk2H mEw fP~ٱ8>܄U ǀF,,0 谒Y &Hj1+F[4&T!zɏ/՗IF :FtT$lmsgGvW$ZTTCD HRCv I@oJ*im bL YIYD雒[nf4M%Hb&UL[GTxq4lfr 8DIR4 P%!Px]ԒȰYBa=zx=%Dk8 WuSu6[ mOub?YXlDM5 5`g S@Gaʍmi9czW~WD 5DRgttso%7{McLA\p@CSZ|3kxvT %s|rFEU`JU5bi HMLUAZi%]I2UObMG+bP2vVozj'4#ZǚQBRrD߄بIr 2HIl" |l[+QJŸ~(L%T--ʏù9fSO)Z4rQ鉝N!Qr + 1 +C{3};e|@(CItȮyHz^2CQ}z- 9:@{ Y.:2̌w ˳QVlz'pW:ª75˄x2ܛ|hB ^ ԇmd7-`x_94=T*6{Υ6_l˚}#5<œ} 2Ux "/S#}ҙ1/bZXZ|AϾxP8 ܱԒD} 7M52e5;*Z>`7E =!(3m57Ϫ?{[Jt<_mpS"c1lfQR'-"8NR?G҉jPـ$-R[ r` eɚp\ .'z\KPvxZS&GZb[$))(١Bh:$ OZYEAp( 2 UYPԋʒn+lB,<gp(aZ` ΂] dX*zt d$Pהˈ5b=R<ުU{a Ae I2:kӁsy3# #] YȔ$@x6 8Qt4J܎р',< @c!4b幄ַñn}yIBIDm fÇ塙NH8,Uv>firpV|!N $&aՁN]H# O Kq25i ,p.yrT^ ໜ˺>NZmp>aMOcaE C7Gh6DaMSMHeC)9GβUN<VFsYΑ&jit3 phU/ڠ 0i` ۺg}YN,5G_jwv[IObdrPsbNl^MOdbsDr Riyj#Tš6\ʌz+ Idn4PZDEQLDꪔG4f~<0tx-|hFw3˺ga«;;b lNp`TGf6ZE[^`|mtjphUtIjc\C]K Wew`<K'C\[ǣ1K\DW[ ^^bbQQQ~YQYQ~ H5*LǀÇ!ř \2rE.$8 b: ˗-ذp&ӖV\0(#JGtQS^TʳPzuiS67-m*JWNڴYxfIn"c Qms߿ ~fO=?ę@6]SXYd3٠Ө "ZYÈG;f$&?2,ss1Ҙ:MJ26*1EDqUBRG5&1i#1UO,e =t.p^kF(@dcg p d];#vB:hae(cAMkE4[mQnضH$q% L4!O:c/_1X ',BTP L]EV+ "%\ه_B)W&)Uy^SPgXc"h㣐Fڌ5c"66FOb;bY@(5J9>m CFp"%\s99!K.7#PK {W!|ҭ!.25ek.X%ojSZY9Qx Uf;-v*p`Xr9Fp@Qa2j"L `F&TI)t1Yݺ+52 /ڞ;un S -J+keu -|eMp` Zh*Y8A%k*ڏȂˠ̹`8fξ,HApŵ4' rE4}LZWn`M7rM SvFv\.m_"=h{`W?Ozhxh撗\نj< dmx3-fr^#Hτfvrf4s25ke-s"Cm{5|ZwͰk[ awq`E3яe,pۘ丸2̀CNwu@EA`"-K |hIBFDh!ո"{<7 hwTf LIZ򖸜^Fr0-)YKH`'I`28wl0˦6nz 8IrL:չ@FX+fnfLnR;$(EI=% sІ:6.}Iъ^$-6br 9j!@MjGť<6n+DOlK"q}8owp[m*,!p1f72UC#;:v FY5G@ڞY!$MR43 amyILڛshsx5n[Ben p50un?>`@f ?a!XAq"0XYH_ⷴ=jju=[UVv0 y#5>ݰ[r*t"]*m.2免ʙb{ >ͽ-2)*^g p :P=L1D Ia3 z#~8 tr _g-*c YxOlUѯ ʰ U.`\Q˦q[B߲AB0?F$RkI+wGW ծt>>Xr (gCذqZ:ͦGQN#UF, \GRР^v4el_,Nv^щ1"*zZ' MjX[OFs :莆X@.tzw K {zK TȑRJ(aRU{\ GPe]t'AA]"l6[%S3NIĦM]pn[T0x`^z![ *Μ26JH>=yӢogoTc@2~7ؐƄ1FdQ]`߁2}+~V*[yGr[k7xQ9 I]BWiO,_C^m yIgtq x {mmi`&X" {6P.vzf Wf{VE*_2}ݐi 7i 3wMVwO&LwkGxG{RK`_;c.fny %7gQ.-ݒ.>!`60 ݣ6=-V0֔Y𕏅*4^u8#@ 22d}aO QXeeqIGXJWx5ri#%ix\\gb?b0o`E'E1pf@]*P Fo#_fYvD Eud[IcaI 2ʟ>T|=7B<7i = -Bh鳤9 )ES^;69#1`?32Pd8"P@DQ8__ ~)YM aj BB$CCW-gx&ni]t#EG[)[C\6UT0 LfZd'+(?!?3Fapo@88#!өz G.՝#wa5c/B-4D^cam¨H3m0 D*i(b9`)6f9&@i #a8śS8E竷TN5c+_|G|w:P`Iuaۓbfӳp y=w9b-ˀ*a,;edc97&c;Y1V$ʡ f|p0Ɋ ŢJkMgkl۶nprMj s{lOˉ'b)~08zy LawG<Ѣ#K'ȳ~1K Z+0,Pr](~}&&>=ʹ.|ċQ> !p0r ٸ}4<KKlp}uá c8'pQ+Z̚%{9':l1Q狾4LFZ{K]k 20*|PW{ xͱ q%s,н?b0X Lѽz΂7KWɟ K7˺ bh H7 a@Bb @6,Ͳr`.d :Hz |謗\sδTɦlQE"(hjg*2萏 1H}e) r8#B[@*BKm 2l>mkb#B,@Q2{%{`6_JE`<ɔL|b :@bPJ]AMɬ|:tɻaz!'^/+ UM-|i{p qԭlG-Ԅ :0ʭ<9NM spԛ@׃@̜@aԘAmʜ} ٝͽmʙΚ}ڨڪڧ F8| ۔p2#GȐ`*Q"Y1"P]}QmQ`, ޠlYN pP8~Y3@X3{@79;m,GD1px aГaa@ MpV%_f49zm pj ){HK{vPx a=72s|r%DgnpȀP(ֶ )^{ N ib Q#Y^ C t@R 8]l 9p>s^S _^ `a; r`0m\Z7<@c<>ap/n&MPu9= Vh hY %Ɛ30a0p0 sM1(_0H-uF% ꢞu_WY@2*)^afKf@ M_pplPVp}|-~o<ГN~>3~n 箮'rS>/~ǾҮ%H1ta>o3`DH^u-P>N1g@y p1@iPe^P@ /ҍo _fpܠeNPOf@@ kn7p0QpA`ʿ,ڀ: +`6c }6O3"w m]}+~+`Fѝl`'8tttt,t,,tfftuQt,f'  ' t~Љ֋f,fQQ,疈Qf)C )Lp!6#JƂŋ3ZUAB6鐤ɒ(O5W",I rdMR_]GOh1tiJz-j `?ܠ1 hϪMK[6@p"!kd+ L(aV"[c@LD|ӡϠCfƀ3@ U Ȟ-Ҹt, hfnqY\db|0w(ɗ#`v06NG}( NTad>, * |%ʇ,YxsY!0Hr1pl22#x%\o6`v c-&*X!<@"3#~`_(]yi8`o&r#2׹FJ7nB $~H D `d*4ȜtxgYȖEg*~&@(L`acA&ePf 0ڧ)D EǬxG|q|/G k>찱&A:;l1` ꀬ|J++Bõlz~.j+ٶn' 7Ԯ+ Wlg1:ٺjP+2Cm ,ǬϬ,Юj+Gۚt.G(0M= d]f*6I$6kq?֕R=gAET|v߀.nhT@¥[T^yQ؉w砇⤗ZHzHud[LX>vh6hg}0^:+p: hK `yG8t}Ԫ/?=觏>[%`NwךrځχVvkc71vÛ<9KN8o2Ü6*z3 VЂC^'iv{gHNx@W<%mcGMzH؞9勢% +P>}XTd\fS` ?$H! }L  IA#hH3TfRLQU *TMmfm&ߨqZMC ҠwLk;Gsv\=効{RHccxFqkTŔ{d Ud󱐍,H}hP,fg \ dGKFc8 bc&&0چF& pK\Bm餙Mu^U $'&sSpjպ[$%)1x ~pw͛ͺwqk J`?4 |{ jXmfqL vCKaR){]r۰Zlmk[4hڷ! H?*w|hCR2$+ݶYNn3d:oKx1`>y9݋i}J7/]ێg0小Brv[e&ψR]R/BL_;"n ݜ;8&ӟH{jAJ^BnӬ(9kX6D5[&O7}{`_,WS}HgjmFO[;ؾm{t TR  9< MyۻrH ;YX!ݾ|;#noɒxYUUkw=݆cKe:5k\Wuh =F73l395X{n:zڠ1*?cA]6-p#wxh)ߨe']vdٵ/ _>P5q7!:d']Է{^ : S7-Щ( 7ke0Xi򷩁 gPL=?_zһܵہvN~T$Aۀ-Ãu Sf G!]d_w1z/E%XUcHl?k4jE:Dia7{m k5mYP{t~ZchuX~'x<' @G 97D-`rCnDx$TY$O^yQ Lz$K5yD}?Xg1{ngt)W;E2@Wʦ<̧@0& ( 9095h&02pr8tXvxxzȆ2dc(Y:hTGS@40r\dc#XQ6 i049XUYViWTɏ2.]8 KN3?鶄Rh()Ƈs|Ir`'9YyJp(( V$H'*-`聘syyR4 h[Pu:~@@nIXi[,(* 'dd!V#9*ٹٝy٩#@{5dw{5paHŇl(<6( *V ! ʠ  `P }2'Z] Eh4 ڢ.0#PU18Zi  4 <'jt:2n`=JLڤK99 0)&v@P(lR fdzfJQq⩘lz j#ɦ7j9@t93;RَWD$8o0"B:J9r#~pY7xp Zz <"*0$`J6 ""fp9&0ox@@$0b>"rPr"̀A  ЪkA&p}'PR@%]#1YDOf щ&qOAp7 &A [&#@3 -PwJb@u%"k'۳&kQ ̪9"f>#:׉Q`0?PȯrY8FCg# fk1 ~f! a$B@B Fzy 0PEj29Z i}+i0a˸0q{iB~0%kzd1Y щ ~387 @i ˋ:AaG2 [;,B&PBZ74q+g[;ϙ0A`~R(Ջ0khѪ"}C7!t)O;P6* A x#ɋf{;7P( $<W'l0L/l[br\[OQB6a@4ǡK00rƲ',뻀FB 1(  Y麚+ Xwt7K'Ȋ,1%,l0  ƌa[ۊgɻ|\ r9-gz:ʔ, ɛª;k2,ϐ|4<fl§llʨL[۵כȇ2CL4FG<^lуI@+R 0tpP(M ~p  y   @ z Jmj@+;ZTIӍ @Hu00Q0_j FnjPҰ~@ g-\L8t ѡV}/Yҩ -̋p֒Ҫ `BL}ҪPezFhmdPlij  ` 1 ]g < 0r a~~}. c\wH~ya]*P$#- nuB0 PA P ~ P >P`)Q@6l sS-`ӓPp@3З@tC!:ONȐt m4M۴,t  -!M i ֝mP c^Յ?~4⋀h^P c u i~(a`F'Pk(#t@&`iVEZ MvLdr4|a@7I!]1Ϗn̪̲`f`Ϯ#~q<QA |/m |E~@M @`P~YkUNv@HkT˰f/=oN8oX` (,񫞝6 !{@P{i /JA@n\ Co̲06  䅲- 5nvZC)j64gQ S։{>iN `oONoPֽY t3p쏙4|n |N6 C |^ѿYVN'?d8[Jr0./jЀO .QtQQ,YYf~~,Q~ Y-ZZTTg9l~ǭY,ӆff,tQ~ߖYt͓ft(d<@🕃D1 &">!`B.*3R…#\Li%M00ñ0c⛉* <ȱ) 'T,̀E659! l2$JFl8T`Ê꫟,, P[tXX0i6j4wP{H%eKIJtS^?u EbR T ie.MŜ>X2C#-;͂ Nc߿;t&ZixiQj+ 7d5ŖI [(7 KͰ[7T `Q GLj0 ;17JM2aC@dBT 0A$t#Gi*F/i8@OY#~84 T( );9X&`cgYYS[nQA@EQW]1Y0*}y",Ŝ9(xTp] c\6hLu ɠ]& JT @ǧIUIQ+^b{ 3 s#ZSg4sQV.%Pv avE&Wg9owVg т=nm_ʂ85t8nG-HT٠htd\- K:/!\sL [ gqbw\tm8Թ+ZCMѠ 34E4P%`&C8FƮȳC E VP)`[qm=$JTuqO!cDXP9 &(v@*7^!@ÀMAӼkhF4 ky=&1#z3PFd_ΔA`$oUV0r8Aܨ@e|4š툻AP ,0}eg~@ 0$%`]30Kab :Αb/;';s~,xYeyPB#YiyQ  (eC!N]ْ<8@ i52(S@2"/(p 1[0h7|:i*6>X23 7tFmڪ|Z"h LI1|tTeݰsx$XsQ9@.l{%mA!Z jL` 6p<Ԓq h!gpc+d@xI{xJ{}APg32c30 F`|̧.|۱ "DD B Dsa'6g6 g63pLq'` # +!%[[1P ͵2:FEj=@xF`E+"[P1`ig)9[HJ緀 ⮇0R+y@ u{Ok2m3v@ Ro3!=쓩sEۘ2`#: 6 3+oPbqRNTb1u`hG݉hm ޚ˼k>Nڳ_ڲ986%}0T5)3082 U''Mӹ TIB<1hЯuʙ)ǧ&৚[gPA$X 0 2<4\6|8:<87 3˅Cg 6-0<@R^~ͧm$Pt H +I G[>4^>A"O g-{b͸mLnQ~1=Qf $`ww l\w =`@^0ln @OqPu^z2v@D.xVЉtj+ \KM3 #>^~.B^´=3YV[1թ^~ƞ~C7n$l?}rڶ"М[^̾ڶEQNTUQw .e׮̚.r{0o>o!uA w[H{:Գȉ"}~ (&|vA"QW=ډ8Vg1~}]:L:6k3쮾=Ҋޜ 3WN+}-w6od_JI)^F+~ɗ" ԉM{#z ߸{@s:_xL2"p)q ExU 5k e|h8o$17s3eMe+b_I6~%[ ^ڇVŸ ?:͚dOIu?{{?zO[VXXccd2+L"~b&Tgg\\jT\ZTZZ kgڵT mVV ׋b<SǰCsFEp,M!|V( (S\F ܢ1mtijH(_*$#&N@i\fM)Ug W.q Zn+2`IEZu'Pb`u}K!rhӆ#ZikQ(.^xa %aF/*.hnF>#%PS\4 AXn:Q읱s۳'II'+]ӧɖ%Wsk7υ)̽]3ib먶܁d{~}v(ʵzhGgP.5A@Lese(\8mH"i$ډ-vl4&kնیۍ?M#DU\RrSyA5u\1cxl,,YP]BIߔG^~dM!% 2i3_a&ZnYr x$#"F#`8n5#& P qA&Jڲ..cwyZvsU ޕk|A&;x 1r% zٍCa2 PyE=6E*T/#>/$\QGTntH*9{0cd*ZJϰ mtW̒I= 2r\$焴Pb̠Ǟ 4 nfcr4V>4ipC CI($q.i`Ym`C `Y.7kE0B h1i/Nߏ{u|CS[7*G/-qrx41]U_" YNŖMVF6k]6 рգN5ce Bhm2z N$4*+SV/lX/Ik:5(=P⿮}-l"a|% 3MNr5=dlY1/qc$zV .{&4F:bn \}a cܭqWI"X:r@Uſnkf .qV@W7# `9pR u2Z(4;=zl9D(4ĘB$<ѥXIh5؟PJI$g72M#H@FF h4A@`X% 21'H{A=XTјrc@;**Y+2 4ohx(sj=ipYb32q% 3u +1c)kv( 6g?tCFZ7fq(KK-K L fXԦ#dNQsILei/d''WJL R\HF@0K+42 ]_B A khzUim=g0+?Jédn=[~:;pqUm(@ `+-+0[aʌ3 7L"c +&/Tf\m݈LdELԃ~~=Ϙt'\Ϛ15vY{ A" ^r>y68Lk_q+cK9:3@t>9vU3JԨiPk^:8, *6U [AkZ m` 0l?=ClB.#B԰/m?-a n -UYzK`h0Kl A!M6&Ѝ xSi;o~-unqTcϛM5Seg$,\$Ҁ[֞~pΰbdIk*Ŵ! WÔU SO}JT=j-/^ƚ$ z 96AԦ  0ZVvUm4X PHey~` -}܂h(f8 3&~{@x (MVzv{W8τ8`oZ0 cw0672z1`?d@d$@@u~fa%GeU{0[a!pDm&h |Q aRr+ u\ \bRc jvKQa2 FG%jr;%5wwwj{w?xCr6xbx4|y7y'y {[p``PpygXWypljS{uhWq 7l?qvHlgi@l&0WdjH-@l&P|XdwnvAfmGlm sT~HaĖf  0\J'U6&& =qHl JPbrԨ2PhR5 Tj@lmmFWqИo8R5Ř_D6XH.5'3;(P-g*UiR9HJ]/Mt]Q(@U/"0%x2&]8__b(%ٷ8( |fx gxw&&<]8yX0'|ȔV0i'8ŇmkX}2%P}((cdY}&pև (P}V@uW1ȇ~Vv-mɇf;ɔ7p m'yǀk~ɓLÖUi3'X8-73uX|8√;AhyL920y=' X-E1P>p 4Rpy5>!?QJS@I[>8)HryP`7=6=pd2 >i}ZX@cGj97r9 pƔ90h@|g7~vp3* gd Ň @An0yx׆L{myq9FZ~k)V:WГ@%L|9-`tr69 p逻i(psH`=9beYzyz= !Ε%bD!.ˡ3+ӥqw"91[5]p^џrpJ:6GVb&__poz7jc}6wvTU %zzc6UZMʣǔiz2@7mYXyU: jy$ D7ة8Y9}ѓhÔ lyh++ %H:{:!9::My P1].) I`m5x fyK!;o {W@ 0 ^U( 0lWiІg,y>o0y< aeD)&4&ug2 !GQbWq XH䨣:LoPo&f:u 5J(G#z !pt ֩\;L(o> %b*舋K̸n*]/i^ح#.^kD8XQeX/r Mk+P P1 1cez;ii~ iiS3f F6h0 {B("OR_RM UB^C)]Y/sC?(0Jߎ!O$X?6z`!_mfq$ $T @ efD 9a& I8~ }BC >%pi%lZT T TmT\\j\V[VXccXRXXVd2+L"~b&jPYE4T`B\(+`AZ6\CZIǑpMXr.gꄨ͛`jXA\$СT]K@ݚ$҆UmSygHQ&ğޛITR {B \N}ɓ{P"\lB&1 b:li-T2'-I(̆yΠr +}FԛJEâ3-:C3RVx8DZ=9bىi[%oOB F G?& :E YxBq4Jt< "ЂxiXlVc$N0Nzt! ILYVU%%gxPFɯ'ĩRF%i8).H8$ظǏm &0AdFX7Fa {ҹNu3f8geLprق Ao I@-\fDAhXDH%%Oz e&J~UҙN*WIsbDb4rUh[T=ep)ʛ$ɉ"y@gHÃD.f:ClTWgY  [8YNu[G=wcDC>X므 `KmE@#kaՕY Q, t -hG+ҒM-jde(DMOڗSdc`%Lc alp-+[֩`0nkA׾&΍tK]ؽ. IH4MT\@4ձ 4-xzR4`! nVˀF3h3<'j=vİΰ7 X.I&P). %0YϮV0~c.(eI4mz[xmP"EOf?fPL+{9NihC{9WozRͫRd%덯+a%h/~_zs0at`/8 V< cl#Ok 6F4N[HzH7̫!MWINhŘ%mkfƒ b7xĻ(mB*_3T(k"0ZJ|{y7|糎c3?H"tmw(4Ȕ|}< tM˅ozr,i  .CQ:a'p|:0Q4Sz!z'Rsj`+wBHU{ش{c>|'>U|t{Xp{ؤU{0A^hQ'u<8iyUv @^ײ}qi@ \SgUjցbg`xpi^f Qv8 2/@[V &uʶQfqr p@q8k AzP !}6e_gXVaeqvЋv@vU G(0ig،e8_`̷7-w$  >qgb2p2a؎$ iXgpbkx2@&ч*J[ 1_  ! #}H@`k3%ұjEIh =ֈDv 8VRR=͂ tn` fgjyljً vp]`yP=ibGaqip&2a ٘93H".a`iy i93]:&! )S~SK120P)sʹٜιab20ylj2_-@ya^Ǚ򙚴YR=R99_`z ٠^iZ aS'~ \a,ڢ.02:,:*2Й i@au9`tNФlTZVzXZ\ڥ^PnpgiRzh|xQdX KZ4 z|ڧ~:Z  @@ p/ *p*.z&-pf$0dS-- Jpt@P,J֕$Zܚ*ߊ t)iP@@, Q`zگ @B *ez"@lpXۧR, (0$&-U@PXڱ~r[Y`Tʢ9ڤ|uS֨dW+ ۸N;eP;~~.Jtf&"Zv]lkz;zj 'Q@aT?H~WrpW۽/ʸkQ=3`TɦfQ9 Q~༜{2J<,@Y഑_P*+X{| &)&'B8`, Ykl[9:oU4(l }Ln{ Q`[ɍ`v2#Z@0p`hjƸj1lZ9􈼱0 KF ̣ 8<Ĉȹ۶ۤ -9L1R|\ZK* L*|ʦʨĬ0J39T;<֪,,@ xw09Ký :<9||2Ky@9Pΐuɀop t|\Jp@Q`d ]f-pgQ`֬˺TWܫxiyoĄ,N0z<뤝۹Ql&DMtKzj 1{ 0p2:9`=;$DSW^h:IǼ{9T``*w+{.l0C;O *0dY W^ KP&0bpuˣ$+=K=ܶV><<_tKLY@w |έMm mڹkhAr1(tEUfyY]<ڤݲ=ݪZl`: 2 $ ێw["< q/Q .,[zѽ 9h lӍ[M^T! hP8]ܮkS._n! ,ު|˷hF0Pl1H}`K7tж PƋQ> =f>  ܱd/[mEgHPDɎB^~[8@]T^d닞P; á<*sP/.m)_Q03$\pν,̹ GηR.ߡlKu,[ZN e>M~"k2`FUu._m`pRk@ڑ<2@$p޵}S讍Pf-޶0,P]*ކTp^Sጏ, ~/ےžQ HQJDѾHw80o;ׅܿYz?Jb}O̽!>>SwO]$fQ@krgl4\<@M,+Q*^3`,*e*~QQ~Q,Y~,,Y~t<RUqv2+L"~b&TTZi&aY*f~~YQQ,ײm$mZT-i=3C@!%sX9M~ꄑT:>U8M>UXe~>v5 )@)@TQ J)2.ZH}L X>x#L >!UVVp{Iã,^m%scU` t0PAƜtȶR ͏CPjajʢjqfL3YriO~B{ S4MQx;Sl8, 9 4 ٳ H",*f)]Op6v$:-)20b F?-8Zl|sby(etT@+N( >&0O@,H3daArUd5p r%:Qw] 0UxdTjed]†Kr6%Y ~GטD @pQDe՝V!cYe@a$  6r#[FJ`esņa4ybRAjd@%q"gY| iX*3~Xؼ6V]oy2 C-<(&-s1[DRQuAA8fQY%Y|9KID6º!~0CE&LZb*:/͕bpA&?CGHtKWyBQ^ZLͼe1yMkѨ8eri[4 DS\ai{⩶TOEZL4XF~p 7Y*؄M_VavJ Ց)(A3FQ+$0j댝ncUr @0W2< GYpòAR.5XIzZ\ԙL9NvPoa/y RѲ&Pͬr88H d hTrϫ34lhhdUh/xM,T0Tlq@8 VE:v'oXzSOцG'(9P#x3D &ab k4b(| eYQ3*N20V:R7AX,__F0-4ipUJ2 8.#Xpxp@h^!ܱ"Cn8no 9S00DKW?vhSY–0ax[0QKAF!'O!H C 5DUHxG+˖AD9(% shX.yd".O\R-HzOU0IYKd@Wi5Bfᑛ$x80ocb y/3@@CQ(H>HR_EV@E>$0XeD6I0@ Fo𘅀";u=Y0]p_FB:[ ] t Cw 3CFOfcKXUJ2p"%Ґ,G;5VZ$ uʼnFնꩅF5gGA1 [[2"T:s_ DJ6 R'&`3hs uF$vvTTXoy3Rٖ@P!tR#B& Fٰriն5 vJUd qdM!5 QPȮt<'-<>@B=>#`pAAV`DR=T]V}!&zA'\6gs++`}D0h?=6"pRk 1~׀ ф}؈؊؈= ցѯv9#ʜٞڜ=ڞ=rڨ]ڪ+o/] ɂ"j2=]}K- =]} Е+mwBO\6QW4mG W`e~TA[ v \] ` xȰӕ[ŵ0^詾D+'oD+6.^뮾q&0\O qq2 N;n(bUwW#:D%$ERV^c..~dd"V."n,y`yXo|TZrL$vP٪)]`T@tS2$BiW02?pjj@`w^jN -DONe.k檮ElR iMv+"^ͥg[0n-"kkc3'vtDavDy0+廮m' cŞƾRv6(*[@p{Rd'Z1JD&c h0Occ@@Zy?So?v1U>X~SDp?OIЬ;AtO?ϜwJZTZTmT@$Z$\j\j\Z\[jiZ>$͇Ѓ-m\$ϤܥڤᩧVXXcX[VX[V< CftP'x(@3ZhQljRB E@I)]HRŎK;Uts@FLD%Q&(ѣH EIA#.TDIժA(+JF׳!5ѤW Qٴ=ɔ z公ùV]$9eB2 փ3졒۫R& pBn X~MAci #b#E !EI/aB&N<}RI˯ɽ믤vZ%!XͷV"p ]i‰lLZhU8 Ya!5`( x8 ^Dh)$HR9ccD4n$aA@\rI%QwLݓ#'+D^M7^O^`~aYf%\Fb'8b!^A֕GaQZIF` ("h'-rʏxD )@8*g[C䤠~$a礓P>J-M)W@y;q{7}+찿.+k&{+6Fk`B5'#m+..\H@잛"F+.gqƿ,pQpa*)hB hZd@ƐXlLtm3YLGL4j R4dUไE+%z6P?-uTO*f\[^ aSVqj{m%,-"wQ7uMnxObw;uGl [nfy%Xю*gDw 2Bl]Z#@.#-i$v8&tNF&8)#lRMiA61T@W~ l_ vMaX*}dKV6)49CF $ٕ. TnU)R[G哫t"BBe79zLrPIn iH -8zW.x+EybW]|Kw/~ۆ5kpւL;&@Qa3_m6 q4&c8 H1% . &0cxm@v%L"&0N pf4#Π&ոXvG,_~ mV1y<,!d!aՅ;B.u fxe@09JR0܃2xC:gv =Ou7J0>So7CyA>\KrĩTIZH>@wN@on*ٜ# `EԧU>4!ӻTiWm׭]dTSjrrќ3Y$] ⼁'{[/O<3<'/S|1ϮKׄO7ks<9&@=WcO<-WT.~OaKr#LֵBhcx̋Vgi۽\Ý̤{pCZ ]. !2x lۿ7HXx h 8hZ?bb+ 5(30rc`v&buk"Vx+28Q9OecC6l=6@\a}HLheHHۗ$W*e<+0~%b8dXfxhjl؆nprx3ȁc 3 0U$7F8>271.P%Vbvxh6x63&cBlƶlVH`uQ"a}og$Y[СhQ$B!1B!qp]720֌8X(,8 tJN//@s(-&8Xg ?N`NY i ِi(`&fm$;NvUfe+2&cBo::yw=0Bc_ЖJLٔNPR9TYVyXYx 1[bU ^t_dO0nop9 "c \zIwٗYɱ[4()nf]pyW`~ +tי4ewIwyywozSIR5q9Yyșʹٜ*`ةڹډ9y칞ٞ9艞lY9Z* թZzٹڡJ j Zt0R`<24Z6z8:<ڣ>@B:DZFzHZ2Lڤ31ORV TI\z^NZ:b fzRhjlڦn_*<#Pvzxz|ڧ~:Zzڨ:ZzE0E;PK5?>PK.AOEBPS/img_text/avl_prod_cmp.htm Description of the illustration avl_prod_cmp.gif

This screenshot shows Oracle Universal Installer Available Product Components Screen.

PK}PK.AOEBPS/img_text/jpub01094.htmC Description of the illustration jpub01094.eps

This is a flowchart showing inputs and outputs for the JPublisher publishing process, as described in the accompanying text. In addition to these descriptions, the graphic shows the following:

  • Input to JPublisher through the command line, properties file, or INPUT file that includes SQL object types, SQL collection types, PL/SQL packages, server-side Java classes, SELECT/UPDATE/INSERT/DELETE statements, or WSDL files.

  • The SQLJ translator, which is invoked by JPublisher, is depicted as an entity within the JPublisher product. In contrast, the Java compiler is shown as an external entity. SQLJ source files are shown as the input to the SQLJ translator and Java source files are the output. Java source files, either from the SQLJ translator or generated directly by JPublisher in some circumstances, are shown as input to the Java compiler and Java class files (.class) as the output.

  • JPublisher .class output is shown as optionally going to the database JVM or the client-side or middle-tier JVM. Classes for Web services call-outs are loaded in the database JVM by default.

  • JPublisher.sql output, which consists of PL/SQL wrappers and scripts, is shown as optionally going to the database PL/SQL engine. If this happens, it happens by default.

  • The database is shown to include the PL/SQL engine and database JVM, which includes the SQLJ run time and JDBC driver. The database is also shown to include the metadata that JPublisher checks for defintions of SQL types, PL/SQL packages, and shapes of query results.

  • User-defined classes, including subclasses of JPublisher-generated classes, are shown as going to the client-side or middle-tier JVM.

  • The client-side or middle-tier JVM is shown to include the SQLJ run time and JDBC driver.

PKqxH C PK.AOEBPS/img_text/install_loc.htm) Description of the illustration install_loc.gif

This screenshot shows Oracle Universal Installer Install Location Screen.

PKzo!PK.AOEBPS/img_text/prereq_check.htm Description of the illustration prereq_check.gif

This screenshot shows Oracle Universal Installer Product-Specific Prerequisite Check screen.

PKVQPK.AOEBPS/img_text/install.htm6 Description of the illustration install.gif

This screenshot shows Oracle Universal Installer Install Screen.

PK_HPK.AOEBPS/img_text/welcome.htm2 Description of the illustration welcome.gif

This screenshot shows the Oracle Universal Installer Welcome screen.

PKPK.AOEBPS/img_text/install_type.htm Description of the illustration install_type.gif

This screemshot shows Oracle Universal Installer Select Installation Type Screen.

PKj "PK.AOEBPS/img_text/summary.htm! Description of the illustration summary.gif

This screenshot shows Oracle Universal Installer Available Product Components Screen.

PKPK.AOEBPS/genclint.htm Generated Classes and Interfaces

5 Generated Classes and Interfaces

This chapter describes the classes, interfaces, and subclasses that JPublisher generates in the following sections:

Treatment of Output Parameters

Stored procedures called through Java Database Connectivity (JDBC) do not pass parameters in the same way as ordinary Java methods. This affects the code that you write when you call a wrapper method that JPublisher generates.

When you call an ordinary Java method, parameters that are Java objects are passed as object references. The method can modify the object.

However, when you call a stored procedure through JDBC, a copy of each parameter is passed to the stored procedure. If the procedure modifies any parameters, then a copy of the modified parameter is returned to the caller. Therefore, the before and after values of a modified parameter appear in separate objects.

A wrapper method that JPublisher generates contains JDBC statements to call the corresponding stored procedure. The parameters to the stored procedure, as declared in your CREATE TYPE or CREATE PACKAGE declaration, have the following possible parameter modes: IN, OUT, and IN OUT. Parameters that are IN OUT or OUT are returned to the wrapper method in newly created objects. These new values must be returned to the caller somehow, but assignment to the formal parameter within the wrapper method does not affect the actual parameter visible to the caller.

In Java, there are no OUT or IN OUT designations, but values can be returned through holders. In JPublisher, you can specify one of the following alternatives for holders that handle PL/SQL OUT or IN OUT parameters:

  • Arrays

  • Java API for XML-based Remote Procedure Call (JAX-RPC) holder types

  • Function returns

The -outarguments option enables you to specify which mechanism to use. This feature is particularly useful for Web services.

The following sections describe the three mechanisms:

Passing Output Parameters in Arrays

One way to solve the problem of returning output values in Java is to pass an OUT or IN OUT parameter to the wrapper method in a single-element array. Think of the array as a container that holds the parameter. This mechanism works as follows:

  1. You assign the before value of the parameter to element [0] of an array.

  2. You pass the array to your wrapper method.

  3. The wrapper method assigns the after value of the parameter to element [0] of the array.

  4. After running the method, you extract the after value from the array.

A setting of -outarguments=array, which is the default, instructs JPublisher to use this single-element array mechanism to publish any OUT or IN OUT argument.

For example:

Person [] pa = {p}; 
x.f(pa); 
p = pa[0]; 

Assume that x is an instance of a JPublisher-generated class that has the f() method, which is a wrapper method for a stored procedure that uses a SQL PERSON object as an IN OUT parameter. The PERSON type maps to the Person Java class. p is a Person instance, and pa[] is a single-element Person array.

This mechanism for passing OUT or IN OUT parameters requires you to add a few extra lines of code to your program for each parameter. As another example, consider the PL/SQL function created by the following SQL*Plus command:

SQL> CREATE OR REPLACE FUNCTION g (
            a0 NUMBER, 
            a1 OUT NUMBER, 
            a2 IN OUT NUMBER,
            a3 CLOB, 
            a4 OUT CLOB, 
            a5 IN OUT CLOB) 
     RETURN CLOB IS 
     BEGIN
            RETURN NULL;
     END;

With -outarguments=array, this is published as follows:

public oracle.sql.CLOB g (
     java.math.BigDecimal a0,
     java.math.BigDecimal a1[],
     java.math.BigDecimal a2[],
     oracle.sql.CLOB a3,
     oracle.sql.CLOB a4[],
     oracle.sql.CLOB a5[])

Problems similar to those described earlier arise when the this object of an instance method is modified.

The this object is an additional parameter, which is passed in a different way. Its mode, as declared in the CREATE TYPE statement, may be IN or IN OUT. If you do not explicitly declare the mode of the this object, then its mode is IN OUT, if the stored procedure does not return a result, or IN, if it does.

If the mode of the this object is IN OUT, then the wrapper method must return the new value of this. The code generated by JPublisher implements this functionality in different ways, depending on the situation, as follows:

  • For a stored procedure that does not return a result, the new value of this is returned as the result of the wrapper method.

    As an example, assume that the SQL object type MYTYPE has the following member procedure:

    MEMBER PROCEDURE f1(y IN OUT INTEGER);
    

    Also, assume that JPublisher generates a corresponding Java class, MyJavaType. This class defines the following method:

    MyJavaType f1(int[] y)
    

    The f1() method returns the modified this object value as a MyJavaType instance.

  • For a stored function, which is a stored procedure that returns a result, the wrapper method returns the result of the stored function as its result. The new value of this is returned in a single-element array, passed as an extra argument, which is the last argument, to the wrapper method.

    Assume that the SQL object type MYTYPE has the following member function:

    MEMBER FUNCTION f2(x IN INTEGER) RETURNS VARCHAR2;
    

    Then the corresponding Java class, MyJavaType, defines the following method:

    String f2(int x, MyJavaType[] newValue)
    

    The f2() method returns the VARCHAR2 value as a Java string and the modified this object value as an array element in the MyJavaType array.


Note:

For PL/SQL static procedures or functions, JPublisher generates instance methods, and not static methods, in the wrapper class. This is the logistic for associating a database connection with each wrapper class instance. The connection instance is used in initializing the wrapper class instance so that you are not subsequently required to explicitly provide a connection or connection context instance when calling wrapper methods.

Passing Output Parameters in JAX-RPC Holders

The JAX-RPC specification explicitly specifies holder classes in the javax.xml.rpc.holders package for the Java mapping of simple XML data types and other types. Typically, Holder is appended to the type name for the holder class name. For example, BigDecimalHolder is the holder class for BigDecimal.

Given a setting of -outarguments=holder, JPublisher uses holder instances to publish OUT and IN OUT arguments from stored procedures. Holder settings are specified in a JPublisher style file. The settings are specified in the HOLDER subtag inside the TARGETTYPE section for appropriate mapping. If no holder class is specified, then JPublisher chooses one according to defaults.

For general information about JAX-RPC and holders, refer to the Java API for XML-based RPC, JAX-RPC 1.0 specification, available at:

http://jcp.org/aboutJava/communityprocess/final/jsr101/index.html

As an example, consider the PL/SQL function created by the following SQL*Plus command:

SQL> CREATE OR REPLACE FUNCTION g (
            a0 NUMBER, 
            a1 OUT NUMBER, 
            a2 IN OUT NUMBER,
            a3 CLOB, 
            a4 OUT CLOB, 
            a5 IN OUT CLOB) 
     RETURN CLOB IS 
     BEGIN
            RETURN NULL;
     END;

Assume that the webservices10 style file contains an entry for -outarguments=holder and the following JPublisher command is used to publish the function, g():

% jpub -u scott  -s toplevel"(g)":ToplevelG -style=webservices10
Enter scott password: password

The published interface is:

public java.lang.String g
              (java.math.BigDecimal a0,
               javax.xml.rpc.holders.BigDecimalHolder _xa1_out_x,
               javax.xml.rpc.holders.BigDecimalHolder _xa2_inout_x,
               java.lang.String a3,
               javax.xml.rpc.holders.StringHolder _xa4_out_x,
               javax.xml.rpc.holders.StringHolder _xa5_inout_x)
throws java.rmi.RemoteException;

In this case, there is an extra level of abstraction. Because oracle.sql.CLOB is not supported by Web services, it is mapped to String, the JAX-RPC holder class for which is StringHolder.

Passing Output Parameters in Function Returns

You can use the -outarguments=return setting as a workaround for supporting method signatures in Web services that do not use JAX-RPC holder types or arrays. If there is no support for JAX-RPC holders, the -outarguments=return setting allows OUT or IN OUT data to be returned in function results.

Consider the PL/SQL function created by the following SQL*Plus command:

SQL> CREATE OR REPLACE FUNCTION g (
            a0 NUMBER, 
            a1 OUT NUMBER, 
            a2 IN OUT NUMBER,
            a3 CLOB, 
            a4 OUT CLOB, 
            a5 IN OUT CLOB) 
     RETURN CLOB IS 
     BEGIN
            RETURN NULL;
     END;

Assume the following JPublisher command to publish the function, g(). Although the webservices10 style file specifies -outarguments=holder, the -outarguments=return setting comes after the -style setting and, therefore, takes precedence.

% jpub -u scott  -s toplevel"(g)":ToplevelG -style=webservices10 -outarguments=return
Enter scott password: password

The JPublisher output is as follows:

SCOTT.top_level_scope
ToplevelGUser_g_Out

The JPublisher output acknowledges that it is processing the SCOTT top level and also indicates the creation of the ToplevelGUser_g_Out Java class to support output values of the g() function through return data.


Note:

  • The _g_Out appended to the user class name is according to the JPublisher naming convention used when creating a class to contain the output data in the scenario of passing output parameters in function returns. The _g reflects the name of the function being processed and the _Out reflects the OUT modifier in the corresponding PL/SQL call specification. Therefore, ToplevelGUser_g_Out is the Java type created for the output data of the g() method in the ToplevelGUser class. The user class name is according to the naming convention specified in the webservices10 style file.

  • Typically, JPublisher output reflects only the names of SQL or PL/SQL entities being processed, but there is no such entity that directly corresponds to ToplevelGUser_g_Out.


JPublisher generates the following interface to take input parameters and return output parameters:

public ToplevelGUser_g_Out g
            (java.math.BigDecimal a0,
             java.math.BigDecimal xxa2_inoutxx,
             java.lang.String a3,
             java.lang.String xxa5_inoutxx)
throws java.rmi.RemoteException;

JPublisher generates the TopLevelGUser_g_Out class as follows:

public class ToplevelGUser_g_Out{
  public ToplevelGUser_g_Out() { }
  public java.math.BigDecimal getA1Out()  { return a1_out; }
  public void setA1Out(java.math.BigDecimal a1_out) { this.a1_out = a1_out; }
  public java.math.BigDecimal getA2Inout()   { return a2_inout; }
  public void setA2Inout(java.math.BigDecimal a2_inout) 
                          { this.a2_inout = a2_inout; }
  public java.lang.String getA4Out()   { return a4_out; }}

The ToplevelGUser_g_Out return type encapsulates the values of the OUT and IN OUT parameters to be passed back to the caller of the function. As in the preceding section, oracle.sql.CLOB is mapped to String by the webservices10 style file.

Translation of Overloaded Methods

PL/SQL, like Java, lets you create overloaded methods, meaning two or more methods with the same name but different signatures. However, overloaded methods with different signatures in PL/SQL may have identical signatures in Java, especially in user subclasses. As an example, consider the following PL/SQL stored procedures:

PROCEDURE foo(x CLOB);
PROCEDURE foo(x NCHAR);

If you process these with a JPublisher setting of -style=webservices-common, then they will all have the same signature in Java:

void foo(String x);
void foo(String x);

JPublisher solves such naming conflicts by appending the first letter of the return type and the first letter of each argument type, as applicable, to the method name. If conflicts still remain, then a number is also appended. JPublisher solves the preceding conflict as follows:

void foo(String x);
void fooS(String x);

Note that PL/SQL does not allow overloading for types from the same family. The following, for example, is illegal:

PROCEDURE foo(x DECIMAL);
PROCEDURE foo(x INT);
PROCEDURE foo(x INTEGER);

Now, consider the procedures as functions instead, with return types from the same family. The following example is allowed because the argument types are different:

FUNCTION foo(x FLOAT) RETURN DECIMAL;
FUNCTION foo(x VARCHAR2) RETURN INT;
FUNCTION foo(x Student_T) RETURN INTEGER;

By default, these are mapped to Java methods as follows:

java.math.BigDecimal foo(Float x);
java.math.BigDecimal foo(String x);
java.math.BigDecimal foo(StudentT x);

JPublisher allows them all to be named foo() because now the signatures differ. However, if you want all method names to be unique, as is required for Web services, use the unique setting of the JPublisher -methods option. With -methods=unique, JPublisher publishes the methods as follows, using the naming mechanism described earlier:

java.math.BigDecimal foo(Float x);
java.math.BigDecimal fooBS(String x);
java.math.BigDecimal fooBS1(StudentT x);

Generation of SQLJ Classes

For the -methods=all setting, which is the default, or the -methods=true setting, JPublisher typically generates SQLJ classes for PL/SQL packages and object types, using both ORAData and SQLData implementations. An exception is that a SQLJ class is not generated if an object type does not define any methods, in which case the generated Java class does not require the SQLJ run time.

SQLJ classes include wrapper methods that invoke the server methods, or stored procedures, of object types and packages. This section describes how to use these classes.

This section covers the following topics:

Important Notes About Generation of SQLJ Classes

Note the following for JPublisher-generated SQLJ classes:

  • If you are generating Java wrapper classes for a SQL type hierarchy and any of the types contains stored procedures, then by default, JPublisher generates SQLJ classes for all the SQL types and not just the types that have stored procedures.


    Note:

    You have the option of explicitly suppressing the generation of SQLJ classes through the JPublisher -methods=false setting. This results in all non-SQLJ classes.

  • Classes produced by JPublisher include a release() method. If an instance of a JPublisher-generated wrapper class implicitly constructs a DefaultContext instance, then you should use the release() method to release this connection context instance when it is no longer needed. However, you can avoid this scenario by adhering to at least one of the following suggestions in creating and using the wrapper class instance:

    • Construct the wrapper class instance with an explicitly provided SQLJ connection context.

    • Associate the wrapper class instance explicitly with a SQLJ connection context instance through the setConnectionContext() method.

    • Use the static SQLJ default connection context instance implicitly for the wrapper class instance. This occurs if you do not supply any connection information.

  • In Oracle8i compatibility mode, instead of the constructor taking a DefaultContext instance or an instance of a user-specified class, there is a constructor that simply takes a ConnectionContext instance. This could be an instance of any class that implements the standard sqlj.runtime.ConnectionContext interface, including the DefaultContext class.

Use of SQLJ Classes for PL/SQL Packages

Take the following steps to use a class that JPublisher generates for a PL/SQL package:

  1. Construct an instance of the class.

  2. Call the wrapper methods of the class.

The constructors for the class associate a database connection with an instance of the class. One constructor takes a SQLJ DefaultContext instance or an instance of a class specified through the -context option when you run JPublisher. Another constructor takes a JDBC Connection instance. One constructor has no arguments. Calling the no-argument constructor is equivalent to passing the SQLJ default context to the constructor that takes a DefaultContext instance. JPublisher provides the constructor that takes a Connection instance for the convenience of JDBC programmers unfamiliar with SQLJ concepts, such as connection contexts and the default context.

The wrapper methods are all instance methods, because the connection context in the this object is used in the wrapper methods.

Because a class generated for a PL/SQL package has no instance data other than the connection context, you typically construct one class instance for each connection context that you use. If the default context is the only one you use, then you can call the no-argument constructor once.

An instance of a class generated for a PL/SQL package does not contain copies of the PL/SQL package variables. It is not an ORAData class or a SQLData class, and you cannot use it as a host variable.

Use of SQLJ Classes for Object Types

To use an instance of a Java class that JPublisher generates for a SQL object type or a SQL OPAQUE type, you must first initialize the Java object. You can accomplish this in one of the following ways:

  • Assign an already initialized Java object to your Java object.

  • Retrieve a copy of a SQL object into your Java object. You can do this by using the SQL object as an OUT argument or as the function return of a JPublisher-generated wrapper method. You can also do this by retrieving the SQL object through JDBC calls that you write. If you are in a backward-compatibility mode and use SQLJ source files directly, then you can retrieve a copy of a SQL object through the SQLJ #sql statements.

  • Construct the Java object with the no-argument constructor and set its attributes by using the setXXX() methods, or construct the Java object with the constructor that accepts values for all the object attributes. Subsequently, you must use the setConnection() or setConnectionContext() method to associate the object with a database connection before calling any of its wrapper methods. If you do not explicitly associate the object with a JDBC or SQLJ connection before calling a method on it, then it becomes implicitly associated with the SQLJ default context.

    Other constructors for the class associate a connection with the class instance. One constructor takes a DefaultContext instance or an instance of a class specified through the -context option when you run JPublisher, and one constructor takes a Connection instance. The constructor that takes a Connection instance is provided for the convenience of JDBC programmers unfamiliar with SQLJ concepts, such as connection contexts and the default context.

Once you have initialized your Java object, you can do the following:

  • Call the accessor methods of the object.

  • Call the wrapper methods of the object.

  • Pass the object to other wrapper methods.

  • Use the object as a host variable in JDBC calls. If you are in a backward-compatibility mode and use SQLJ source files directly, then you can use the object as a host variable in the SQLJ #sql statements.

There is a Java attribute for each attribute of the corresponding SQL object type, with the getXXX() and setXXX() accessor methods for each attribute. JPublisher does not generate fields for the attributes. For example, for an attribute called foo, there is a corresponding Java attribute called foo and the accessor methods, getFoo() and setFoo().

By default, the class includes wrapper methods that call the associated Oracle object methods, which reside and run on the server. Irrespective of what the server methods are, the wrapper methods are all instance methods. The DefaultContext in the this object is used in the wrapper methods.

With Oracle mapping, JPublisher generates the following methods for Oracle JDBC driver to use:

  • create()

  • toDatum()

These methods are specified in the ORAData and ORADataFactory interfaces and are generally not intended for your direct use. In addition, JPublisher generates the setFrom(otherObject), setValueFrom(otherObject), and setContextFrom(otherObject)</code> methods that you can use to copy values or connection information from one object instance to another.

Connection Contexts and Instances in SQLJ Classes

The class that JPublisher uses in creating SQLJ connection context instances depends on how you set the -context option when you run JPublisher. The following classes can be used:

  • A setting of -context=DefaultContext, which is the default setting, results in JPublisher using instances of the standard sqlj.runtime.ref.DefaultContext class.

  • A setting of a user-defined class that is in CLASSPATH and implements the standard sqlj.runtime.ConnectionContext interface results in JPublisher using instances of that class.

  • A setting of -context=generated results in the declaration of the static _Ctx connection context class in the JPublisher-generated class. JPublisher uses instances of this class for connection context instances. This is appropriate for Oracle8i compatibility mode, but generally not recommended.


Note:

It is no longer a routine, as it was in Oracle8i Database, for JPublisher to declare a _ctx connection context instance. However, this is used in Oracle8i compatibility mode, with _ctx being declared as a protected instance of the static _Ctx connection context class.

Unless you have legacy code that depends on _ctx, it is preferable to use the getConnectionContext() and setConnectionContext() methods to retrieve and manipulate connection context instances in JPublisher-generated classes.


Consider the following points in using SQLJ connection context instances or JDBC connection instances in instances of JPublisher-generated wrapper classes:

  • Wrapper classes generated by JPublisher provide a setConnectionContext() method that you can use to explicitly specify a SQLJ connection context instance. The method is defined as follows:

    void setConnectionContext(conn_ctxt_instance);
    

    This installs the passed connection context instance as the SQLJ connection context in the wrapper class instance. The connection context instance must be an instance of the class specified through the -context setting for JPublisher connection contexts, typically DefaultContext.

    Note that the underlying JDBC connection must be compatible with the connection used to materialize the database object in the first place. Specifically, some objects may have attributes that are valid only for a particular connection, such as object reference types or BLOBs.

    If you have already specified a connection context instance through the constructor, then you need not set it again using the setConnectionContext() method.


Note:

Using the setConnectionContext() method to explicitly set a connection context instance avoids the problem of the connection context not being closed properly. This problem occurs only with implicitly created connection context instances.

  • Use either of the following methods of a wrapper class instance, as appropriate, to retrieve a connection or connection context instance:

    • Connection getConnection()

    • ConnCtxtType getConnectionContext()

    The getConnectionContext() method returns an instance of the connection context class specified through the JPublisher -context setting, typically DefaultContext.

    The returned connection context instance may be either an explicitly set instance or one that was created implicitly by JPublisher.


Note:

These methods are available only in the generated SQLJ classes. If necessary, you can use the setting -methods=always to ensure that SQLJ classes are produced.

  • If no connection context instance is explicitly set for a JPublisher-generated SQLJ class, then one will be created implicitly from the JDBC connection instance when the getConnectionContext() method is called.

    In this circumstance, at the end of processing, you must use the release() method to free resources in the SQLJ run time. This prevents a possible memory leak.

The setFrom(), setValueFrom(), and setContextFrom() Methods

JPublisher provides the following utility methods in the generated SQLJ classes:

  • setFrom(anotherObject)

    This method initializes the calling object from another object of the same base type, including connection and connection context information. An existing, implicitly created connection context object on the calling object is freed.

  • setValueFrom(anotherObject)

    This method initializes the underlying field values of the calling object from another object of the same base type. This method does not transfer connection or connection context information.

  • setContextFrom(anotherObject)

    This method initializes the connection and connection context information about the calling object from the connection setting of another object of the same base type. An existing, implicitly created, connection context object on the calling object is freed. This method does not transfer any information related to the object value.

Note that there is semantic equivalence between the setFrom() method and the combination of the setValueFrom() and setContextFrom() methods.

Generation of Non-SQLJ Classes

For a -methods=false setting, or when SQL object types do not define any methods, JPublisher does not generate wrapper methods for object types. In this case, the generated class does not require the SQLJ run time during execution. Therefore, JPublisher generates non-SQLJ classes, meaning classes that do not call the SQLJ run time application programming interfaces (APIs). All this is true regardless of whether you use an ORAData implementation or an SQLData implementation.


Note:

  • For the -methods=false setting, JPublisher does not generate code for PL/SQL packages, because they are not useful without wrapper methods.

  • JPublisher generates the same Java code for reference, VARRAY, and nested table types regardless of whether the -methods option is set to false or true.


To use an instance of a class that JPublisher generates for an object type with the -methods=false setting or for a reference, VARRAY, or nested table type, you must first initialize the object.

You can initialize your object in one of the following ways:

  • Assign an already initialized Java object to your Java object.

  • Retrieve a copy of a SQL object into your Java object. You can do this by using the SQL object as an OUT argument or as the function return accessed through a JPublisher-generated wrapper method in some other class. You can also do this by retrieving the SQL object through JDBC calls that you write. If you are in a backward-compatibility mode and using SQLJ source files directly, then you can retrieve a copy of a SQL object through the SQLJ #sql statements.

  • Construct the Java object with a no-argument constructor and initialize its data, or construct the Java object based on its attribute values.

Unlike the constructors generated in SQLJ classes, the constructors generated in non-SQLJ classes do not take a connection argument. Instead, when your object is passed to or returned from a JDBC Statement, CallableStatement, or PreparedStatement object, JPublisher applies the connection it uses to construct the Statement, CallableStatement, or PreparedStatement object.

This does not mean you can use the same object with different connections at different times, which is not always possible. An object may have a subcomponent that is valid only for a particular connection, such as a reference or a BLOB.

To initialize the object data, use the setXXX() methods, if your class represents an object type, or the setArray() or setElement() method, if your class represents a VARRAY or nested table type. If your class represents a reference type, then you can construct only a null reference. All non-null references come from the database.

Once you have initialized your object, you can do the following:

  • Pass the object to wrapper methods in other classes.

  • Use the object as a host variable in JDBC calls. If you are in a backward-compatibility mode and use SQLJ source files directly, then you can use the object in the SQLJ #sql statements.

  • Call the methods that read and write the state of the object. These methods operate on the Java object in your program and do not affect data in the database. You can read and write the state of the object in the following ways:

    • For a class that represents an object type, call the getXXX() and setXXX() accessor methods.

    • For a class that represents a VARRAY or nested table, call the getArray(), setArray(), getElement(), and setElement() methods.

      The getArray() and setArray() methods return or modify an array as a whole. The getElement() and setElement() methods return or modify individual elements of the array.

      If you want to update the data in the database, then you must re-insert the Java array into the database.

  • You cannot modify an object reference, because it is an immutable entity. However, you can read and write the SQL object that it references by using the getValue() and setValue() methods.

    The getValue() method returns a copy of the SQL object that is being referenced by the object reference. The setValue() method updates a SQL object type instance in the database by taking an instance of the Java class that represents the object type as input. Unlike the getXXX() and setXXX() accessor methods of a class generated for an object type, the getValue() and setValue() methods read and write SQL objects.

    Note that both getValue() and setValue() result in a database round trip to read or write the value of the underlying database object that the reference points to.

You can use the getORADataFactory() method in the JDBC code to return an ORADataFactory object. You can pass this ORADataFactory object to the getORAData() method in the ArrayDataResultSet, OracleCallableStatement, and OracleResultSet classes in the oracle.jdbc package. Oracle JDBC driver uses the ORADataFactory object to create instances of your JPublisher-generated class.

In addition, classes representing VARRAY and nested table types have methods that implement features of the oracle.sql.ARRAY class. These methods are:

  • getBaseTypeName()

  • getBaseType()

  • getDescriptor()

However, JPublisher-generated classes for VARRAY and nested table types do not extend the oracle.sql.ARRAY class.

With Oracle mapping, JPublisher generates the following methods for Oracle JDBC driver to use:

  • create()

  • toDatum()

These methods are specified in the ORAData and ORADataFactory interfaces and are not generally intended for direct use. However, you may want to use them if converting from one object reference Java wrapper type to another.

Generation of Java Interfaces

JPublisher has the ability to generate interfaces as well as classes. This feature is especially useful for Web services, because it eliminates the necessity to manually create Java interfaces that represent the API from which WSDL content is generated.

The -sql option supports the following syntax:

-sql=sql_package_or_type:JavaClass#JavaInterface

or:

-sql=sql_package_or_type:JavaClass:JavaUserSubclass#JavaSubInterface

Whenever an interface name is specified in conjunction with a class, then the public attributes or wrapper methods or both of that class are provided in the interface, and the generated class implements the interface.

You can specify an interface for either the generated class or the user subclass, but not both. The difference between an interface for a generated base class and one for a user subclass involves Java-to-Java type transformations. Method signatures in the subclass may be different from signatures in the base class because of Java-to-Java mappings.

JPublisher Subclasses

In translating a SQL user-defined type, you may want to enhance the functionality of the custom Java class generated by JPublisher.

One way to accomplish this is to manually add methods to the class generated by JPublisher. However, this is not advisable if you anticipate running JPublisher in the future to regenerate the class. If you regenerate a class that you have modified in this way, then your changes, such as the methods you have added, will be overwritten. Even if you direct JPublisher output to a separate file, you still must merge your changes into the file.

The preferred way to enhance the functionality of a generated class is to extend the class. JPublisher has a mechanism for this, where it will generate the original base class along with a stub subclass, which you can customize as desired. Wherever the SQL type is referenced in code, such as when it is used as an argument, the SQL type will be mapped to the subclass rather than to the base class.

There is also a scenario for JPublisher-generated subclasses for Java-to-Java type transformations. You may have situations in which JPublisher mappings from SQL types to Java types use Java types unsuitable for your purposes; for example, types unsupported by Web services. JPublisher uses a mechanism of styles and style files to allow an additional Java-to-Java transformation step, to use a Java type that is suitable.

The following topics are covered in this section:

Extending JPublisher-Generated Classes

Suppose you want JPublisher to generate the JAddress class from the ADDRESS SQL object type. You also want to write a class, MyAddress, to represent ADDRESS objects, where MyAddress extends the functionality that JAddress provides.

Under this scenario, you can use JPublisher to generate both a base Java class, JAddress, and an initial version of a subclass, MyAddress, to which you can add the desired functionality. You then use JPublisher to map ADDRESS objects to the MyAddress class instead of the JAddress class.

To do this, JPublisher alters the code it generates in the following ways:

  • It generates the MyAddressRef reference class instead of JAddressRef.

  • It uses the MyAddress class, instead of the JAddress class, to represent attributes with the SQL type ADDRESS or to represent VARRAY and nested table elements with the SQL type ADDRESS.

  • It uses the MyAddress factory, instead of the JAddress factory, when the ORADataFactory interface is used to construct Java objects with the SQL type ADDRESS.

  • It generates or regenerates the code for the JAddress class. In addition, it generates an initial version of the code for the MyAddress class, which you can then modify to insert your own additional functionality. However, if the source file for the MyAddress class already exists, then it is left untouched by JPublisher.

Syntax for Mapping to Alternative Classes

JPublisher has the functionality to streamline the process of mapping to alternative classes. Use the following syntax in your -sql command-line option setting:

-sql=object_type:generated_base_class:map_class

For the MyAddress/JAddress example, it is:

-sql=ADDRESS:JAddress:MyAddress

If you were to enter the line in the INPUT file instead of on the command line, it would look like this:

SQL ADDRESS GENERATE JAddress AS MyAddress

In this syntax, JAddress is the name of the base class that JPublisher generates, in JAddress.java, but MyAddress is the name of the class that actually maps to ADDRESS. You are ultimately responsible for the code in MyAddress.java. Update this as necessary to add your custom functionality. If you retrieve an object that has an ADDRESS attribute, then this attribute is created as an instance of MyAddress. Or, if you retrieve an ADDRESS object directly, then it is retrieved into an instance of MyAddress.

Format of the Class that Extends the Generated Class

For convenience, an initial version of the user subclass is automatically generated by JPublisher, unless it already exists. This subclass is where you place your custom code. For example, the MyAddress.java file generated by JPublisher in the preceding example.

Note the following:

  • The class has a no-argument constructor. The easiest way to construct a properly initialized object is to invoke the constructor of the superclass, either explicitly or implicitly.

  • The class implements the ORAData interface or the SQLData interface. This happens implicitly by inheriting the necessary methods from the superclass.

  • When extending an ORAData class, the subclass also implements the ORADataFactory interface, with an implementation of the create() method, as shown:

    public ORAData create(Datum d, int sqlType) throws SQLException
    {
       return create(new UserClass(),d,sqlType);
    }
    

    However, when the class is part of an inheritance hierarchy, the generated method changes to protected ORAData createExact(), with the same signature and body as create().

Support for Inheritance

This section describes the inheritance support for the ORAData types and explains the following related topics:

  • How JPublisher implements support for inheritance

  • Why a reference class for a subtype does not extend the reference class for the base type, and how you can convert from one reference type to another reference type, typically a subclass or superclass

This section covers the following topics:

ORAData Object Types and Inheritance

Consider the following SQL object types:

CREATE TYPE PERSON AS OBJECT (
...
) NOT FINAL;

CREATE TYPE STUDENT UNDER PERSON (
...
);

CREATE TYPE INSTRUCTOR UNDER PERSON (
...
);

Consider the following JPublisher command to create corresponding Java classes:

% jpub -user=scott -sql=PERSON:Person,STUDENT:Student,INSTRUCTOR:Instructor -usertypes=oracle
Enter scott password: password

In this example, JPublisher generates a Person class, a Student class, and an Instructor class. The Student and Instructor classes extend the Person class, because STUDENT and INSTRUCTOR are subtypes of PERSON.

The class at the root of the inheritance hierarchy, Person in this example, contains full information for the entire inheritance hierarchy and automatically initializes its type map with the required information. As long as you use JPublisher to generate all the required classes of a class hierarchy together, no additional action is required. The type map of the class hierarchy is appropriately populated.

This section covers the following topics:

Precautions when Combining Partially Generated Type Hierarchies

If you run JPublisher several times on a SQL type hierarchy, each time generating only part of the corresponding Java wrapper classes, then you must take precautions in the user application to ensure that the type map at the root of the class hierarchy is properly initialized.

In our previous example, you may have run the following JPublisher commands:

% jpub -user=scott -sql=PERSON:Person,STUDENT:Student -usertypes=oracle
Enter scott password: password
% jpub -user=scott -sql=PERSON:Person,INSTRUCTOR:Instructor -usertypes=oracle
Enter scott password: password

In this case, you should create instances of the generated classes, at least of the leaf classes, before using these mapped types in your code. For example:

new Instructor(); // required
new Student();    // required
new Person();     // optional

Mapping of Type Hierarchies in JPublisher-Generated Code

The Person class includes the following method:

Person create(oracle.sql.Datum d, int sqlType)

This method converts a Datum instance to its representation as a custom Java object. It is called by Oracle JDBC driver whenever a SQL object declared to be a PERSON is retrieved into a Person variable. The SQL object, however, may actually be a STUDENT object. In this case, the create() method must create a Student instance rather than a Person instance.

To handle this kind of situation, the create() method of a custom Java class must be able to create instances of any subclass that represents a subtype of the SQL object type corresponding to the oracle.sql.Datum argument. This ensures that the actual type of the created Java object matches the actual type of the SQL object. The custom Java class may or may not be created by JPublisher.

However, the code for the create() method in the root class of a custom Java class hierarchy need not mention the subclasses. In fact, if it did mention the subclasses, then you would have to modify the code for the base class whenever you write or create a new subclass. The base class is modified automatically if you use JPublisher to regenerate the entire class hierarchy. But regenerating the hierarchy may not always be possible. For example, you may not have access to the source code for the Java classes being extended.

Instead, code generated by JPublisher permits incremental extension of a class hierarchy by creating a static initialization block in each subclass of the custom Java class hierarchy. This static initialization block initializes a data structure declared in the root-level Java class, giving the root class the information it needs about the subclass. When an instance of a subclass is created at run time, the type is registered in the data structure. Because of this implicit mapping mechanism, no explicit type map, such as those required in the SQLData scenarios, is required.


Note:

This implementation makes it possible to extend existing classes without having to modify them, but it also carries a penalty. The static initialization blocks of the subclasses must be processed before the class hierarchy can be used to read objects from the database. This occurs if you instantiate an object of each subclass by calling new(). It is sufficient to instantiate just the leaf classes, because the constructor for a subclass invokes the constructor for its immediate superclass.

As an alternative, you can generate or regenerate the entire class hierarchy, if it is feasible.


A

ORAData Reference Types and Inheritance

This section shows how to convert from one custom reference class to another and also explains why a custom reference class generated by JPublisher for a subtype does not extend the reference classes of the base type.

This section covers the following topics:

Casting a Reference Type Instance into Another Reference Type

Revisiting the example in "ORAData Object Types and Inheritance", PersonRef, StudentRef, and InstructorRef are obtained for strongly typed references, in addition to the underlying object type wrapper classes.

There may be situations in which you have a StudentRef instance, but you want to use it in a context that requires a PersonRef instance. In this case, use the static method, cast(), generated in strongly typed reference classes:

StudentRef s_ref = ...;  
PersonRef p_ref = PersonRef.cast(s_ref);

Conversely, you may have a PersonRef instance and know that you can narrow it to an InstructorRef instance:

PersonRef pr = ...; 
InstructorRef ir = InstructorRef.cast(pr);

Why Reference Type Inheritance Does Not Follow Object Type Inheritance

The example here helps explain why it is not desirable for reference types to follow the hierarchy of their related object types. Consider again a subset of the example given in the previous section (repeated here for convenience):

CREATE TYPE PERSON AS OBJECT (
...
) NOT FINAL;

CREATE TYPE STUDENT UNDER PERSON (
...
);

And consider the following JPublisher command:

% jpub -user=scott -sql=PERSON:Person,STUDENT:Student -usertypes=oracle
Enter scott password: password

In addition to generating the Person and Student Java types, JPublisher generates PersonRef and StudentRef types.

Because the Student class extends the Person class, you may expect StudentRef to extend PersonRef. However, this is not the case, because the StudentRef class can provide more compile-time type safety as an independent class than as a subtype of PersonRef. Additionally, a PersonRef object can perform something that a StudentRef object cannot, such as modifying a Person object in the database.

The most important methods of the PersonRef class are the following:

  • Person getValue()

  • void setValue(Person c)

The corresponding methods of the StudentRef class are as follows:

  • Student getValue()

  • void setValue(Student c)

If the StudentRef class extended the PersonRef class, then the following problems would occur:

  • Java would not permit the getValue() method in StudentRef to return a Student object when the method it overrides in the PersonRef class returns a Person object, even though this is arguably a sensible thing to do.

  • The setValue() method in StudentRef would not override the setValue() method in PersonRef, because the two methods have different signatures.

You cannot remedy these problems by giving the StudentRef methods the same signatures and result types as the PersonRef methods, because the additional type safety provided by declaring an object as a StudentRef, rather than as a PersonRef, would be lost.

Manually Converting Between Reference Types

You cannot convert one reference type to another directly, because reference types do not follow the hierarchy of their related object types. This is a limitation of JPublisher. For background information, this section explains how the generated cast() methods work to convert from one reference type to another.


Note:

It is not recommended that you follow these manual steps. They are presented here for illustration only. You can use the cast() method instead.

The following example outlines the code that could be used to convert from the XxxxRef reference type to the YyyyRef reference type:

java.sql.Connection conn = ...;  // get underlying JDBC connection
XxxxRef xref = ...;
YyyyRef yref = (YyyyRef) YyyyRef.getORADataFactory().
                create(xref.toDatum(conn),oracle.jdbc.OracleTypes.REF);

This conversion consists of two steps, each of which can be useful in its own right.

  1. Convert xref from its strong XxxxRef type to the weak oracle.sql.REF type:

    oracle.sql.REF ref  = (oracle.sql.REF) xref.toDatum(conn);
    
  2. Convert from the oracle.sql.REF type to the target YyyyRef type:

    YyyyRef yref = (YyyyRef) YyyyRef.getORADataFactory().
                              create(ref,oracle.jdbc.OracleTypes.REF);
    

Note:

This conversion does not include any type-checking. Whether this conversion is actually permitted depends on your application and on the SQL schema you are using.

Example: Manually Converting Between Reference Types

The following example, including the SQL definitions and Java code, illustrates the points of the preceding discussion.

SQL Definitions Consider the following SQL definitions:

CREATE TYPE person_t AS OBJECT (ssn NUMBER, name VARCHAR2(30), dob DATE) NOT FINAL;
/
SHOW ERRORS

CREATE TYPE instructor_t UNDER person_t (title VARCHAR2(20)) NOT FINAL;
/
SHOW ERRORS

CREATE TYPE instructorPartTime_t UNDER instructor_t (num_hours NUMBER);
/
SHOW ERRORS

CREATE TYPE student_t UNDER person_t (deptid NUMBER, major VARCHAR2(30)) NOT FINAL;
/
SHOW ERRORS

CREATE TYPE graduate_t UNDER student_t (advisor instructor_t);
/
SHOW ERRORS

CREATE TYPE studentPartTime_t UNDER student_t (num_hours NUMBER);
/
SHOW ERRORS

CREATE TABLE person_tab OF person_t;

INSERT INTO person_tab VALUES (1001, 'Larry', TO_DATE('11-SEP-60'));

INSERT INTO person_tab VALUES (instructor_t(1101, 'Smith', TO_DATE('09-OCT-1940'), 'Professor'));

INSERT INTO person_tab VALUES (instructorPartTime_t(1111, 'Myers', TO_DATE('10-OCT-65'), 'Adjunct Professor', 20));

INSERT INTO person_tab VALUES (student_t(1201, 'John', To_DATE('01-OCT-78'), 11, 'EE'));

INSERT INTO person_tab VALUES (graduate_t(1211, 'Lisa', TO_DATE('10-OCT-75'), 12, 'ICS', 
instructor_t(1101, 'Smith', TO_DATE ('09-OCT-40'), 'Professor')));

INSERT INTO person_tab VALUES (studentPartTime_t(1221, 'Dave', TO_DATE('11-OCT-70'), 13, 'MATH', 20));

JPublisher Mappings Assume the following mappings when you run JPublisher:

Person_t:Person,instructor_t:Instructor,instructorPartTime_t:InstructorPartTime,
graduate_t:Graduate,studentPartTime_t:StudentPartTime

SQLJ Class Here is a SQLJ class with an example of reference type conversion:

import java.sql.*; 
import oracle.jdbc.*; 
import oracle.sql.*; 

public class Inheritance 
{ 
  public static void main(String[] args) throws SQLException 
  { 
    System.out.println("Connecting."); 
    java.sql.DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); 
    oracle.jdbc.OracleConnection conn = 
              (oracle.jdbc.OracleConnection) java.sql.DriverManager.getConnection
              ("jdbc:oracle:oci8:@", "scott", "tiger");
    // The following is only required in 9.0.1 
    // or if the Java class hierarchy was created piecemeal 
    System.out.println("Initializing type system."); 
    new Person(); 
    new Instructor(); 
    new InstructorPartTime(); 
    new StudentT(); 
    new StudentPartTime(); 
    new Graduate(); 
    PersonRef p_ref; 
    InstructorRef i_ref; 
    InstructorPartTimeRef ipt_ref; 
    StudentTRef s_ref; 
    StudentPartTimeRef spt_ref; 
    GraduateRef g_ref; 
    OraclePreparedStatement stmt =
                (OraclePreparedStatement)conn.prepareStatement
                ("select ref(p) FROM PERSON_TAB p WHERE p.NAME=:1"); 
    OracleResultSet rs; 

    System.out.println("Selecting a person."); 
    stmt.setString(1, "Larry"); 
    rs = (OracleResultSet) stmt.executeQuery(); 
    rs.next(); 
    p_ref = (PersonRef) rs.getORAData(1, PersonRef.getORADataFactory()); 
    rs.close(); 

    System.out.println("Selecting an instructor."); 
    stmt.setString(1, "Smith"); 
    rs = (OracleResultSet) stmt.executeQuery(); 
    rs.next(); 
    i_ref = (InstructorRef) rs.getORAData(1, InstructorRef.getORADataFactory()); 
    rs.close(); 

    System.out.println("Selecting a part time instructor."); 
    stmt.setString(1, "Myers"); 
    rs = (OracleResultSet) stmt.executeQuery(); 
    rs.next(); 
    ipt_ref = (InstructorPartTimeRef) rs.getORAData
              (1, InstructorPartTimeRef.getORADataFactory()); 
    rs.close(); 

    System.out.println("Selecting a student."); 
    stmt.setString(1, "John"); 
    rs = (OracleResultSet) stmt.executeQuery(); 
    rs.next(); 
    s_ref = (StudentTRef) rs.getORAData(1, StudentTRef.getORADataFactory()); 
    rs.close(); 

    System.out.println("Selecting a part time student."); 
    stmt.setString(1, "Dave"); 
    rs = (OracleResultSet) stmt.executeQuery(); 
    rs.next(); 
    spt_ref = (StudentPartTimeRef) rs.getORAData
              (1, StudentPartTimeRef.getORADataFactory()); 
    rs.close(); 

    System.out.println("Selecting a graduate student."); 
    stmt.setString(1, "Lisa"); 
    rs = (OracleResultSet) stmt.executeQuery(); 
    rs.next(); 
    g_ref = (GraduateRef) rs.getORAData(1, GraduateRef.getORADataFactory()); 
    rs.close(); 
    stmt.close(); 

    // Assigning a part-time instructor ref to a person ref 
    System.out.println("Assigning a part-time instructor ref to a person ref"); 
    oracle.sql.Datum ref = ipt_ref.toDatum(conn); 
    PersonRef pref = (PersonRef) PersonRef.getORADataFactory(). 
                                           create(ref,OracleTypes.REF); 
    // or just use: PersonRef pref = PersonRef.cast(ipt_ref); 
    // Assigning a person ref to an instructor ref 
    System.out.println("Assigning a person ref to an instructor ref"); 
    InstructorRef iref = (InstructorRef) InstructorRef.getORADataFactory(). 
                                     create(pref.toDatum(conn), OracleTypes.REF); 
    // or just use: InstructorRef iref = InstructorRef.cast(pref); 
    // Assigning a graduate ref to an part time instructor ref. 
    // This should produce an error, demonstrating that refs 
    // are type safe. 
    System.out.println ("Assigning a graduate ref to a part time instructor ref"); 
    InstructorPartTimeRef iptref = 
                (InstructorPartTimeRef) InstructorPartTimeRef.getORADataFactory(). 
                create(g_ref.toDatum(conn), OracleTypes.REF); 
    // or just use: InstructorPartTimeRef iptref = 
    // InstructorPartTimeRef.cast(g_ref); 
    conn.close(); 
  } 
} 

SQLData Object Types and Inheritance

If you use the JPublisher -usertypes=jdbc setting instead of -usertypes=oracle, then the custom Java class generated by JPublisher implements the standard SQLData interface instead of the Oracle ORAData interface. The standard SQLData methods, readSQL() and writeSQL(), provide functionality equivalent to the ORAData/ORADataFactory methods, create() and toDatum(), for reading and writing data.

When JPublisher generates SQLData classes corresponding to a SQL hierarchy, the Java types follow the same hierarchy as the SQL types. This is similar to the case when JPublisher generates ORAData classes corresponding to a hierarchy of SQL object types. However, SQLData implementations do not offer the implicit mapping intelligence that JPublisher automatically generates in ORAData classes.

In a SQLData scenario, you must manually provide a type map to ensure correct mapping between SQL object types and Java types. In a JDBC application, you can properly initialize the default type map for your connection or you can explicitly provide a type map as a getObject() input parameter.

In addition, note that there is no support for strongly typed object references in an SQLData implementation. All object references are weakly typed java.sql.Ref instances.

Effects of Using SQL FINAL, NOT FINAL, NOT INSTANTIABLE

This section discusses the effect of using the SQL modifiers FINAL, NOT FINAL, or NOT INSTANTIABLE on JPublisher-generated wrapper classes.

Using the SQL modifier FINAL or NOT FINAL on a SQL type or on a method of a SQL type has no effect on the generated Java wrapper code. This ensures that, in all cases, JPublisher users are able to customize generated Java wrapper classes by extending the classes and overriding the generated behavior.

Using the NOT INSTANTIABLE SQL modifier on a method of a SQL type results in no code being generated for that method in the Java wrapper class. Therefore, to call such a method, you must cast to some wrapper class that corresponds to an instantiable SQL subtype.

Using NOT INSTANTIABLE on a SQL type results in the corresponding wrapper class being generated with protected constructors. This will remind you that instances of that class can be created only through subclasses that correspond to the instantiable SQL types.

PKBAPK.A OEBPS/toc.ncx ? Oracle® Database JPublisher User's Guide, 11g Release 2 (11.2) Cover Table of Contents List of Figures List of Tables Oracle Database JPublisher User's Guide, 11g Release 2 (11.2) Preface Introduction to JPublisher Using JPublisher Data Type and Java-to-Java Type Mappings Additional Features and Considerations Generated Classes and Interfaces Command-Line Options and Input Files Generated Code Examples Troubleshooting Index Copyright PKTlJ PK.AOEBPS/content.opf 3 Oracle® Database JPublisher User's Guide, 11g Release 2 (11.2) en-US E10587-05 Oracle Corporation Oracle Corporation Oracle® Database JPublisher User's Guide, 11g Release 2 (11.2) 2011-08-10T14:47:34Z Describes the JPublisher utility useful for Java programmers who want classes in their applications to correspond to SQL or PL/SQL entities or server-side Java classes. PKJ` PK.A OEBPS/lof.htm= List of Figures PKPK.AOEBPS/dcommon/prodbig.gif GIF87a!!!)))111BBBZZZsss{{ZRRcZZ!!1!91)JB9B9)kkcJJB991ssc絽Zcc!!{祽BZc!9B!c{!)c{9{Z{{cZB1)sJk{{Z{kBsZJ91)Z{!{BcsRsBc{9ZZk甽kBkR!BZ9c)JJc{!))BZks{BcR{JsBk9k)Zck!!BZ1k!ZcRBZcZJkBk1Z9c!R!c9kZRZRBZ9{99!R1{99R{1!1)c1J)1B!BJRkk{ƽ絵ތkk絵RRs{{{{JJsssBBkkk!!9ss{{ZZssccJJZZRRccRRZZ))cBBJJ99JJ!!c11991199Z11!c!!))Z!!!1BRck{)!cJBkZRZ,HP)XRÇEZ֬4jJ0 @ "8pYҴESY3CƊ@*U:lY0_0#  5tX1E: C_xޘeKTV%ȣOΏ9??:a"\fSrğjAsKJ:nOzO=}E1-I)3(QEQEQEQEQEQEQE֝Hza<["2"pO#f8M[RL(,?g93QSZ uy"lx4h`O!LŏʨXZvq& c՚]+: ǵ@+J]tQ]~[[eϸ (]6A&>ܫ~+כzmZ^(<57KsHf妬Ϧmnẁ&F!:-`b\/(tF*Bֳ ~V{WxxfCnMvF=;5_,6%S>}cQQjsOO5=)Ot [W9 /{^tyNg#ЄGsֿ1-4ooTZ?K Gc+oyڙoNuh^iSo5{\ܹ3Yos}$.nQ-~n,-zr~-|K4R"8a{]^;I<ȤL5"EԤP7_j>OoK;*U.at*K[fym3ii^#wcC'IIkIp$󿉵|CtĈpW¹l{9>⪦׺*ͯj.LfGߍԁw] |WW18>w.ӯ! VӃ :#1~ +މ=;5c__b@W@ +^]ևՃ7 n&g2I8Lw7uҭ$"&"b eZ":8)D'%{}5{; w]iu;_dLʳ4R-,2H6>½HLKܹR ~foZKZ࿷1[oZ7׫Z7R¢?«'y?A}C_iG5s_~^ J5?œ tp]X/c'r%eܺA|4ծ-Ե+ْe1M38Ǯ `|Kյ OVڅu;"d56, X5kYR<̭CiطXԮ];Oy)OcWj֩}=܅s۸QZ*<~%뺃ȶp f~Bðzb\ݳzW*y{=[ C/Ak oXCkt_s}{'y?AmCjޓ{ WRV7r. g~Q"7&͹+c<=,dJ1V߁=T)TR՜*N4 ^Bڥ%B+=@fE5ka}ędܤFH^i1k\Sgdk> ֤aOM\_\T)8靠㡮3ģR: jj,pk/K!t,=ϯZ6(((((((49 xn_kLk&f9sK`zx{{y8H 8b4>ÇНE|7v(z/]k7IxM}8!ycZRQ pKVr(RPEr?^}'ðh{x+ՀLW154cK@Ng C)rr9+c:׹b Жf*s^ fKS7^} *{zq_@8# pF~ [VPe(nw0MW=3#kȵz晨cy PpG#W:%drMh]3HH<\]ԁ|_W HHҡb}P>k {ZErxMX@8C&qskLۙOnO^sCk7ql2XCw5VG.S~H8=(s1~cV5z %v|U2QF=NoW]ո?<`~׮}=ӬfԵ,=;"~Iy7K#g{ñJ?5$y` zz@-~m7mG宝Gٱ>G&K#]؃y1$$t>wqjstX.b̐{Wej)Dxfc:8)=$y|L`xV8ߙ~E)HkwW$J0uʟk>6Sgp~;4֌W+חc"=|ř9bc5> *rg {~cj1rnI#G|8v4wĿhFb><^ pJLm[Dl1;Vx5IZ:1*p)إ1ZbAK(1ׅ|S&5{^ KG^5r>;X׻K^? s fk^8O/"J)3K]N)iL?5!ƾq:G_=X- i,vi2N3 |03Qas ! 7}kZU781M,->e;@Qz T(GK(ah(((((((Y[×j2F}o־oYYq $+]%$ v^rϭ`nax,ZEuWSܽ,g%~"MrsrY~Ҿ"Fت;8{ѰxYEfP^;WPwqbB:c?zp<7;SBfZ)dϛ; 7s^>}⍱x?Bix^#hf,*P9S{w[]GF?1Z_nG~]kk)9Sc5Ո<<6J-ϛ}xUi>ux#ţc'{ᛲq?Oo?x&mѱ'#^t)ϲbb0 F«kIVmVsv@}kҡ!ˍUTtxO̧]ORb|2yԵk܊{sPIc_?ħ:Ig)=Z~' "\M2VSSMyLsl⺿U~"C7\hz_ Rs$~? TAi<lO*>U}+'f>7_K N s8g1^CeКÿE ;{+Y\ O5|Y{/o+ LVcO;7Zx-Ek&dpzbӱ+TaB0gNy׭ 3^c T\$⫫?F33?t._Q~Nln:U/Ceb1-im WʸQM+VpafR3d׫é|Aү-q*I P7:y&]hX^Fbtpܩ?|Wu󭏤ʫxJ3ߴm"(uqA}j.+?S wV ~ [B&<^U?rϜ_OH\'.;|.%pw/ZZG'1j(#0UT` Wzw}>_*9m>󑓀F?EL3"zpubzΕ$+0܉&3zڶ+jyr1QE ( ( ( ( ( ( ( (UIdC0EZm+]Y6^![ ԯsmܶ捆?+me+ZE29)B[;я*wGxsK7;5w)}gH~.Ɣx?X\ߚ}A@tQ(:ͧ|Iq(CT?v[sKG+*רqҍck <#Ljα5݈`8cXP6T5i.K!xX*p&ќZǓϘ7 *oƽ:wlຈ:Q5yIEA/2*2jAҐe}k%K$N9R2?7ýKMV!{W9\PA+c4w` Wx=Ze\X{}yXI Ү!aOÎ{]Qx)#D@9E:*NJ}b|Z>_k7:d$z >&Vv󃏽WlR:RqJfGإd9Tm(ҝEtO}1O[xxEYt8,3v bFF )ǙrPNE8=O#V*Cc𹾾&l&cmCh<.P{ʦ&ۣY+Gxs~k5$> ӥPquŽўZt~Tl>Q.g> %k#ú:Kn'&{[yWQGqF}AЅ׮/}<;VYZa$wQg!$;_ $NKS}“_{MY|w7G!"\JtRy+贾d|o/;5jz_6fHwk<ѰJ#]kAȎ J =YNu%dxRwwbEQEQEQEQEQEQEQEQEQE'fLQZ(1F)hQ@X1KEQE-Q@ 1KE3h=iPb(((1GjZ(-ʹRPbR@ 1KE7`bڒyS0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?l:ϊw "{{-3j3%{sj~2= 7 ~MڅKrHb|P3 r=Ҁ +Ş/$iu7=q2dԂxn⸷9$l]H #WI񯄴;\[ݚD8C3p&0U9^AnK vI+!I8>5(zqj03Y.X ,@85ߛ8>pq8=} \xmm常8` $Q@$v7zwp]ɝA GX;y_]覮O&4 SPtY.X),@84U=7Vuv K4,$g{@<+uqtiGw3; I@ORմn5MBp%8'ƫ%u6uBJrHRN2@ϸ J(9i[[m~>b'A" IY޻!%d|>EmۼGf !пJ$@%O`#iZρ|G42>je27 #$O$dWq7AEO +Iˆ?t|ۑq@_(*?mr& jYٛx%1 $+  - n  So'u7>V78q |gcS\i,Ʉ4P6PdpI#?O x~/S<4ȌG8foN߇֗fFseq#H|I%Y 'mc',xOú:aIG=N==Ɓ&ȎNrFEc?O5 t>,T C²訨?k@y$n?s|}ݞ|͜3_OiSA(^\C&_-f ;g 29 jIĞտ4_.XYH|x|۸>1K |,㺆JH8BQ :w]ý?~!դEnX.ni^6v!c`5mEH{kiDHvʐxc8#.z^ῇ~%}H,hL b:?k^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ogw?=0v_JI|<{'n?zOMtݭ>r+!@>®QEps}sq,Gs2($WGչ5oXk6D46h$m*( gCC=ad3F=UN`k+FKJ%ԑY,BA#uQWQEs~%_qƻu<R9m'8%32q; 4sHdpX/[x]ȧhldt]=}^FSfxs\\ki$ ,W c2ztŠ7 xG:d4i$ +m(;s5V:qjv&b~? 90E\8{#Ð< d9rO^㎽k-h:YZukpā˷Lu(O;KhvPb]tC0N8ïVh$];<W!;qx!(T)$r(eu#x 1\<>\K;v09v̊ 9UQwP=7ItkvK˴vJ[dg Eğonoqg=}MhP~itˋ{>Xē'ZQ@,;9, 1"6#*x8 ¸#Ð< d9rO^㎽k1 h_~E֩/xkc1 rjƹ\__İ4IQv lJpcCk8{#Ð< d9rO^㎽k߅oXhvdS3'e'ʋ h֞(,{5{3yw N(/[ދ;#Y/# цm H<J~O@&p'I;={:M;zCS̵h_idָ | ƞu?kZG (-aqE{&:OzݽwmަR8fdỲa8a#תW6&Wv]?5fVB0i1J5kׇ~IuK5[qDK]ݷq==+O_=/=R<g+e.RCdrx5 ѦY tIh!ڪH…rp:J?<%.薐_xUcg ^@~\@ӿkPmFa+rŞ_0^ĝn#k鶓kd\ g qՍ?|Xl$Z1ܤN#j;eU@1SVԡѴkRdh,丑cTR 3+᣼@sCh(?$](<RA\< _|1h>Wm6pzW: *OꏋPTz +B {DoF?ppt|oIiɨZfn0y7*X ]qd OR7U󦃤BXcN QE~49C]K?NK>N F_/}#?<%j>mHaOe*Ttd^I^?G<+ +,֩·rZZΓP.O@%Yӻ/LӾӠxU Q~c .V HW\?lϿ{=8p(((((((((((((((( /[ mt=C̸ ѲB1m,z^k4V\=2;;ч /,;9, 1"6#*x8 ¼yU.ecAp 7=y'K hZ1s\fdFtl) pAXu]LD׮m skUoԀs)?x2&G6w'<.r Pv.yV#:[iՌwvbTYH*z8$t&8=gí_N}N(m7{cw3F3פh<-ih%1YǠ'@(O3a꺭X$jXTAS3?~{N{_:oNVYdp+ xOm~v#ȪOQ7|3>x#G涻:RSЮ 9"(62@ξ YRY,QFU?tn}IH<9x[K]7E9}KcԳ1%AOPx#Ƌ#UXr(f`noDlKR}XYvrYAwk&7xCWK}߲rmln<>35My I\$NU #1PI=&>:Ý.c[Ck6ޱʑ0? u ռG4I#C+ qWwO mA”L8.䞾P!|COs۴:r7|Of'E:cCK81oЬ_u=^ ŚH]K'*@x8䐏3g h(u& x).͉nuciwfm͝l'#@#P㼰5[Y3h.? y/[Z֮ k]$Ȱ~b >Hr;Eg:6keKfw,GqTѺ2p:rI&^<o<N!f$s S@jl::\j&eʦrG܁U1_k? W:mݾ8W 4 WP\xW_)+վxWYoKCYYn$c 384KIoQ%zx3%zì]H^o#F@`IgO4 `q |߄|GiX^]ZؓC@{iŸ|'MLH4U{e6s^[c$qϪ_k^ɭ_ }PiR39ssX<FM _MYJ|d dk'/[˪MZ+d,lcԡ$`(X9#:Jg_5Ku`5]` 5lfosQ^oS:ϋy^}=AW< 2Տ^@)35ƕHy7:q }zz5?wyWZ}>7;F$EPExu|.o+즞&HpUpqkCk6$hWـ$+Xt=/:sj^ڶNɓ;InS[8> |>tep$Ԑsʳ؂z("@TP0%PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPn\;*T. \>o[\֗VF=Y,>VRQK? "]Ywu6-NMx$ATT?8㞃ᇋOQ\08A+:7O|5~5o[&Md"'B.f21#%FGce{Nş AW>կ}?ixz¿}u E#4r8z ]SY|zǻR1}x{c9>s9/k?=OƑB]2Aۛ9`(g'dQWW?O5 `?$](<R?InQtyZ襠(_xzm"|D/"!/ƀ0g{g3| ݿ廻!_,XI'P@?JwWݟ}n}~' پO(~lls)d((((((((((((((((((a_JC[Gwim^3ڻ (?P/Zn6y>1VS|x_9^6NUGCنOAp״6?ĽfOGc+', dfxKW7wZ[$#88,rO(?N/>(j4?-~F<Uhx_9^6NUGCنOAp״6?ĽfOGc+', dfxKW7wZ[$#88,rO(/g}o =[ún3k>cԣX6͜9-suK [jàY`!rX'nFk(n_X|>\Z%6,bc 'r# SXF>#nm2$Euឋ yuNT!arzd S}/Z͵Fҗ;Ur e)d@½INѬl.伞8;eP rHSשP|&g%VLoxd3 оxDtdX}dƄ~qHq1ڽbmL|!}}jyvȯr3޴4-3fya۷~ 83ТSO[!\ *_t  Exr%*_}!#U #4 & ֩3|b]L ]t b+Da&R_2lEٱZ`aC)/яmvUkS r(-iPE Vv_{z GLt\2s!F A#葡JY r|AA,hB}q|B`du }00(䡆<pb,G+oB C0p/x$…– ]7 @2HFc ) @AD \0 LHG',(A` `@SC)_" PH`}Y+_|1.K8pAKMA @?3҄$[JPA)+NH I ,@8G0/@R T,`pF8Ѓ)$^$ DDTDlA@ s;PKPK.AOEBPS/dcommon/darbbook.cssPKPK.A!OEBPS/dcommon/O_signature_clr.JPG"(JFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?O '~MQ$Vz;OlJi8L%\]UFjޙ%ԯS;rA]5ފ<׈]j7Ouyq$z'TQuw7Ŀ KX߁M2=S'TQt?.5w'97;~pq=" ~k?`'9q6 E|yayM^Om'fkC&<5x' ?A?Zx'jß={=SßM gVC.5+Hd֪xc^)Җufz{Cީ|D Vkznq|+Xa+{50rx{|OG.OϞ~f/ xxX[2H )c+#jpUOZYX\=SG ߨC|K@;_߆'e?LT?]:?>w ڔ`D^So~xo[Ӡ3i7B:Q8 Vc-ďoi:FM292~y_*_闱YN\Fr=xZ3鳎OwW_QEzW~c]REeaSM}}Hӏ4&.E]u=gMѠ+mF`rNn$w9gMa꺢nTuhf2Xv>އ a(Û6߭?<=>z'TQuw7Ŀ KX߁M2=S'TQt?.5Kko\.8S$TOX߀Gw?Zx汴X)C7~.i6(Щ=+4{mGӭ¸-]&'t_kV*I<1)4thtIsqpQJ+> \m^[aJ5)ny:4o&QEnyAEPEEss 72,PDۢ׃K W{Wjr+wگ iM/;pd?~&?@;7E4gv8 $l'z'TQuw7Ŀ Gֱ=ɿ&G?. iR(5W*$|?w᫼gkmIbHe/_t>tg%y.l}N5[]+Mk0ĠeHdPrsst'UiC,y8`V%9ZIia|ܪvi מYG,o}+kk{YbyIeb*sAtի82zWoEK5z*o-eo;n(P u-I)4Š(HQEQEQEQEhz(X/Đ?}Bk˩ ݏrk0]4>8XzV? }6$}d^F>nU K ?Bտk_9׾x~w'ߞ  uDŽtL ؈5c-E/"|_Oo.IH쐍=i*Iw5(ںw?t5s.)+tQ2dUt5Vĺ.jZ"@IRrZƅY4ߡ_;}ų(KyQf1Aǵt?sZg+?F5_oQR&Dg߿]6FuRD u>ڿxl7?IT8'shj^=.=J1rj1Wl$얲cPx;E,p$֟ˏkw qg"45(ǛkV/=+ũ)bYl~K#˝J_כ5&\F'I#8/|wʾ_Xj Q:os^T1.M_|TO.;?_  jF?g N 8nA2F%i =qW,G=5OU u8]Rq?wr'˻S+۾.ܼ 87Q^elo/T*?L|ۚ<%<,/v_OKs B5f/29n0=zqQq(ª=VX@*J(э(f5qJN_EVǞQEOuoѕOuoa5}gO?:߂8Wא|cڽ~]N&O( (<]>͠@VQ=^~U ̴m&\խ5i:}|}r~9՝f}_>'vVֲ$~^f30^in{\_.O F8to}?${φ|#x^#^n~w=~k~?'KRtO.㌡h![3Zu*ٷճ(ԟ]z_/W1(ԟ]v~g|Yq<ז0 ; b8֮s,w9\?uEyStKaª@\,)) (!EPEPEPEPEPzѧts{v>C/"N6`d*J2gGӧWqBq_1ZuΓ\X]r?=Ey88Mp&pKtO-"wR2 K^-Z< \c>V0^@O7x2WFjs<׻kZ(<Т(OFw/6$1[:ޯԯ#q~4|,LVPem=@=YLUxӃV}AUbcUB.Ds5*kٸAeG>PJxt͝ b88?*$~@ׯD VkraiJs}Q.20x&mXξ,Z]“A-J#`+-E/"<]\a'tZGy.(|lދ~gMK OZdxDŽU9T6ϯ^<Ϡt5CZ]].t۫S=s`ڳ%8iVK:nqe+#<.T6U>zWoy3^I {F?J~=G}k)K$$;$de8*G Uӟ4Ocºw}|]4=ݣ\x$ʠms?q^ipw\"ȿPs^Z Q_0GڼU.t}ROM[G#]8wٞ ӫ87}Cgw vHȩBM55vof =A_٭`Ygx[6 P,5}>蚊(0(+?>+?> k|TuXq6_ +szk :u_ Z߶Ak_U}Jc2u/1[_»ݸG41-bሬ۴}}Eȹפ_c?5gi @cL\L<68hF_Ih>X4K7UТ sMj =J7CKo>Օ5s:߀t ~ηaٿ?|gdL8+gG%o?x`دOqȱwc¨&TW_V_aI=dpG!wu۞սZ1yL50$(l3(:~'ַo A}a3N*[0ǭ HKQV}G@֜$ 9of$ArNqUOgË05#m?D)^_h//5_/<?4}Jį+GkpG4"$ r| >S4Ђ"S 1%R:ȝ 8;PKPz PK.AOEBPS/dcommon/feedback.gif7GIF89a'%(hp|fdx?AN5:dfeDGHɾTdQc`g*6DC\?ؘ||{;=E6JUՄfeA= >@,4`H.|`a (Q 9:&[|ځ,4p Y&BDb,!2@, $wPA'ܠǃ@CO~/d.`I @8ArHx9H75j L 3B/` P#qD*s 3A:3,H70P,R@ p!(F oԥ D;"0 ,6QBRɄHhI@@VDLCk8@NBBL2&pClA?DAk%$`I2 #Q+l7 "=&dL&PRSLIP)PɼirqМ'N8[_}w;PK-PK.AOEBPS/dcommon/booklist.gifGIF89a1޵֥΄kZ{Jk1Rs!BZ)B),@I9Z͓Ca % Dz8Ȁ0FZЌ0P !x8!eL8aWȠFD(~@p+rMS|ӛR$ v "Z:]ZJJEc{*=AP  BiA ']j4$*   & 9q sMiO?jQ = , YFg4.778c&$c%9;PKː5PK.AOEBPS/dcommon/cpyr.htm1 Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2012, Oracle and/or its affiliates. All rights reserved.

Trademark Notice

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.

Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.

License Restrictions Warranty/Consequential Damages Disclaimer

This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.

Warranty Disclaimer

The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please report them to us in writing.

Restricted Rights Notice

If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the following notice is applicable:

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

Hazardous Applications Notice

This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in dangerous applications.

Third-Party Content, Products, and Services Disclaimer

This software or hardware and documentation may provide access to or information on content, products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.

Alpha and Beta Draft Documentation Notice

If this document is in prerelease status:

This documentation is in prerelease status and is intended for demonstration and preliminary use only. It may not be specific to the hardware on which you are using the software. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to this documentation and will not be responsible for any loss, costs, or damages incurred due to the use of this documentation.

Oracle Logo

PKN61PK.AOEBPS/dcommon/masterix.gif.GIF89a1ޜΌscJk1Rs!Bc1J),@IS@0"1 Ѿb$b08PbL,acr B@(fDn Jx11+\%1 p { display: none; } /* Class Selectors */ .ProductTitle { font-family: sans-serif; } .BookTitle { font-family: sans-serif; } .VersionNumber { font-family: sans-serif; } .PrintDate { font-family: sans-serif; font-size: small; } .PartNumber { font-family: sans-serif; font-size: small; } PKeӺ1,PK.AOEBPS/dcommon/larrow.gif#GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШtpHc`  өb[.64ꑈ53=Z]'yuLG*)g^!8C?-6(29K"Ĩ0Яl;U+K9^u2,@@ (\Ȱ Ë $P`lj 8x I$4H *(@͉0dа8tA  DсSP v"TUH PhP"Y1bxDǕ̧_=$I /& .)+ 60D)bB~=0#'& *D+l1MG CL1&+D`.1qVG ( "D2QL,p.;u. |r$p+5qBNl<TzB"\9e0u )@D,¹ 2@C~KU 'L6a9 /;<`P!D#Tal6XTYhn[p]݅ 7}B a&AƮe{EɲƮiEp#G}D#xTIzGFǂEc^q}) Y# (tۮNeGL*@/%UB:&k0{ &SdDnBQ^("@q #` @1B4i@ aNȅ@[\B >e007V[N(vpyFe Gb/&|aHZj@""~ӎ)t ? $ EQ.սJ$C,l]A `8A o B C?8cyA @Nz|`:`~7-G|yQ AqA6OzPbZ`>~#8=./edGA2nrBYR@ W h'j4p'!k 00 MT RNF6̙ m` (7%ꑀ;PKl-OJPK.AOEBPS/dcommon/index.gifGIF89a1޵ΥΥ{sc{BZs,@IM" AD B0 3.R~[D"0, ]ШpRNC  /& H&[%7TM/`vS+-+ q D go@" 4o'Uxcxcc&k/ qp zUm(UHDDJBGMԃ;PK(PK.AOEBPS/dcommon/bookbig.gif +GIF89a$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9B!& Imported from GIF image: bookbig.gif,$!!!)))111999BBBJJJRRRZZZccckkksss{{{skkB991)))!!B11))1!JB9B9!!cZ9ƭƽssk{ZZRccZRRJJJBBB9c!!ν)1)k{s絽ƌkssֽZccJRRBJJ{9BB)11)99!!))11!!k!JZ!)RcJccBcs)1c)JZ!BR!)BZ)99J!Rk9!c11B)Z{)9Bkc1kB9BZ!Z{9Rs)Jkksk9kB1s1Jk9Rƥc{k9s)Z{1k91)s1Rk)Jc1J!))BZ!1k{csc{)19B!)Bcsc{ksc{kZs!RkJkJkքc{9Zks{ck9R)Bks9R9R1J!)Z1B!)c)9)99BR19kksBBJcc{ccBBZ))9kk!!199c11ZBB{9!!R!!Z!!c))!!kR!!s!!BcksRZ1c9B)R91c1)Z!R9B9k1)RcZ{)!1B9JB9B)!)J9BH`\Ȑ:pظа"A6DBH,V@Dڹ'G"v Æ ܥ;n;!;>xAܽ[G.\rQC wr}BŊQ A9ᾑ#5Y0VȒj0l-GqF>ZpM rb ;=.ސW-WѻWo ha!}~ْ ; t 53 :\ 4PcD,0 4*_l0K3-`l.j!c Aa|2L4/1C`@@md;(H*80L0L(h*҇҆o#N84pC (xO@ A)J6rVlF r  fry†$r_pl5xhA+@A=F rGU a 1х4s&H Bdzt x#H%Rr (Ѐ7P`#Rщ'x" #0`@~i `HA'Tk?3!$`-A@1l"P LhʖRG&8A`0DcBH sq@AXB4@&yQhPAppxCQ(rBW00@DP1E?@lP1%T` 0 WB~nQ@;PKGC PK.AOEBPS/dcommon/rarrow.gif/GIF87a絵ƌֵƽ{{ss֜ƔZZ{{{{ZZssZZccJJJJRRBBJJJJ991111))!!{,@pH,Ȥrl:ШLlԸ NCqWEd)#34vwwpN|0yhX!'+-[F 'n5 H $/14w3% C .90" qF 7&E "D mnB|,c96) I @0BW{ᢦdN p!5"D`0 T 0-]ʜ$;PKJV^PK.AOEBPS/dcommon/mix.gifkGIF89aZZZBBBJJJkkk999sss!!!111cccֽ{{{RRR)))猌ƭ{s{sks!,@@pH,B$ 8 t:<8 *'ntPP DQ@rIBJLNPTVEMOQUWfj^!  hhG H  kCúk_a Ǥ^ h`B BeH mm  #F` I lpǎ,p B J\Y!T\(dǏ!Gdˆ R53ټ R;iʲ)G=@-xn.4Y BuU(*BL0PX v`[D! | >!/;xP` (Jj"M6 ;PK枰pkPK.AOEBPS/dcommon/doccd_epub.jsM /* Copyright 2006, 2012, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2012.3.17 */ function addLoadEvent(func) { var oldOnload = window.onload; if (typeof(window.onload) != "function") window.onload = func; else window.onload = function() { oldOnload(); func(); } } function compactLists() { var lists = []; var ul = document.getElementsByTagName("ul"); for (var i = 0; i < ul.length; i++) lists.push(ul[i]); var ol = document.getElementsByTagName("ol"); for (var i = 0; i < ol.length; i++) lists.push(ol[i]); for (var i = 0; i < lists.length; i++) { var collapsible = true, c = []; var li = lists[i].getElementsByTagName("li"); for (var j = 0; j < li.length; j++) { var p = li[j].getElementsByTagName("p"); if (p.length > 1) collapsible = false; for (var k = 0; k < p.length; k++) { if ( getTextContent(p[k]).split(" ").length > 12 ) collapsible = false; c.push(p[k]); } } if (collapsible) { for (var j = 0; j < c.length; j++) { c[j].style.margin = "0"; } } } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(compactLists); function processIndex() { try { if (!/\/index.htm(?:|#.*)$/.test(window.location.href)) return false; } catch(e) {} var shortcut = []; lastPrefix = ""; var dd = document.getElementsByTagName("dd"); for (var i = 0; i < dd.length; i++) { if (dd[i].className != 'l1ix') continue; var prefix = getTextContent(dd[i]).substring(0, 2).toUpperCase(); if (!prefix.match(/^([A-Z0-9]{2})/)) continue; if (prefix == lastPrefix) continue; dd[i].id = prefix; var s = document.createElement("a"); s.href = "#" + prefix; s.appendChild(document.createTextNode(prefix)); shortcut.push(s); lastPrefix = prefix; } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; i++) { var nav = document.createElement("div"); nav.style.position = "relative"; nav.style.top = "-1.5ex"; nav.style.left = "1.5em"; nav.style.width = "90%"; while (shortcut[0] && shortcut[0].toString().charAt(shortcut[0].toString().length - 2) == getTextContent(h2[i])) { nav.appendChild(shortcut.shift()); nav.appendChild(document.createTextNode("\u00A0 ")); } h2[i].parentNode.insertBefore(nav, h2[i].nextSibling); } function getTextContent(e) { if (e.textContent) return e.textContent; if (e.innerText) return e.innerText; } } addLoadEvent(processIndex); PKo"nR M PK.AOEBPS/dcommon/toc.gifGIF89a1ΥΥ{c{Z{JkJk1Rk,@IK% 0| eJB,K-1i']Bt9dz0&pZ1o'q(؟dQ=3S SZC8db f&3v2@VPsuk2Gsiw`"IzE%< C !.hC IQ 3o?39T ҍ;PKv I PK.AOEBPS/dcommon/topnav.gifGIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)-'KR$&84 SI) XF P8te NRtHPp;Q%Q@'#rR4P fSQ o0MX[) v + `i9gda/&L9i*1$#"%+ ( E' n7Ȇ(,҅(L@(Q$\x 8=6 'נ9tJ&"[Epljt p#ѣHb :f F`A =l|;&9lDP2ncH R `qtp!dȐYH›+?$4mBA9 i@@ ]@ꃤFxAD*^Ŵ#,(ε  $H}F.xf,BD Z;PK1FAPK.AOEBPS/dcommon/bp_layout.css# @charset "utf-8"; /* bp_layout.css Copyright 2007, Oracle and/or its affiliates. All rights reserved. */ body { margin: 0ex; padding: 0ex; } h1 { display: none; } #FOOTER { border-top: #0d4988 solid 10px; background-color: inherit; color: #e4edf3; clear: both; } #FOOTER p { font-size: 80%; margin-top: 0em; margin-left: 1em; } #FOOTER a { background-color: inherit; color: gray; } #LEFTCOLUMN { float: left; width: 50%; } #RIGHTCOLUMN { float: right; width: 50%; clear: right; /* IE hack */ } #LEFTCOLUMN div.portlet { margin-left: 2ex; margin-right: 1ex; } #RIGHTCOLUMN div.portlet { margin-left: 1ex; margin-right: 2ex; } div.portlet { margin: 2ex 1ex; padding-left: 0.5em; padding-right: 0.5em; border: 1px #bcc solid; background-color: #f6f6ff; color: black; } div.portlet h2 { margin-top: 0.5ex; margin-bottom: 0ex; font-size: 110%; } div.portlet p { margin-top: 0ex; } div.portlet ul { list-style-type: none; padding-left: 0em; margin-left: 0em; /* IE Hack */ } div.portlet li { text-align: right; } div.portlet li cite { font-style: normal; float: left; } div.portlet li a { margin: 0px 0.2ex; padding: 0px 0.2ex; font-size: 95%; } #NAME { margin: 0em; padding: 0em; position: relative; top: 0.6ex; left: 10px; width: 80%; } #PRODUCT { font-size: 180%; } #LIBRARY { color: #0b3d73; background: inherit; font-size: 180%; font-family: serif; } #RELEASE { position: absolute; top: 28px; font-size: 80%; font-weight: bold; } #TOOLS { list-style-type: none; position: absolute; top: 1ex; right: 2em; margin: 0em; padding: 0em; background: inherit; color: black; } #TOOLS a { background: inherit; color: black; } #NAV { float: left; width: 96%; margin: 3ex 0em 0ex 0em; padding: 2ex 0em 0ex 4%; /* Avoiding horizontal scroll bars. */ list-style-type: none; background: transparent url(../gifs/nav_bg.gif) repeat-x bottom; } #NAV li { float: left; margin: 0ex 0.1em 0ex 0em; padding: 0ex 0em 0ex 0em; } #NAV li a { display: block; margin: 0em; padding: 3px 0.7em; border-top: 1px solid gray; border-right: 1px solid gray; border-bottom: none; border-left: 1px solid gray; background-color: #a6b3c8; color: #333; } #SUBNAV { float: right; width: 96%; margin: 0ex 0em 0ex 0em; padding: 0.1ex 4% 0.2ex 0em; /* Avoiding horizontal scroll bars. */ list-style-type: none; background-color: #0d4988; color: #e4edf3; } #SUBNAV li { float: right; } #SUBNAV li a { display: block; margin: 0em; padding: 0ex 0.5em; background-color: inherit; color: #e4edf3; } #SIMPLESEARCH { position: absolute; top: 5ex; right: 1em; } #CONTENT { clear: both; } #NAV a:hover, #PORTAL_1 #OVERVIEW a, #PORTAL_2 #OVERVIEW a, #PORTAL_3 #OVERVIEW a, #PORTAL_4 #ADMINISTRATION a, #PORTAL_5 #DEVELOPMENT a, #PORTAL_6 #DEVELOPMENT a, #PORTAL_7 #DEVELOPMENT a, #PORTAL_11 #INSTALLATION a, #PORTAL_15 #ADMINISTRATION a, #PORTAL_16 #ADMINISTRATION a { background-color: #0d4988; color: #e4edf3; padding-bottom: 4px; border-color: gray; } #SUBNAV a:hover, #PORTAL_2 #SEARCH a, #PORTAL_3 #BOOKS a, #PORTAL_6 #WAREHOUSING a, #PORTAL_7 #UNSTRUCTURED a, #PORTAL_15 #INTEGRATION a, #PORTAL_16 #GRID a { position: relative; top: 2px; background-color: white; color: #0a4e89; } PK3( # PK.AOEBPS/dcommon/bookicon.gif:GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ޭ{{ZRRcZZRJJJBB)!!skRB9{sν{skskcZRJ1)!֭ƽ{ZZRccZJJBBB999111)JJ9BB1ZZB!!ﭵBJJ9BB!!))Jk{)1!)BRZJ{BsR!RRJsJ!J{s!JsBkks{RsB{J{c1RBs1ZB{9BJ9JZ!1BJRRs!9R!!9Z9!1)J19JJRk19R1Z)!1B9R1RB!)J!J1R)J119!9J91!9BkksBBJ119BBR!))9!!!JB1JJ!)19BJRZckތ1)1J9B,H*\hp >"p`ƒFF "a"E|ժOC&xCRz OBtX>XE*O>tdqAJ +,WxP!CYpQ HQzDHP)T njJM2ꔀJ2T0d#+I:<жk 'ꤱF AB @@nh Wz' H|-7f\A#yNR5 /PM09u UjćT|q~Yq@&0YZAPa`EzI /$AD Al!AAal 2H@$ PVAB&c*ؠ p @% p-`@b`uBa l&`3Ap8槖X~ vX$Eh`.JhAepA\"Bl, :Hk;PKx[?:PK.AOEBPS/dcommon/conticon.gif^GIF87a!!!)))111999BBBJJJRRRZZZccckkksss{{{ZRR޽{{ssskkkcccZ991ccRZZBBJJZck)19ZcsBJZ19J!k{k)Z1RZs1!B)!J91{k{)J!B!B911)k{cs!1s!9)s!9!B!k)k1c!)Z!R{9BJcckZZcBBJ99B119{{!!)BBRBBZ!))999R99Z!!999c1!9!)19B1)!B9R,  oua\h2SYPa aowwxYi 9SwyyxxyYSd $'^qYȵYvh ч,/?g{н.J5fe{ڶyY#%/}‚e,Z|pAܠ `KYx,ĉ&@iX9|`p ]lR1khٜ'E 6ÅB0J;t X b RP(*MÄ!2cLhPC <0Ⴁ  $4!B 6lHC%<1e H 4p" L`P!/,m*1F`#D0D^!AO@..(``_؅QWK>_*OY0J@pw'tVh;PKp*c^PK.AOEBPS/dcommon/blafdoc.cssL@charset "utf-8"; /* Copyright 2002, 2011, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2011.10.7 */ body { font-family: Tahoma, sans-serif; /* line-height: 125%; */ color: black; background-color: white; font-size: small; } * html body { /* http://www.info.com.ph/~etan/w3pantheon/style/modifiedsbmh.html */ font-size: x-small; /* for IE5.x/win */ f\ont-size: small; /* for other IE versions */ } h1 { font-size: 165%; font-weight: bold; border-bottom: 1px solid #ddd; width: 100%; } h2 { font-size: 152%; font-weight: bold; } h3 { font-size: 139%; font-weight: bold; } h4 { font-size: 126%; font-weight: bold; } h5 { font-size: 113%; font-weight: bold; display: inline; } h6 { font-size: 100%; font-weight: bold; font-style: italic; display: inline; } a:link { color: #039; background: inherit; } a:visited { color: #72007C; background: inherit; } a:hover { text-decoration: underline; } a img, img[usemap] { border-style: none; } code, pre, samp, tt { font-family: monospace; font-size: 110%; } caption { text-align: center; font-weight: bold; width: auto; } dt { font-weight: bold; } table { font-size: small; /* for ICEBrowser */ } td { vertical-align: top; } th { font-weight: bold; text-align: left; vertical-align: bottom; } ol ol { list-style-type: lower-alpha; } ol ol ol { list-style-type: lower-roman; } td p:first-child, td pre:first-child { margin-top: 0px; margin-bottom: 0px; } table.table-border { border-collapse: collapse; border-top: 1px solid #ccc; border-left: 1px solid #ccc; } table.table-border th { padding: 0.5ex 0.25em; color: black; background-color: #f7f7ea; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } table.table-border td { padding: 0.5ex 0.25em; border-right: 1px solid #ccc; border-bottom: 1px solid #ccc; } span.gui-object, span.gui-object-action { font-weight: bold; } span.gui-object-title { } p.horizontal-rule { width: 100%; border: solid #cc9; border-width: 0px 0px 1px 0px; margin-bottom: 4ex; } div.zz-skip-header { display: none; } td.zz-nav-header-cell { text-align: left; font-size: 95%; width: 99%; color: black; background: inherit; font-weight: normal; vertical-align: top; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-header-link { font-size: 95%; } td.zz-nav-button-cell { white-space: nowrap; text-align: center; width: 1%; vertical-align: top; padding-left: 4px; padding-right: 4px; margin-top: 0ex; padding-top: 0ex; } a.zz-nav-button-link { font-size: 90%; } div.zz-nav-footer-menu { width: 100%; text-align: center; margin-top: 2ex; margin-bottom: 4ex; } p.zz-legal-notice, a.zz-legal-notice-link { font-size: 85%; /* display: none; */ /* Uncomment to hide legal notice */ } /*************************************/ /* Begin DARB Formats */ /*************************************/ .bold, .codeinlinebold, .syntaxinlinebold, .term, .glossterm, .seghead, .glossaryterm, .keyword, .msg, .msgexplankw, .msgactionkw, .notep1, .xreftitlebold { font-weight: bold; } .italic, .codeinlineitalic, .syntaxinlineitalic, .variable, .xreftitleitalic { font-style: italic; } .bolditalic, .codeinlineboldital, .syntaxinlineboldital, .titleinfigure, .titleinexample, .titleintable, .titleinequation, .xreftitleboldital { font-weight: bold; font-style: italic; } .itemizedlisttitle, .orderedlisttitle, .segmentedlisttitle, .variablelisttitle { font-weight: bold; } .bridgehead, .titleinrefsubsect3 { font-weight: bold; } .titleinrefsubsect { font-size: 126%; font-weight: bold; } .titleinrefsubsect2 { font-size: 113%; font-weight: bold; } .subhead1 { display: block; font-size: 139%; font-weight: bold; } .subhead2 { display: block; font-weight: bold; } .subhead3 { font-weight: bold; } .underline { text-decoration: underline; } .superscript { vertical-align: super; } .subscript { vertical-align: sub; } .listofeft { border: none; } .betadraft, .alphabetanotice, .revenuerecognitionnotice { color: #e00; background: inherit; } .betadraftsubtitle { text-align: center; font-weight: bold; color: #e00; background: inherit; } .comment { color: #080; background: inherit; font-weight: bold; } .copyrightlogo { text-align: center; font-size: 85%; } .tocsubheader { list-style-type: none; } table.icons td { padding-left: 6px; padding-right: 6px; } .l1ix dd, dd dl.l2ix, dd dl.l3ix { margin-top: 0ex; margin-bottom: 0ex; } div.infoboxnote, div.infoboxnotewarn, div.infoboxnotealso { margin-top: 4ex; margin-right: 10%; margin-left: 10%; margin-bottom: 4ex; padding: 0.25em; border-top: 1pt solid gray; border-bottom: 1pt solid gray; } p.notep1 { margin-top: 0px; margin-bottom: 0px; } .tahiti-highlight-example { background: #ff9; text-decoration: inherit; } .tahiti-highlight-search { background: #9cf; text-decoration: inherit; } .tahiti-sidebar-heading { font-size: 110%; margin-bottom: 0px; padding-bottom: 0px; } /*************************************/ /* End DARB Formats */ /*************************************/ @media all { /* * * { line-height: 120%; } */ dd { margin-bottom: 2ex; } dl:first-child { margin-top: 2ex; } } @media print { body { font-size: 11pt; padding: 0px !important; } a:link, a:visited { color: black; background: inherit; } code, pre, samp, tt { font-size: 10pt; } #nav, #search_this_book, #comment_form, #comment_announcement, #flipNav, .noprint { display: none !important; } body#left-nav-present { overflow: visible !important; } } PKʍPK.AOEBPS/dcommon/rightnav.gif&GIF89a1ֽ筽ޭƔkZZk{Bc{,@ ) l)- $CҠҀ ! D1 #:aS( c4B0 AC8 ְ9!%MLj Z * ctypJBa H t>#Sb(clhUԂ̗4DztSԙ9ZQҀEPEPEPEPEPEPEPM=iԍP Gii c*yF 1׆@\&o!QY00_rlgV;)DGhCq7~..p&1c:u֫{fI>fJL$}BBP?JRWc<^j+χ5b[hֿ- 5_j?POkeQ^hֿ1L^ H ?Qi?z?+_xɔŪ\썽O]χ>)xxV/s)e6MI7*ߊޛv֗2J,;~E4yi3[nI`Ѱe9@zXF*W +]7QJ$$=&`a۾?]N T䏟'X)Ɣkf:j |>NBWzYx0t!* _KkoTZ?K Gc+UyڹgNuh^iSo5{\ܹ3Yos}.>if FqR5\/TӮ#]HS0DKu{($"2xִ{SBJ8=}Y=.|Tsц2UЫ%.InaegKo z ݎ3ֹxxwM&2S%';+I',kW&-"_¿_ Vq^ܫ6pfT2RV A^6RKetto^[{w\jPZ@ޢN4/XN#\42j\(z'j =~-I#:q[Eh|X:sp* bifp$TspZ-}NM*B-bb&*xUr#*$M|QWY ~p~- fTED6O.#$m+t$˙H"Gk=t9r娮Y? CzE[/*-{c*[w~o_?%ƔxZ:/5𨴟q}/]22p qD\H"K]ZMKR&\C3zĽ[PJm]AS)Ia^km M@dК)fT[ijW*hnu Ͳiw/bkExG£@f?Zu.s0(<`0ֹoxOaDx\zT-^ѧʧ_1+CP/p[w 9~U^[U<[tĽwPv[yzD1W='u$Oeak[^ |Gk2xv#2?¹TkSݕ| rݞ[Vi _Kz*{\c(Ck_܏|?u jVڔ6f t?3nmZ6f%QAjJf9Rq _j7Z-y.pG$Xb]0')[_k;$̭?&"0FOew7 z-cIX岛;$u=\an$ zmrILu uٞ% _1xcUW%dtÀx885Y^gn;}ӭ)場QEQ@Q@Q@Q@Q@Q@!4xPm3w*]b`F_931˜[ן+(> E ly;<;MF-qst+}DH @YKlLmؤciN<|]IU)Lw(8t9FS(=>og<\Z~u_+X1ylsj'eՃ*U3`C!N9Q_WܱhKc93^ua>H ƕGk=8~e#_?{ǀe-[2ٔ7;=&K挑5zsLdx(e8#{1wS+ΝVkXq9>&yஏh$zq^0~/j@:/«Vnce$$uoPp}MC{$-akH@ɫ1O !8R9s5ԦYmϧ'OUṡ5T,!Ԛ+s#1Veo=[)g>#< s)ƽُA^䠮ωFUj(ǩ|N3Jڷ睁ϱuږZYGOTsI<&drav?A^_f׻B$,O__ԿC`it{6>G׈C~&$y؎v1q9Sc1fH[ѽ>,gG'0'@Vw,BO [#>ﱺg5ΒFVD%Yr:O5 Tu+O멃]ی38Ze}R&ѝ_xzc1DXgس;<,_,{ƽY'AS#oF.M#~cBuEx7G+Y)(5q+GCV;qF+CLQ)qEC&6z𿊘z}?&w=+)??&\g{;V??׻xGœdٿ׼-Nc')3K]N)iLTӿCdb7Q^a N sd>Fz[0S^s'Zi 77D}kWus ab~~H(>.fif9,~|Jk;YN3H8Y(t6Q݉k͇_÷Z+2߄&[ +Tr^藺97~c܎=[f1RrBǓ^kEMhxYVm<[џ6| kqbѱ| YA{G8p?\UM7Z66 g1U1igU69 u5Pƪ:VVZC=[@ҹ¨$kSmɳО\vFz~i3^a Osŧυ9Q}_3 όO{/wgoet39 vO2ea;Ύ7$U#?k+Ek&dpzbӱ+TaB0gN{[N7Gי}U7&@?>Fz~E!a@s ?'67XxO*!?qi]֏TQN@tI+\^s8l0)2k!!iW8F$(yOּT.k,/#1:}8uT˾+5=O/`IW G֯b.-<= HOm;~so~hW5+kS8s.zwE| ?4ӿw/K N 9?j(#0UT` Wzw}:_*9m>󑓀F?ELzv=8q:=WgJ`nDr Zе<ֹ](Q@Q@Q@Q@Q@Q@Q@Q@ 'IdC0EYJVcMty_~u+Sw-aO n<[YJgL#6i g5ЖDZ14cʝ!!\/M}/_AYR__>oC? _?7_G#RERW쏞KB}JxGSkǕA pƱơP m]hwB7U$Zq M95"3q1ioATߚ{g.t uu2k=;h#YB= fgS :TdLԃ!44mFK{Hrd^7oz|BVr<{)6AXգV»|>*/hS܏z͆OM=Εq (s|s׊LKQI :9NJ)P+!ʣoAF>+=@I}"x/}۠1aנc¹4emC:>p_xWKX` >R3_S½èųp3޺u3N e یbmͺ<_ mnݮ1Op?Gm)Qb%N585'%Ahs\6yw!"&Ɨ._wk)}GP;Z!#\"< *oƾ\)}N>"լ/~]Lg}pBG X?<zZ#x69S=6) jzx=y9O&>+e!!? ?s~k5Gʏ)?*ce7Ox~k5􇔾Q/e7/Ԑ#3OgNC0] ;_FiRl>Q.g>!%k#ú:Kn'&}?U@\pџPtp)v<{_i}Oվֲ3XIYIx~b<D?(=_JXH=bbi=Oh?_ C_O)}oW쏜? %Ƶ;-RYFi`wۭ{ϖZMtQ$"c_+ԃx1*0b;ԕ݋ESQEQEQEQEQEQEQEQEQEQZ(1F)h1K@XLRE&9P (bf{RӨ&)PEPEPbԴPGKZ(iإbn(:A%S0(-&)P+ ڎԴP11F)h&:LRmQ@Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((PKje88PK.AOEBPS/dcommon/help.gif!GIF89a1εֵ֜֜{kZsBc{,@ )sƠTQ$8(4ʔ%ŌCK$A HP`$h8ŒSd+ɡ\ H@%' 6M HO3SJM /:Zi[7 \( R9r ERI%  N=aq   qƦs *q-n/Sqj D XZ;PKއ{&!PK.A OEBPS/toc.htmX? Table of Contents

Contents

List of Figures

List of Tables

Title and Copyright Information

Preface

1 Introduction to JPublisher

2 Using JPublisher

3 Data Type and Java-to-Java Type Mappings

4 Additional Features and Considerations

5 Generated Classes and Interfaces

6 Command-Line Options and Input Files

A Generated Code Examples

B Troubleshooting

Index

PKrXXPK.AOEBPS/usejpub.htm Using JPublisher

2 Using JPublisher

This chapter describes how you can use JPublisher for:

Publishing User-Defined SQL Types

Using JPublisher to publish SQL objects or collections as Java classes is straightforward. This section provides examples of this for the Order Entry (OE) schema, which is part of Oracle Database sample schema. If you do not have the sample schema installed, but have your own object types that you would like to publish, then replace the user name, password, and object names accordingly.

Assuming that the password for the OE schema is OE, use the following command to publish the CATEGORY_TYP SQL object type, where % is the system prompt:

% jpub -user=OE -sql=CATEGORY_TYP:CategoryTyp
Enter OE password: password

The JPublisher -user option specifies the user name. The -sql option specifies the types to be published. The SQL type and Java class is separated by a colon (:). CATEGORY_TYP is the name of the SQL type, and CategoryTyp is the name of the corresponding Java class that is to be generated.

JPublisher echoes the names of the SQL types that it publishes to the standard output:

OE.CATEGORY_TYP

In addition to the CategoryTyp.java file, JPublisher also generates the CategoryTypeRef.java file. This is a strongly typed wrapper class for SQL object references to OE.CATEGORY_TYP. Both these files can be compiled with the Java compiler, javac.

Another example of publishing SQL object types, in this case the CUSTOMER_TYP type, by using the shorthand -u for "-user=" and -s for "-sql=" is:

% jpub -u OE -s CUSTOMER_TYP:CustomerTyp
Enter OE password: password

The options -u and -s are followed by a space and then the value.

JPublisher reports a list of SQL object types. Whenever it encounters an object type for the first time, whether through an attribute, an object reference, or a collection that has element types as objects or collections, it automatically generates a wrapper class for that type as well. The list of SQL object types for the OE schema are:

OE.CUSTOMER_TYP
OE.CORPORATE_CUSTOMER_TYP
OE.CUST_ADDRESS_TYP
OE.PHONE_LIST_TYP
OE.ORDER_LIST_TYP
OE.ORDER_TYP
OE.ORDER_ITEM_LIST_TYP
OE.ORDER_ITEM_TYP
OE.PRODUCT_INFORMATION_TYP
OE.INVENTORY_LIST_TYP
OE.INVENTORY_TYP
OE.WAREHOUSE_TYP

Two source files are generated for each object type in this example: one for a Java class, such as CustomerTyp, to represent instances of the object type, and one for a reference class, such as CustomerTypeRef, to represent references to the object type.

Notice the naming scheme that JPublisher uses by default. For example, the OE.PRODUCT_INFORMATION_TYP SQL type is converted to a Java class, ProductInformationTyp.

Although JPublisher automatically generates wrapper classes for embedded types, it does not do so for subtypes of given object types. In this case, you have to explicitly enumerate all the subtypes that you want to have published. The CATEGORY_TYP type has three subtypes: LEAF_CATEGORY_TYP, COMPOSITE_CATEGORY_TYP, and CATALOG_TYP. The following is a single, wraparound JPublisher command line to publish the subtypes of the object type:

% jpub  -u OE  -s COMPOSITE_CATEGORY_TYP:CompositeCategoryTyp
        -s LEAF_CATEGORY_TYP:LeafCategoryTyp,CATALOG_TYP:CatalogTyp
Enter OE password: password

JPublisher lists the processed types as output, as follows:

OE.COMPOSITE_CATEGORY_TYP
OE.SUBCATEGORY_REF_LIST_TYP
OE.LEAF_CATEGORY_TYP
OE.CATALOG_TYP
OE.CATEGORY_TYP
OE.PRODUCT_REF_LIST_TYP

Keep in mind the following information:

  • If you want to unparse several types, then you can list them all together in the -sql or -s option, each separated by a comma, or you can supply several -sql options on the command line.

  • Although JPublisher does not automatically generate wrapper classes for all subtypes, it does generate them for all supertypes.

  • For SQL objects with methods, such as CATALOG_TYP, JPublisher uses SQLJ classes to implement the wrapper methods. In Oracle Database 11g, the use of SQLJ classes, as opposed to regular Java classes, is invisible to you unless you use one of the backward-compatibility modes.


Note:

Prior to Oracle Database 10g, the generation of SQLJ classes resulted in the creation of visible .sqlj source files. Starting from Oracle Database 10g, if you set the JPublisher -compatible flag to a value of 8i, both8i, 9i, or sqlj, then visible .sqlj source files will be generated.

In any of these modes, you can use the JPublisher -sqlj option as an alternative to using the sqlj command-line utility to translate .sqlj files.


If the code that JPublisher generates does not provide the functionality or behavior you want, then you can extend generated wrapper classes to override or complement their functionality. Consider the following example:

% jpub -u OE -s WAREHOUSE_TYP:JPubWarehouse:MyWarehouse
Enter OE password: password

The JPublisher output is:

OE.WAREHOUSE_TYP

With this command, JPublisher generates both JPubWarehouse.java and MyWarehouse.java. The JPubWarehouse.java file is regenerated every time you rerun this command. The MyWarehouse.java generated file can be customized by you and will not be overwritten by future runs of this command. You can add new methods in MyWarehouse.java and override the method implementations from JPubWarehouse.java.

The class that is used to materialize WAREHOUSE_TYP instances in Java is the specialized MyWarehouse class. If you want user-specific subclasses for all types in an object type hierarchy, then you must specify triplets of the form SQL_TYPE:JPubClass:UserClass, for all members of the hierarchy, as shown in the preceding JPublisher command.

Once you have generated and compiled Java wrapper classes with JPublisher, you can use the object wrappers directly.


Note:

The preceding examples using the OE schema are for illustrative purposes only and may not be completely up-to-date regarding the composition of the schema.

The following SQLJ class calls a PL/SQL stored procedure. Assume that register_warehouse takes a WAREHOUSE_TYP instance as an IN OUT parameter. Code comments show the corresponding #sql command. By default, JPublisher generates and translates the SQLJ code automatically.

java.math.BigDecimal location = new java.math.BigDecimal(10); 
java.math.BigDecimal warehouseId = new java.math.BigDecimal(10); 
MyWarehouse w = new MyWarehouse(warehouseId,"Industrial Park",location); 
//  ************************************************************
//  #sql { call register_warehouse(:INOUT w) };
//  ************************************************************
//
// declare temps 
oracle.jdbc.OracleCallableStatement __sJT_st = null;
sqlj.runtime.ref.DefaultContext __sJT_cc = 
     sqlj.runtime.ref.DefaultContext.getDefaultContext();
if (__sJT_cc==null)
  sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX(); 
sqlj.runtime.ExecutionContext.OracleContext __sJT_ec = 
     ((__sJT_cc.getExecutionContext()==null) ? 
          sqlj.runtime.ExecutionContext.raiseNullExecCtx() :
               __sJT_cc.getExecutionContext().getOracleContext()); 
try
{ 
  String theSqlTS = "BEGIN register_warehouse( :1 ) \n; END;"; 
  __sJT_st = __sJT_ec.prepareOracleCall(__sJT_cc,"0RegisterWarehouse",theSqlTS); 
  if (__sJT_ec.isNew()) 
  { 
    __sJT_st.registerOutParameter(1,2002,"OE.WAREHOUSE_TYP"); 
  } 
  // set IN parameters 
  if (w==null) 
    __sJT_st.setNull(1,2002,"OE.WAREHOUSE_TYP"); 
  else __sJT_st.setORAData(1,w); 
    // execute statement 
    __sJT_ec.oracleExecuteUpdate(); 
  // retrieve OUT parameters 
  w = (MyWarehouse)__sJT_st.getORAData(1,MyWarehouse.getORADataFactory()); 
}
finally
{
  __sJT_ec.oracleClose();
} 

In Java Database Connectivity (JDBC), you typically register the relationship between the SQL type name and the corresponding Java class in the type map for your connection instance. This is required once for each connection. This type mapping can be done as shown in the following example:

java.util.Map typeMap = conn.getTypeMap();
typeMap.put("OE.WAREHOUSE_TYP", MyWarehouse.class);
conn.setTypeMap(typeMap);

The following JDBC code is equivalent to the JPublisher output, that is, the translated SQLJ code, shown previously:

CallableStatement cs = conn.prepareCall("{call register_warehouse(?)}");
((OracleCallableStatement)cs).registerOutParameter
                 (1,oracle.jdbc.OracleTypes.STRUCT,"OE.WAREHOUSE_TYP");
cs.setObject(w);
cs.executeUpdate();
w = cs.getObject(1);

Publishing PL/SQL Packages

In addition to mapping SQL objects, you may want to encapsulate entire PL/SQL packages as Java classes. JPublisher offers functionality to create Java wrapper methods for the stored procedures of a PL/SQL package.

However, the concept of representing PL/SQL stored procedures as Java methods presents a problem. Arguments to the PL/SQL functions and procedures may use the PL/SQL OUT or IN OUT mode, but there are no equivalent modes for passing arguments in Java. A method that takes an int argument, for example, is not able to modify this argument in such a way that its callers can receive a new value for it. As a workaround, JPublisher can generate single-element arrays for OUT and IN OUT arguments. For example, consider an integer array int[] abc. The input value is provided in abc[0], and the modified output value is also returned in abc[0]. JPublisher also uses a similar pattern when generating code for SQL object type methods.


Note:

If your stored procedures use types that are specific to PL/SQL and are not supported by Java, then special steps are required to map these arguments to SQL and then to Java.

The following command publishes the SYS.DBMS_LOB package into Java:

% jpub -u scott -s SYS.DBMS_LOB:DbmsLob
Enter scott password: password

The JPublisher output is:

SYS.DBMS_LOB

Because DBMS_LOB is publicly visible, you can access it from a different schema, such as SCOTT. Note that this JPublisher invocation creates a SQLJ class in DbmsLob.java that contains the calls to the PL/SQL package. The generated Java methods are actually the instance methods. The idea is that you create an instance of the package using a JDBC connection or a SQLJ connection context and then call the methods on that instance.

Use of Object Types Instead of Java Primitive Numbers

When you examine the generated code, notice that JPublisher has generated java.lang.Integer as arguments to various methods. Using Java object types, such as Integer, instead of Java primitive types, such as int, permits you to represent SQL NULL values directly as Java nulls, and JPublisher generates these by default. However, for the DBMS_LOB package, int is preferable over the Integer object type. The following modified JPublisher invocation accomplishes this through the -numbertypes option:

% jpub -numbertypes=jdbc  -u scott  -s SYS.DBMS_LOB:DbmsLob
Enter scott password: password

The JPublisher output is:

SYS.DBMS_LOB

Wrapper Class for Procedures at the SQL Top Level

JPublisher also enables you to generate a wrapper class for the functions and procedures at the SQL top level. Use the special package name TOPLEVEL, as in the following example:

% jpub  -u scott  -s TOPLEVEL:SQLTopLevel
Enter scott password: password

The JPublisher output is:

SCOTT.top-level_scope

A warning appears if there are no stored functions or procedures in the SQL top-level scope.

Publishing Oracle Streams AQ

Publishing Oracle Streams Advanced Queue (AQ) as Java classes is similar to publishing PL/SQL stored procedures. JPublisher exposes a queue as a Java program using AQ Java Message Service (JMS) application programming interfaces (APIs). This Java program can be further published into Web services by the Web services assembler. You can perform the following:

Oracle Streams AQ can be categorized into queue, topic, and stream. A queue is a one-to-one message channel with a declared payload type. A topic is a one to many message channel with a declared payload type. A stream is a queue or topic with SYS.ANYDATA as the payload type.

You can publish a queue, topic, or stream using the -sql option as follows:

%jpub -user=scott -sql=AQNAME:javaName
Enter scott password: password

AQNAME is the name of a queue table, queue, topic, or stream. javaName is the name of the corresponding Java class.

In Microsoft Windows, you must add the following Java Archive (JAR) files to CLASSPATH for JPublisher to publish a queue. These two files are required for the running of the JPublisher-generated code for Oracle Streams AQ.

ORACLE_HOME/rdbms/jlib/jmscommon.jar
ORACLE_HOME/rdbms/jlib/aqapi.jar

On UNIX systems, the jpub script distributed with Oracle Database 11g Release 2 (11.2) includes these JAR files.

For Oracle Streams AQ, the usage of the -sql option is the same as SQL types and PL/SQL stored procedures. You can specify subclasses and interfaces. Other options available to SQL types and PL/SQL packages, such as -genpattern, -style, -builtintypes, and -compatible, are also available with Oracle Streams AQ.

Publishing a Queue as a Java Class

You can publish a queue using the same settings that are used for publishing a SQL type or PL/SQL stored procedure.

Consider a queue, toy_queue, declared as follows:

CREATE TYPE scott.queue_message AS OBJECT (
  Subject VARCHAR2(30),
  Text VARCHAR2(80)
);
dbms_aqadm.create_queue_table (
  Queue_table => 'scott.queue_queue_table',
  Queue_payload_type => 'scott.queue_message'
);
dbms_aqadm.create_queue (
  queue_name  => 'scott.toy_queue',
  queue_table => 'scott.queue_queue_table'
);
dbms_aqadm.start_queue (
  queue_name => 'scott.toy_queue'
);

The following command publishes toy_queue as a Java program:

% jpub  -user=scott  -sql=toy_queue:ToyQueue
Enter scott password: password

Note:

When creating a queue or topic, you can specify a SQL type as the payload type. The payload type is transformed into and from the JMS message types.

The command generates ToyQueue.java, with the following APIs:

public class ToyQueue
{
   public ToyQueue();
   public ToyQueue(java.sql.Connection conn);
   public ToyQueue(javax.sql.DataSource dataSource);
   public void setConnection(java.sql.Connection conn);
   public void setDataSource(javax.sql.DataSource ds);
   public void addTypeMap(String sqlName, String javaName);
   public void send(QueueMessage payload);
   public QueueMessage receive();
   public QueueMessage receiveNoWait();
   public QueueMessage receive(java.lang.String selector, boolean noWait);
}

Like for PL/SQL stored procedures, JPublisher generates connection and data source management APIs, such as setConnection() and setDataSource(). The addTypeMap() method enables you to specify type mapping if the payload type is a SQL type hierarchy. The send() method enqueues a message. The receive() method dequeues a message from the queue. This method blocks until a message is available to dequeue. The receiveNoWait() method dequeues a message and returns null if no message is available. The last receive() method in the ToyQueue class dequeues a message satisfying the selector. The selector is a condition specified in the AQ convention. For example, consider the condition:

priority > 3 and Subject IN ('spider','tank') 

This selects messages with priority higher than 3 and with spider and tank as the Subject attribute.

QueueMessage is a subclass of ORAData and is generated for the queue_message payload type, which is a SQL type published as the result of publishing the queue.The following sample client code uses the generated ToyQueue class. The client code sends a message to the queue, dequeues the queue using the block operator receive(), and continues dequeuing messages using receiveNoWait(), until all messages in the queue are dequeued.

...
ToyQueue q = new ToyQueue(getConnection());
QueueMessage m = new QueueMessage("scooby doo", "lights out");
q.send(m);
System.out.println("Message sent: " + m.getSubject() + " " + m.getText());
m = new QueueMessage("dalmatian", "solve the puzzle");
q.send(m);
System.out.println("Message sent: " + m.getSubject() + " " + m.getText());
m = q.receive();
while (m!=null)
{
  System.out.println("Message received: " + m.getSubject() + " " + m.getText());
  m = q.receiveNoWait();
}
...

Publishing a Topic as a Java Class

Consider a topic declared as follows:

CREATE TYPE scott.topic_message AS OBJECT (
  Subject VARCHAR2(30),
  Text VARCHAR2(80)
);
dbms_aqadm.create_queue_table (
  Queue_table => 'scott.topic_queue_table',
  Multiple_consumers => TRUE,
  Queue_payload_type => 'scott.topic_message'
);
dbms_aqadm.create_queue (
  queue_name  => 'scott.toy_topic',
  queue_table => 'scott.topic_queue_table'
);
dbms_aqadm.start_queue (
  queue_name => 'scott.toy_topic'
);

The queue table, topic_queue_table, has the Multiple_consumers property set to TRUE, indicating that the queue table hosts topics instead of queues.

You can publish the topic as follows:

% jpub -user=scott -sql=toy_topic:ToyTopic
Enter scott password: password

The command generates ToyTopic.java with the following APIs:

public class ToyTopic
{
  public ToyTopic(javax.sql.DataSource dataSource);
  public void setConnection(java.sql.Connection conn);
  public void setDataSource(javax.sql.DataSource ds);
  public void addTypeMap(String sqlName,String javaName);
  public void publish(TopicMessage payload);
  public void publish(TopicMessage payload, java.lang.String[] recipients);
  public void publish(TopicMessage payload, int deliveryMode, int priority,
        long timeToLive);
  public void subscribe(java.lang.String subscriber);
  public void unsubscribe(java.lang.String subscriber);
  public TopicMessage receiveNoWait(java.lang.String receiver);
  public TopicMessage receive(java.lang.String receiver);
  public TopicMessage receive(java.lang.String receiver,
        java.lang.String selector);
}

The publish methods enqueue a message addressed to all the subscribers or a list of subscribers. The deleveryMode parameter takes the value javax.jms.DeliveryMode.PERSISTENT or javax.jms.DeliveryMode.NON_PERSISTENT. However, only DeliveryMode.PERSISTENT is supported in Oracle Database 10g release 2 (10.2). The priority parameter specifies the priority of the message. The timeToLive parameter specifies the time in milliseconds after which the message will be timed out. A value of 0 indicates the message is not timed out.The receive methods dequeue a message addressed to the specified receiver.The following sample client code uses the generated ToyTopic class. The client sends a message to two receivers, ToyParty and ToyFactory, and then dequeues the topic as ToyParty, ToyLand, and ToyFactory respectively.

...
ToyTopic topic = new ToyTopic(getConnection());
TopicMessage m = new TopicMessage("scooby doo", "lights out");

topic.publish(m, new String[]{"ToyParty", "ToyFactory"});
System.out.println("Message broadcasted: " + m.getSubject() + " " + m.getText());
m = new TopicMessage("dalmatian", "solve the puzzle");
topic.publish(m, new String[]{"ToyParty", "ToyLand"});
System.out.println("Message broadcasted: " + m.getSubject() + " " + m.getText());

m = topic.receive("ToyParty");
System.out.println("ToyParty receive " + m.getSubject() + " " + m.getText());
m = topic.receive("ToyParty");
System.out.println("ToyParty receive " + m.getSubject() + " " + m.getText());

m = topic.receiveNoWait("ToyLand");
System.out.println("ToyFactory receive " + m.getSubject() + " " + m.getText());
m = topic.receiveNoWait("ToyFactory");
System.out.println("ToyFactory receive " + m.getSubject() + " " + m.getText());
m = topic.receiveNoWait("ToyFactory");
...

Publishing a Stream as a Java Class

A stream is a special case of AQ. It can have only SYS.ANYDATA as the payload type. As a limitation, JPublisher-generated code for streams requires the JDBC Oracle Call Interface (OCI) driver. However, the code generated for queue and topic run on both the JDBC Thin and JDBC OCI driver.

Publishing a stream is similar to publishing an AQ. The following command will publish the stream, toy_stream:

% jpub  -user=scott  -sql=toy_stream:ToyStream
Enter scott password: password

This command generates the ToyStream.java file.

The difference between publishing a stream and an AQ or a topic is that when a stream is published, the payload type will always be SYS.ANYDATA, which is mapped to java.lang.Object.

The ToyStream.java file contains the following APIs:

public class ToyStream
{
  public ToyStream();
  public ToyStream(java.sql.Connection conn);
  public ToyStream(javax.sql.DataSource dataSource);
  public void setConnection(java.sql.Connection conn);
  public void setDataSource(javax.sql.DataSource ds);
  public void addTypeMap(String sqlName, String javaName);
  public void publish(Object payload);
  public void publish(Object payload, java.lang.String[] recipients);
  public void publish(Object payload, int deliveryMode, 
         int priority, long timeToLive);
  public void subscribe(java.lang.String subscriber);
  public void unsubscribe(java.lang.String subscriber);
  public Object receiveNoWait(java.lang.String receiver);
  public Object receive(java.lang.String receiver);
  public Object receive(java.lang.String receiver, java.lang.String selector);
  public Object receive(java.lang.String receiver, java.lang.String selector, 
         long timeout);
}

Here is a sample code that uses the generated ToyStream class:

...
System.out.println("*** testStream with an OCI connection");
Object response = null;
ToyStream stream = new ToyStream(getOCIConnection());

stream.publish("Seaside news", new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + response);

stream.publish(new Integer(333), new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + response);

stream.publish(new Float(3.33), new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + response);

stream.publish("Science Monitor".getBytes(), new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + new String((byte[])response));

stream.publish(new String[]{"gamma", "beta"}, new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println("Received: " + ((String[]) response)[0]);

HashMap map = new HashMap();
map.put("US", "dollar");
map.put("Japan", "yen");
map.put("Austrilia", "dollar");
map.put("Britian", "pound");
stream.publish(map, new String[]{"ToyParty"});
response = stream.receive("ToyParty");
map = (HashMap) response;
System.out.println("Message received: " + map.get("Britian") + ", " + map.get("US") + ", " + map.get("Austrilia"));

stream.addTypeMap("SCOTT.QUEUE_MESSAGE", "queue.wrapper.simple.QueueMessage");
stream.addTypeMap("QUEUE_MESSAGE", "queue.wrapper.simple.QueueMessage");
QueueMessage m = new QueueMessage("Knowing", "world currency");
stream.publish(m, new String[]{"ToyParty"});
response = stream.receive("ToyParty");
System.out.println(response);
m = (QueueMessage) response;
System.out.println("Message received: " + m.getSubject() + " " + m.getText());
...

The sample code sends messages of various types, such as String, Integer, and java.util.Map. For the QueueMessage JDBC custom type, the addTypeMap() method is called to specify SQL type to Java type mapping.

Publishing Server-Side Java Classes Through Native Java Interface

Prior to Oracle Database 10g, calling Java stored procedures and functions from a database client required JDBC calls to the associated PL/SQL wrappers. Each PL/SQL wrapper had to be manually published with a SQL signature and a Java implementation. This process had the following disadvantages:

  • The signatures permitted only Java types that had direct SQL equivalents.

  • Exceptions issued in Java were not properly returned.

Starting from Oracle Database 10g, you can use the native Java interface feature for calls to server-side Java code. The JPublisher -java option provides functionality to overcome these disadvantages.

To remedy the deficiencies of JDBC calls to associated PL/SQL wrappers, the -java option makes use of an API for direct invocation of static Java methods. This functionality is also useful for Web services.

The functionality of the -java option mirrors that of the -sql option, creating a client-side Java stub class to access a server-side Java class. This is in contrast to creating a client-side Java class to access a server-side SQL object or PL/SQL package. The client-side stub class uses SQL code that mirrors the server-side class and includes the following features:

  • Methods corresponding to the public, static methods of the server class

  • Two constructors, one that takes a JDBC connection and one that takes the SQLJ default connection context instance

At run time, the stub class is instantiated with a JDBC connection. Calls to its methods result in calls to the corresponding methods of the server-side class. Any Java types used in these published methods must be primitive or serializable.

You can use the -java option to publish a server-side Java class, as follows:

-java=className

Consider the oracle.sqlj.checker.JdbcVersion server-side Java class, with the following APIs:

public class oracle.sqlj.checker.JdbcVersion
{
  public oracle.sqlj.checker.JdbcVersion();
  public static int getDriverMajorVersion();
  public static int getDriverMinorVersion();
  public static java.lang.String getDriverName();
  public static java.lang.String getDriverVersion();
  public static java.lang.String getJdbcLibraryName();
  public static java.lang.String getRecommendedRuntimeZip();
  public static java.lang.String getRuntimeVersion();
  public static java.lang.String getSqljLibraryName();
  public static boolean hasNewStatementCache();
  public static boolean hasOracleContextIsNew();
  public static boolean hasOracleSavepoint();
  public static void main(java.lang.String[]);
  public java.lang.String toString();
  public static java.lang.String to_string();
}

As an example, assume that you want to call the following method on the server:

public String oracle.sqlj.checker.JdbcVersion.to_string();

Use the following command to publish JdbcVersion for client-side invocation:

% jpub -sql=scott -java=oracle.sqlj.checker.JdbcVersion:JdbcVersion Client
Enter scott password: password

This command generates the client-side Java class, JdbcVersionClient, which contains the following APIs:

public class JdbcVersionClient
{
  public long newInstance();
  public JdbcVersionClient();
  public JdbcVersionClient(java.sql.Connection conn);
  public JdbcVersionClient(sqlj.runtime.ref.DefaultContext ctx);
  public java.lang.String toString(long _handle);
  public int getDriverMajorVersion();
  public int getDriverMinorVersion();
  public java.lang.String getDriverName();
  public java.lang.String getDriverVersion();
  public java.lang.String getJdbcLibraryName();
  public java.lang.String getRecommendedRuntimeZip();
  public java.lang.String getRuntimeVersion();
  public java.lang.String getSqljLibraryName();
  public boolean hasNewStatementCache();
  public boolean hasOracleContextIsNew();
  public boolean hasOracleSavepoint();
  public void main(java.lang.String[] p0);
  public java.lang.String to_string();
}

Compare oracle.sqlj.checker.JdbcVersion with JdbcVersionClient. All static methods are mapped to instance methods in the client-side code. A instance method in the server-side class, toString() for example, is mapped to a method with an extra handle. A handle represents an instance of oracle.sqlj.checker.JdbcVersion in the server. The handle is used to call the instance method on the server-side. The extra method in JdbcVersionClient is newInstance(), which creates a new instance of oracle.sqlj.checker.JdbcVersion in the server and returns its handle.

Publishing the server-side Java class has the following constraints:

  • Instance methods can be published only if the class to be published has a public empty constructor.

  • Only serializable parameter and return types are supported. Methods with nonserializable types will not be published.

  • Oracle Database 11g or Oracle Database 10g is required.

Publishing Server-Side Java Classes Through PL/SQL Wrappers

Since Oracle Database 10g release 2 (10.2), JPublisher provides a new approach to publish server-side Java classes. It generates the following to call server-side Java:

  • Java stored procedure wrapper for the server-side class

  • PL/SQL wrapper for the Java stored procedure wrapper

  • Client-side Java code to call the PL/SQL wrapper

The Java stored procedure wraps the server-side Java code, which accomplishes the following:

  • Wraps an instance method into a static method. Each method in the server-side Java code is wrapped by a static method. An instance method can be mapped in a single or multiple-instance fashion.

  • Converts Java types into types that can be exposed to the PL/SQL call specification. For example, the Java type byte[] is converted into oracle.sql.BLOB.

The PL/SQL wrapper calls the Java stored procedure. The client-side Java code calls the PL/SQL wrapper through JDBC calls. The -java option requires that the class to be exposed is already loaded into the database.

The supported Java types are:

  • JDBC supported types

  • Java beans

  • Arrays of supported types

  • Serializable types

To publish a server-side class, use the -dbjava option, as follows:

-dbjava=server-sideClassName:client-sideClassName

The client-sideClassName setting must be specified. Otherwise, JPublisher will not generate client-side Java class. To publish oracle.sqlj.checker.JdbcVersion, use the following command:

% jpub -user=scott -dbjava=oracle.sqlj.checker.JdbcVersion:JdbcVersionClient
Enter scott password: password

The command generates the following output:

oracle/sqlj/checker/JdbcVersionJPub.java
plsql_wrapper.sql
plsql_dropper.sql
SCOTT.JPUBTBL_VARCHAR2
SCOTT.JPUB_PLSQL_WRAPPER
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading JdbcVersionJPub.java

The command generates the JdbcVersionJPub Java stored procedure, the PL/SQL wrapper, and the client-side JdbcVersionClient class. JdbcVersionJPub.java and plsql_wrapper.sql are automatically loaded into the database. JdbcVersionClient has the following APIs:

public class JdbcVersionClient
{
  public JdbcVersionClient();
  public JdbcVersionClient(java.sql.Connection conn);
  public void setConnection(java.sql.Connection conn);
  public void setDataSource(javax.sql.DataSource ds);
  public String toString0();
  public java.math.BigDecimal getDriverMajorVersion();
  public java.math.BigDecimal getDriverMinorVersion();
  public String getDriverName();
  public String getDriverVersion();
  public String getJdbcLibraryName();
  public String getRecommendedRuntimeZip();
  public String getRuntimeVersion();
  public String getSqljLibraryName();
  public java.math.BigDecimal hasNewStatementCache();
  public java.math.BigDecimal hasOracleContextIsNew();
  public java.math.BigDecimal hasOracleSavepoint();
  public void main0(JpubtblVarchar2 arg0);
  public String to_string();
}

Compare JdbcVersion and JdbcVersionClient. It shows a limitation of JPublisher-generated code. The generated client-side APIs are not exactly the same as the original server-side APIs. To illustrate this limitation, the following is a list of several inconsistencies between JdbcVersion and JdbcVersionClient:

  • The static methods are all mapped to instance methods, because a client-side method requires a JDBC connection to run.

  • A client-side method always throws java.sql.SQLException, while exceptions thrown from the server-side class will be passed to the client wrapped with SQLException.

  • The toString() method is renamed to toString0(). This is a limitation imposed by the stored procedure wrapper, where any method overwriting java.lang.Object methods has to be renamed to avoid conflicts.

  • The parameter and return types may be different. Numeric types in the server-side are mapped to java.math.BigDecimal. Array types, such as String[], are mapped to JDBC custom types. For example, the parameter of main() is mapped to JpubtblVarchar2, a subclass of ORAData, which the JPublisher command generates to represent an array of strings.

  • The main() method in the server-side Java class will be renamed to main0(), due to the Java stored procedure limitation.

Compared to -java, the advantage of -dbjava is the support for more types and working with pre-10g database versions. However, the disadvantages are extra PL/SQL and Java stored procedure layers at run time and the increased possibility of change in the method signature in the client-side Java class.

Publishing Server-Side Java Classes to PL/SQL

JPublisher can generate PL/SQL wrappers for server-side Java classes. A Java class is mapped to a PL/SQL package. Each PL/SQL method corresponds to a Java method. This feature relieves the customer from writing the PL/SQL call specification and creating SQL types used in the call specification.

You can use the -dbjava option to generate the PL/SQL wrapper for a server-side Java class as follows:

-dbjava=server-sideJavaClass

Do not specify a name after server-sideJavaClass. Otherwise, JPublisher will map the server-side Java class to a client-side Java class.

As an example, generate the PL/SQL wrapper for oracle.sqlj.checker.JdbcVersion using the following command:

% java -dbjava=oracle.sqlj.checker.JdbcVersion

The command generates the following output:

oracle/sqlj/checker/JdbcVersionJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading JdbcVersionJPub.java

The command generates and loads the Java stored procedure wrapper, JdbcVersionJPub.java, and also its PL/SQL wrapper, plsql_wrapper.sql, which declares the package JPUB_PLSQL_WRAPPER. The JPUB_PLSQL_WRAPPER package can be used to call the methods of oracle.sqlj.checker.JdbcVersion.

It often makes sense to specify -plsqlfile and -plsqlpackage with -dbjava. Consider the following command:

% java -dbjava=oracle.sqlj.checker.JdbcVersion -plsqlfile=jdbcversion.sql -plsqlpackage=jdbcversion

The command generates the following output:

oracle/sqlj/checker/JdbcVersionJPub.java
jdbcversion.sql
jdbcversion_dropper.sql
Executing jdbcversion_dropper.sql
Executing jdbcversion.sql
Loading JdbcVersionJPub.java

The command generates jdbcversion.sql, which declares the jdbcversion PL/SQL package as the wrapper for oracle.sqlj.checker.JdbcVersion. The package is declared as follows:

CREATE OR REPLACE PACKAGE jdbcversion AS
  FUNCTION toString0 RETURN VARCHAR2;
  FUNCTION getDriverMajorVersion RETURN NUMBER;
  FUNCTION getDriverMinorVersion RETURN NUMBER;
  FUNCTION getDriverName RETURN VARCHAR2;
  FUNCTION getDriverVersion RETURN VARCHAR2;
  FUNCTION getJdbcLibraryName RETURN VARCHAR2;
  FUNCTION getRecommendedRuntimeZip RETURN VARCHAR2;
  FUNCTION getRuntimeVersion RETURN VARCHAR2;
  FUNCTION getSqljLibraryName RETURN VARCHAR2;
  FUNCTION hasNewStatementCache RETURN NUMBER;
  FUNCTION hasOracleContextIsNew RETURN NUMBER;
  FUNCTION hasOracleSavepoint RETURN NUMBER;
  PROCEDURE main0(arg0 JPUBTBL_VARCHAR2);
  FUNCTION to_string RETURN VARCHAR2;
END jdbcversion;

Note that the methods toString() and main() are renamed to toString0() and main0(), because of the Java stored procedure limitation.

You can run the PL/SQL stored procedures in the jdbcversion package as follows:

SQL> SELECT jdbcversion.toString0 FROM DUAL;
 
TOSTRING0
--------------------------------------------------------------------------------
Oracle JDBC driver version 10.2 (10.2.0.0.0)
SQLJ runtime: Oracle 9.2.0 for JDBC SERVER/JDK 1.2.x - Built on Oct 10, 2004

The -dbjava command publishes both static and instance methods. To publish the static method only, use the following setting:

-proxyopts=static

If the server-side class has a public empty constructor, then its instance methods can be published. Instance methods can be called in two ways, through a default single instance inside the server, or through individual instances. The following option determines the approach used to call instance methods inside the server:

-proxyopts=single|multiple

The default setting is:

-proxyopts=single

The preceding SQL statement calls the toString0() method using the single instance.

You can publish oracle.sqlj.checker.JdbcVersion using -proxyopts=multiple, as follows:

% jpub -user=scott -dbjava=oracle.sqlj.checker.JdbcVersion -plsqlfile=jdbcversion.sql -plsqlpackage=jdbcversion 
-proxyopts=multiple
Enter scott password: password

This command generates the jdbcversion PL/SQL package, with the following methods different from the previous example:

CREATE OR REPLACE PACKAGE jdbcversion AS
  FUNCTION toString0(handleJdbcVersion NUMBER) RETURN VARCHAR2;
  ...
  FUNCTION newJdbcVersion RETURN NUMBER;
END jdbcversion;

Starting from Oracle database 10.2, an extra method, newJdbcVersion(), is created. You can create an instance using this method and use the instance to call the toString0() method. Run the following script in SQL*Plus:

set serveroutput on
DECLARE
  text varchar2(1000);
  inst number;
BEGIN
  inst := jdbcversion.newJdbcVersion;
  text := jdbcversion.toString0(inst);
  dbms_output.put_line(text);
END;
/

This script returns:

Oracle JDBC driver version 10.2 (10.2.0.0.0)
SQLJ runtime: Oracle 9.2.0 for JDBC
SERVER/JDK 1.2.x - Built on Oct 10, 2004

PL/SQL procedure successfully completed.

The following parameter and return types are supported:

  • JDBC supported types

  • Java beans

  • Arrays of supported types

Java beans are mapped to the generic JDBC struct class, oracle.sql.STRUCT at the Java stored procedure layer, and SQL object types and SQL table types at the PL/SQL layer. The following option determines how array parameters are handled:

-proxyopts=arrayin|arrayout|arrayinout|arrayall

The default setting is:

-proxyopts=arrayin

With -proxyopts=arrayall, a method containing array parameters is mapped to three PL/SQL methods. For example, consider the foo(int[]) method. This method is mapped to the following methods:

PROCEDURE foo(n NUMBERTBL);
PRECEDURE foo_o(n IN NUMBER);
PROCEDURE foo_io(n IN OUT NUMBER);

The first method treats the array argument as an input, the second treats the array as a holder for an output value, and the third treats the array as a holder for both input and output values. With -proxyopts=arrayin, which is the default setting, the foo(int[]) method is mapped to the first method. With -proxyopts=arrayout, the foo(int[]) method is mapped to the second method. With -proxyopts=arrayinout, the foo(int[]) method is mapped to the third method.

Consider a more complex example that uses two classes. The Add class uses Total and arrays in the methods. Total is a Java Bean and is therefore supported by server-side classes publishing. The two classes are defined as follows:

public class Add
{
  public static int[] add(int[] i, int[] j)
  {
    for (int k=0; k<i.length; k++)
      i[k] = i[k] + j[k];
    return i;
  }
  public int add(Total arg)
  {
    total = total + arg.getTotal();
    return total;
  }
  private int total;
}
public class Total
{
  public void setTotal(int total)
  {
    this.total = total;
  }
  public int getTotal()
  {
    return total;
  }
  private int total;
}

Load the two classes into the database, as follows:

% loadjava -u scott -r -v -f Add.java Total.java
Password: password

Run JPublisher using the following command:

% jpub -user=scott -dbjava=Add  -proxyopts=arrayall

The command generates the following output:

AddJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading AddJPub.java

The generated PL/SQL wrapper, plsql_wrapper.sql, will have the following declaration:

CREATE OR REPLACE TYPE JPUBOBJ_Total AS OBJECT (total_ NUMBER);
CREATE OR REPLACE TYPE JPUBTBL_NUMBER AS TABLE OF NUMBER;
CREATE OR REPLACE PACKAGE JPUB_PLSQL_WRAPPER AS
  FUNCTION add(arg0  JPUBOBJ_Total) RETURN NUMBER;
  FUNCTION add_io(arg0  JPUBOBJ_Total) RETURN NUMBER;
  FUNCTION add(arg0  JPUBTBL_NUMBER,arg1  JPUBTBL_NUMBER) RETURN JPUBTBL_NUMBER;
  FUNCTION add_o(arg0 OUT  NUMBER,arg1 OUT  NUMBER) RETURN JPUBTBL_NUMBER;
  FUNCTION add_io(arg0 IN OUT  NUMBER,arg1 IN OUT NUMBER) RETURN JPUBTBL_NUMBER;
END JPUB_PLSQL_WRAPPER;

The following SQL script, when run in SQL*Plus, uses the generated PL/SQL wrapper:

SQL> set serveroutput on
SQL> 
DECLARE
  totalx JPUBOBJ_Total;
  n NUMBER;
  n1 NUMBER;
  n2 NUMBER;
  add1 JPUBTBL_NUMBER;
  add2 JPUBTBL_NUMBER;
  add3 JPUBTBL_NUMBER;
BEGIN
  totalx := JPUBOBJ_Total(2004);
  n := JPUB_PLSQL_WRAPPER.add(totalx);
  n := JPUB_PLSQL_WRAPPER.add(totalx);
  DBMS_OUTPUT.PUT('total ');
  DBMS_OUTPUT.PUT_LINE(n);
 
  add1 := JPUBTBL_NUMBER(10, 20);
  add2 := JPUBTBL_NUMBER(100, 200);
  add3 := JPUB_PLSQL_WRAPPER.add(add1, add2);
  DBMS_OUTPUT.PUT('add ');
  DBMS_OUTPUT.PUT(add3(1));
  DBMS_OUTPUT.PUT(' ');
  DBMS_OUTPUT.PUT_LINE(add3(2));
 
  n1 := 99;
  n2 := 199;
  add3 := JPUB_PLSQL_WRAPPER.add_io(n1, n2);
  DBMS_OUTPUT.PUT('add_io ');
  DBMS_OUTPUT.PUT_LINE(n1);
END; 
/

The script generates the following output:

total 4008
add 110 220
add_io 298
PL/SQL procedure successfully completed.

The -dbjava option requires the classes being published to be present in the database. You can use -proxyclasses instead, which requires the classes being published to be specified in the classpath. Compile Add.java and Total.java, and include Add and Total in the classpath. You can use the following command to publish Add, instead of the -dbjava option:

% jpub -proxyclasses=Add

The command generates the following output:

AddJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql

The -proxyclasses option loads the generated PL/SQL wrapper. However, it does not load the generated Java stored procedure, AddJPub.java, because this procedure requires the published classes to exist on the server. You must load the Java stored procedure together with the published classes.

For example, on UNIX systems, you can load Add.java, Total.java, and AddJPub.java using the following command:

% loadjava -u scott -r -v -f Add.java Total.java AddJPub.java
Password: password

Once Add.java, Total.java, and AddJPub.java are loaded, the PL/SQL wrapper is ready for use.

Mechanisms Used in Exposing Java to PL/SQL

JPublisher supports easy access to server-side Java classes by generating PL/SQL wrappers, otherwise known as PL/SQL call specifications. A PL/SQL wrapper is a PL/SQL package that can invoke methods of one or more given Java classes.


See Also:

Oracle Database Java Developer's Guide for information about PL/SQL wrappers

PL/SQL supports only static methods. Java classes with only static methods or classes for which you want to expose only static methods can be wrapped in a straightforward manner. However, for Java classes that have instance methods that you want to expose, an intermediate wrapper class is necessary to expose the instance methods as static methods for use by PL/SQL.

A wrapper class is also required if the Java class to be wrapped uses anything other than Java primitive types in its method calling sequences.

For instance methods in a class that is to be wrapped, JPublisher can use either or both of the following mechanisms in the wrapper class:

  • Each wrapped class can be treated as a singleton, meaning that a single default instance is used. This instance is created the first time a method is called and is reused for each subsequent method call. Handles are not necessary and are not used. This mechanism is referred to as the singleton mechanism and is the default behavior when JPublisher provides wrapper classes for Web services client proxy classes.

    A releaseXXX() method is provided to remove the reference to the default instance and permit it to be garbage-collected.

  • Instances of the wrapped class can be identified through handles, also known as ID numbers. JPublisher uses long numbers as handles and creates static methods in the wrapper class. The method signatures of these methods are modified to include the handle of the instance on which to invoke a method. This allows the PL/SQL wrapper to use the handles in accessing instances of the wrapped class. In this scenario, you must create an instance of each wrapped class to obtain a handle. Then you provide a handle for each subsequent instance method invocation. This mechanism is referred to as the handle mechanism.

    A releaseXXX(long) method is provided for releasing an individual instance according to the specified handle. A releaseAllXXX() method is provided for releasing all existing instances.

Publishing Server-Side Java Classes to Table Functions

The -dbjava option can generate table functions from the generated PL/SQL wrapper. Table functions are used if you want to expose data through database tables, rather than through stored function returns or stored procedure output values. A table function returns a database table.


See Also:

Oracle Database PL/SQL Language Reference for information about table functions.

For a table function to be generated for a given method, the following must be true:

  • For wrapping instance methods, the singleton mechanism must be enabled. This is the default setting for -dbjava and -proxyclasses.

  • The wrapped Web service method must correspond to a stored procedure with OUT arguments or to a stored function.

When used with the -dbjava or -proxyclasses option, the JPublisher -proxyopts=tabfun setting requests a table function created for each PL/SQL function in the generated PL/SQL wrapper. Consider the Add class example discussed earlier. Run the following command:

% jpub -user=scott -dbjava=Add  -proxyopts=arrayall,tabfun
Enter scott password: password

The command generates the following output:

AddJPub.java
plsql_wrapper.sql
plsql_dropper.sql
Executing plsql_dropper.sql
Executing plsql_wrapper.sql
Loading AddJPub.java

This command generates the following extra table functions, in addition to the PL/SQL methods generated in the earlier example:

CREATE OR REPLACE PACKAGE JPUB_PLSQL_WRAPPER AS
   FUNCTION add(arg0 JPUBOBJ_Total) RETURN NUMBER;
   FUNCTION TO_TABLE_add(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_JPUBOBJ_Total PIPELINED;
   FUNCTION add(arg0 JPUBTBL_NUMBER,arg1  JPUBTBL_NUMBER) RETURN JPUBTBL_NUMBER;
   FUNCTION TO_TABLE_add0(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_JPUBTBL_NUMBER PIPELINED;
   FUNCTION add_o(arg0 OUT NUMBER, arg1 OUT NUMBER) RETURN JPUBTBL_NUMBER;
   FUNCTION TO_TABLE_add_o(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_o_JPUBTBL_NUMBER PIPELINED;
   FUNCTION add_io(arg0 IN OUT NUMBER, arg1 IN OUT NUMBER) RETURN JPUBTBL_NUMBER;
   FUNCTION TO_TABLE_add_io(cur SYS_REFCURSOR) RETURN GRAPH_TAB_add_io_JPUBTBL_NUMB PIPELINED;
END JPUB_PLSQL_WRAPPER;
/

The term, graph, is used with table functions. In this usage, a graph is a SQL object that defines the schema of the database table returned by a table function. There are three levels of functionality: a graph object, a table of graph objects, and a table function that returns the table of graph objects. The table of graph objects contains the input to a function and the output from that function.

As an example, consider the following declarations in plsql_wrapper.sql, which define the GRAPH_add_io_JPUBTBL_NUMBER_J graph object and the GRAPH_TAB_add_io_JPUBTBL_NUMB table of graph objects. These two types are generated for the TO_TABLE_add_io table function.

CREATE OR REPLACE TYPE GRAPH_add_io_JPUBTBL_NUMBER_J AS OBJECT(arg0 NUMBER, 
arg1 NUMBER, arg0_out NUMBER, arg1_out NUMBER, res JPUBTBL_NUMBER);
/

CREATE OR REPLACE TYPE GRAPH_TAB_add_io_JPUBTBL_NUMB AS TABLE OF GRAPH_add_io_JPUBTBL_NUMBER_J;
/

Also note that a table function always takes a REF CURSOR as input. For the TO_TABLE_add_io table function, the REF CURSOR expects two arguments, arg0 and arg1. The table function returns an instance of GRAPH_TAB_add_io_JPUBTBL_NUMB.

Run the following SQL script:

SQL> CREATE TABLE tabfun_input(arg0 NUMBER, arg1 NUMBER);
SQL> BEGIN
  INSERT INTO tabfun_input VALUES(97, 106);
  INSERT INTO tabfun_input VALUES(67, 3);
  INSERT INTO tabfun_input VALUES(19, 23);
  INSERT INTO tabfun_input VALUES(98, 271);
  INSERT INTO tabfun_input VALUES(83, 281);
END;
/
SQL>  SELECT * FROM TABLE(JPUB_PLSQL_WRAPPER.TO_TABLE_add_io(CURSOR(SELECT * FROM tabfun_input)));

The query calls TO_TABLE_add_io, which shows the input and output of that table function.

    ARG0     ARG1 ARG0_OUT ARG1_OUT RES
-------- -------- -------- -------- -------------------------
      97      106      203      106 JPUBTBL_NUMBER(203)
      67        3       70        3 JPUBTBL_NUMBER(70)
      19       23       42       23 JPUBTBL_NUMBER(42)
      98      271      369      271 JPUBTBL_NUMBER(369)
      83      281      364      281 JPUBTBL_NUMBER(364)

Publishing Web Services Client into PL/SQL

JPublisher can publish a Web Service Description Language (WSDL) file into a PL/SQL package, to allow a database user to call a Web service from PL/SQL. This feature is called as Web services call-out. Given a WSDL file, JPublisher generates a Java-based Web services client proxy, and further generates PL/SQL wrapper for the client proxy. The client proxy is generated by the Oracle Database Web services assembler tool, which is started by JPublisher. Before starting the tool, the following have to be present in the database:

  • The client proxy generated by JPublisher

  • The PL/SQL wrapper generated by JPublisher

  • The Java stored procedure wrapper generated by JPublisher

  • The Java API for XML-based Remote Procedure Call (JAX-RPC) Web services client run time or Oracle Simple Object Access Protocol (SOAP) Web services client run time.

These components can be loaded automatically by JPublisher or manually by the user. At run time, a Web services call-out works as follows:

  1. The user calls the PL/SQL wrapper, which in turn calls the Java stored procedure wrapper.

  2. The Java stored procedure calls the client proxy.

  3. The client proxy uses the Web services client run time to call the Web services.

The Java stored procedure wrapper is a required intermediate layer to publish instance methods of the client proxy class as static methods, because PL/SQL supports only static methods.

Web services call-out requires the following JAR files, which are included in Database Web Services Callout Utility 10g release 2:

  • dbwsa.jar

  • dbwsclientws.jar

  • dbwsclientdb101.jar

  • dbwsclientdb102.jar

These files can be downloaded from:

http://www.oracle.com/technetwork/database/database-083829.html

All the JAR files should be copied to the ORACLE_HOME/sqlj/lib directory. The dbwsa.jar file is required in the classpath when JPublisher publishes a WSDL file. On UNIX systems, the jpub command-line script includes the ORACLE_HOME/sqlj/lib/dbwsa.jar. Therefore, you do not have to include it in the classpath.

The dbwsclientws.jar file contains webservice client classes, irrespective of the version of Oracle database. The dbwsclientdb101.jar file contains webservice client classes that are specific to Oracle database 10.1 release. The dbwsclientdb102.jar file contains webservice client classes that are specific to Oracle database 10.2 or Oracle database 11g.

For Oracle9i Database, only Oracle SOAP Web services client is supported. To load Oracle SOAP Web services client run time into a pre-9.2 Oracle Database, run the following command:

% loadjava -u sys -r -v -s -f -grant public \
                  ${J2EE_HOME}/lib/activation.jar \
                  ${J2EE_HOME}/lib/http_client.jar \
                  ${ORACLE_HOME}/lib/xmlparserv2.jar \
                  ${ORACLE_HOME}/soap/lib/soap.jar \
                  ${J2EE_HOME}/lib/mail.jar
Password: password

The commands are in the format of UNIX systems. However, it gives an idea to Microsoft Windows users about the JAR files that are required for Oracle SOAP Web services client. The JAR files involved are distributed with Oracle9i Application Server releases.

To load Oracle SOAP Web services client into Oracle Database 9.2, run the following command:

% loadjava -u scott -r -v -f -genmissing
 ${ORACLE_HOME}/j2ee/home/lib/jssl-1_2.jar
 ${ORACLE_HOME}/soap/lib/soap.jar
 ${ORACLE_HOME}/dms/lib/dms.jar
 ${ORACLE_HOME}/j2ee/home/lib/servlet.jar 
${ORACLE_HOME}/j2ee/home/lib/ejb.jar 
${ORACLE_HOME}/j2ee/home/lib/mail.jar
Password: password

To load Oracle SOAP Web services client into Oracle Database 10g, run the following command:

% loadjava -u scott -r -f -v -genmissing 
${ORACLE_HOME}/soap/lib/soap.jar 
${ORACLE_HOME}/lib/dms.jar 
${ORACLE_HOME}/jlib/javax-ssl-1_1.jar 
${ORACLE_HOME}/j2ee/home/lib/servlet.jar 
${ORACLE_HOME}/j2ee/home/lib/mail.jar 
${ORACLE_HOME}/j2ee/home/lib/activation.jar
${ORACLE_HOME}/j2ee/home/lib/http_client.jar 
${ORACLE_HOME}/j2ee/home/lib/ejb.jar
Password: password

Note:

If the user has Grant Public privileges, then add -grant public to the command above to make the loaded classes visible to other schemas.

To load Oracle JAX-RPC client into Oracle 10g Release 1 Database, use any one of the following two options:

  • Load the Web service client into the SYS schema using the following command:

    % loadjava -u sys -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb101.jar
    Password: password
    
  • Load the Web service client into a user schema using the following command:

    % loadjava -u scott -r -v -f -genmissing dbwsclientws.jar dbwsclientdb101.jar
    Password: password
    

To load Oracle JAX-RPC client into Oracle 10g Release 2 Database or Oracle Database 11g, use any one of the following two options:

  • Load the Web service client into the SYS schema using the following command:

    % loadjava -u sys -r -v -f -genmissing -s -grant public dbwsclientws.jar dbwsclientdb102.jar
    Password: password
    
  • Load the Web service client into a user schema using the command:

    % loadjava -u scott -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar
    Password: password
    

Note:

If the user has Grant Public privileges, then add -grant public to the command above to make the loaded classes visible to other schemas.

Web services call-outs require that JPublisher runs on JDK 1.4 or later. The following JPublisher options are related to Web services call-outs:

-proxywsdl=url
-httpproxy=host:port
-endpoint=url
-proxyopts=soap|jaxrpc|noload|tabfun. Default: -proxyopts=jaxrpc|tabfun.
-sysuser=user/password

where,

  • The -proxywsdl option specifies the URL or path of a WSDL file, which describes the Web services being published.

  • The -httpproxy option specifies the HTTP proxy that is used to access the WSDL file, if the file is outside a firewall.

  • The -endpoint option redirects the client to the specified endpoint, rather than the endpoint specified in the WSDL file.

  • The -proxyopts=soap setting specifies that the PL/SQL wrapper will use Oracle SOAP Web services client run time to call the Web services.

    The -proxyopts=jaxrpc setting specifies that the PL/SQL wrapper will use Oracle JAX-RPC Web services client run time to call the Web services.

    The -proxyopts=tabfun setting specifies that table functions be generated for applicable Web services operations.

  • The -sysuser setting is recommended for -proxywsdl. It specifies a database user with SYS privileges. The -sysuser setting allows JPublisher to assign appropriate access privileges to run the generated PL/SQL wrappers. The -sysuser setting also allows JPublisher to load Web services client run time, if the run time is not present in the database.

For example, assume that a JAX-RPC Web service, called HelloService, is deployed to the following endpoint:

http://localhost:8888/javacallout/javacallout

The WSDL document for this Web service is at the following location:

http://localhost:8888/javacallout/javacallout?WSDL

The Web service provides an operation called getProperty that takes a Java string specifying the name of a system property, and returns the value of that property. For example, getProperty("os.name") may return SunOS.

Based on the WSDL description of the Web service, JPublisher can direct the generation of a Web service client proxy, and generate Java and PL/SQL wrappers for the client proxy. Use the following command to perform these functions:

% jpub -user=scott -sysuser=sys/sys_password
       -url=jdbc:oracle:thin:@localhost:1521:orcl
       -proxywsdl=http://localhost:8888/javacallout/javacallout?WSDL
       -package=javacallout -dir=genproxy
Enter scott password: password

The command gives the following output:

genproxy/HelloServiceJPub.java
genproxy/plsql_wrapper.sql
genproxy/plsql_dropper.sql
genproxy/plsql_grant.sql
genproxy/plsql_revoke.sql
Executing genproxy/plsql_wrapper.sql
Executing genproxy/plsql_grant.sql
Loading genproxy/plsql_proxy.jar

The -proxyopts setting directs the generation of the JAX-RPC client proxy and wrappers, and the use of a table function to wrap the Web service operation. The -url setting indicates the database, and the -user setting indicates the schema, where JPublisher loads the generated Java and PL/SQL wrappers. The -sysuser setting specifies the SYS account that has the privileges to grant permissions to run the wrapper script.

The plsql_grant.sql and plsql_revoke.sql scripts are generated by JPublisher. These scripts are used to create the PL/SQL wrapper in the database schema, grant permission to run it, revoke that permission, and drop the PL/SQL wrapper from the database schema.

The contents of the WSDL file is as follows:

<?xml version="1.0" encoding="UTF-8"?>
 
<definitions name="HelloService"
             targetNamespace="http://oracle.j2ee.ws/javacallout/Hello"
             xmlns:tns="http://oracle.j2ee.ws/javacallout/Hello"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types/>
  <message name="HelloServiceInf_getProperty">
    <part name="String_1" type="xsd:string"/>
  </message>
  <message name="HelloServiceInf_getPropertyResponse">
    <part name="result" type="xsd:string"/>
  </message>
  <portType name="HelloServiceInf">
    <operation name="getProperty" parameterOrder="String_1">
      <input message="tns:HelloServiceInf_getProperty"/>
      <output message="tns:HelloServiceInf_getPropertyResponse"/>
    </operation>
  </portType>
  <binding name="HelloServiceInfBinding" type="tns:HelloServiceInf">
    <operation name="getProperty">
      <input>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                   use="encoded"
                   namespace="http://oracle.j2ee.ws/javacallout/Hello"/>
      </input>
      <output>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                   use="encoded"
                   namespace="http://oracle.j2ee.ws/javacallout/Hello"/>
      </output>
      <soap:operation soapAction=""/>
    </operation>
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
  </binding>
  <service name="HelloService">
    <port name="HelloServiceInfPort" binding="tns:HelloServiceInfBinding">
      <soap:address location="/javacallout"/>
    </port>
  </service>
</definitions>

HelloServiceInf in the <message> element is the name of the service bean and determines the name of the interface that is generated and implemented by the generated JAX-RPC client proxy stub class. The HelloServiceInf interface has the following signature:

public interface HelloServiceInf extends java.rmi.Remote
{
  public String getProperty(String prop) throws java.rmi.RemoteException;
}

The method getProperty() corresponds to the getProperty operation specified in the WSDL document. It returns the value of a specified system property, prop. For example, specify the property os.version to return the operating system version.

The plsql_wrapper.sql file defines the JPUB_PLSQL_WRAPPER PL/SQL wrapper package. This package is created for calling the Web service from PL/SQL. It includes the definition of a table function from the Web service operation getProperty. The script in the plsql_wrapper.sql file is as follows:

CREATE OR REPLACE TYPE GRAPH_getProperty AS OBJECT(
  p0 VARCHAR2(32767),
  res VARCHAR2(32767)
);
/
CREATE OR REPLACE TYPE GRAPH_TAB_getProperty AS TABLE OF GRAPH_getProperty;
/
-- PL/SQL procedures that invoke webserviecs
CREATE OR REPLACE PACKAGE JPUB_PLSQL_WRAPPER AS
  FUNCTION getProperty(p0 VARCHAR2) RETURN VARCHAR2;
  FUNCTION TO_TABLE_getProperty(cur SYS_REFCURSOR) RETURN GRAPH_TAB_getProperty PIPELINED;
END JPUB_PLSQL_WRAPPER;
/

Because the -user and -sysuser settings are specified in the JPublisher command line to publish this Web service, JPublisher will load the generated Java code and PL/SQL wrapper into the database. Once everything is loaded, you can use the PL/SQL wrapper to invoke the Web service.

The PL/SQL wrapper consists of two functions: getProperty and TO_TABLE_getProperty. The getProperty function directly wraps the getProperty() method in the generated client proxy class. For example, the following SQL*Plus command uses getProperty to determine the operating system where the Web service is running:

SQL> SELECT JPUB_PLSQL_WRAPPER.getProperty('os.name') FROM DUAL;
JPUB_PLSQL_WRAPPER.GETPROPERTY('OS.NAME')
-----------------------------------------
SunOS

TO_TABLE_getProperty is a table function based on the getProperty function. It takes a REF CURSOR as input and returns a table. The schema of the table returned is defined by GRAPH_getProperty. In this example, TO_TABLE_getProperty is called with a REF CURSOR obtained from a one-column table of VARCHAR2 data, where each data item is the name of a system property, such as os.version. TO_TABLE_getProperty returns a table in which each row contains an item from the input REF CURSOR, and the result of a getProperty call taking that item as input. The following code is a sample usage of TO_TABLE_getProperty:

SQL> -- Test Table Function
SQL> CREATE TABLE props (name VARCHAR2(50));
SQL> BEGIN
INSERT INTO props VALUES('os.version');
INSERT INTO props VALUES('java.version');
INSERT INTO props VALUES('file.separator');
INSERT INTO props VALUES('file.encoding.pkg');
INSERT INTO props VALUES('java.vm.info');
END;
/
SQL> SELECT * FROM
TABLE(JPUB_PLSQL_WRAPPER.TO_TABLE_getProperty(CURSOR(SELECT * FROM props)));
P0 RES
------------------------------
os.version 5.8
java.version 1.4.1_03
file.separator /
file.encoding.pkg sun.io
java.vm.info mixed mode

This example creates a one-column table of VARCHAR2, populates it with system property names, and uses TO_TABLE_getProperty to find out the values of those system properties. In this example, you can see that the operating system is Sun Microsystems Solaris 5.8.

PKܩL|LPK.AOEBPS/adfeacon.htm Additional Features and Considerations

4 Additional Features and Considerations

This chapter covers additional features and considerations for your use of JPublisher:

Summary of JPublisher Support for Web Services

The following sections summarize key JPublisher features for Web services. Most features relate to Web services call-ins to the database, covering JPublisher features that make SQL, PL/SQL, and server-side Java classes accessible to Web services clients. There are also features and options to support Web services call-outs from the database.


See Also:


Summary of Support for Web Services Call-Ins to the Database

The following JPublisher features support Web services call-ins to code running in Oracle Database. The generated Java class can then be deployed in Oracle Application Server, using the Java EE container. For example, a Java class representing a PL/SQL package can be deployed as a PL/SQL Web Service.

  • Generation of Java interfaces

    By using extended functionality of the -sql option, JPublisher can generate Java interfaces. This functionality eliminates the necessity to manually generate Java interfaces that represent the application programming interface (API) from which Web Services Description Language (WSDL) content is to be generated. Prior to Oracle Database 10g, JPublisher could generate classes but not interfaces.

  • JPublisher styles and style files

    Style files, along with the related -style option, enable Java-to-Java type mappings that ensure that generated classes can be used in Web services. In particular, Oracle provides the following style files to support Web services:

    /oracle/jpub/mesg/webservices-common.properties
    /oracle/jpub/mesg/webservices10.properties
    /oracle/jpub/mesg/webservices9.properties
    
  • REF CURSOR returning and result set mapping

    The java.sql.ResultSet type is not supported by Web services, which affects stored procedures and functions that return REF CURSOR types. JPublisher supports alternative mappings that allow the use of query results with Web services.

  • Options to filter what JPublisher publishes

    There are several features for specifying or filtering JPublisher output, particularly to ensure that JPublisher-generated code can be exposed as Web services. By using the extended functionality of the -sql option, you can publish a specific subset of stored procedures. Using the -filtertypes and -filtermodes options, you can publish stored procedures based on the modes or types of parameters or return values. Using the -generatebean option, you can specify that generated methods satisfy the JavaBeans specification.

  • Support for calling Java classes in the database

    JPublisher uses the native Java interface for calls directly from a client-side Java stub, generated by JPublisher through the -java option, to the server-side Java code. Prior to Oracle Database 10g, server-side Java code could be called only through a PL/SQL wrapper that had to be created manually. This PL/SQL wrapper was also known as a call spec. Since Oracle Database 10g release 2 (10.2), Web services call-ins of Java classes are supported in two modes, dynamic invocation mode and PL/SQL wrapper mode.

  • Support for publishing SQL queries or DML statements

    JPublisher provides the -sqlstatement option to take a particular SELECT, UPDATE, INSERT, or DELETE statement and publish it as a method on a Java class that can be published as a Web service.

  • Support for unique method names

    To meet Web services requirements, you can instruct JPublisher to disallow overloaded methods and always use unique method names instead.

Support for Web Services Call-Outs from the Database

JPublisher supports Web services call-outs from Oracle Database. The Web services client code is written in SQL, PL/SQL, or Java and it runs on the database and invokes Web services elsewhere. This support is provided through the -proxywsdl and -httpproxy options. In addition, the -proxyopts and -proxyclasses options may possibly be relevant, but typically do not require any special settings for Web services.

Here is a summary of the key options:

  • -proxywsdl=URL

    Use this option to generate Web services client proxy classes, given the WSDL document at the specified URL. This option also generates additional wrapper classes to expose instance methods as static methods and generates PL/SQL wrappers.

  • -httpproxy=proxy_URL

    Where, a WSDL document is accessed through a firewall. Use this option to specify a proxy URL to use in resolving the URL of the WSDL document.

How to Perform Web Services Call-Out using Static Proxy and JPublisher

The Oracle JPublisher command line option -proxywsdl can be used to generate database-side Java and PL/SQL wrappers from the WSDL file of a Web service. To allow JPublisher to generate and load wrappers for Web service clients into the database, the dbwsa.jar and dbwsclient.jar files must be present in the classpath and inside the database respectively.

The following procedure sets up the environment and the database for Oracle JPublisher-supported Web service call-out. This procedure needs to be performed only once.

  1. Download and install Oracle JPublisher 11g Release 2 (11.2), if it is not already present on your system. Oracle JPublisher is installed as part of Oracle SQLJ installation. You can install Oracle SQLJ from the Database Client CD or from the Database Client download available at

    http://www.oracle.com/technology/software/products/database/index.html

  2. Add the dbwsa.jar to the directory ORACLE_HOME\sqlj\lib (Microsoft Windows) or ORACLE_HOME/sqlj/lib (Solaris).

  3. Set up the appropriate JDK as the Java VM and Java compiler.

    The version of the JDK must be the same as the Java VM in the target database:

    • Use JDK 1.5 and JDK 1.6 for Oracle Database 11g

    • Use JDK 1.4 for the Oracle Database 10g (Release 10.1 or 10.2)

    • Use JDK 1.3 for the Oracle Database 9.2

  4. Add dbwsa.jar file to the classpath environment variable.

  5. Load the dbwsclient.jar file either into the SYS schema or into the schema where the Web service client will be invoked.

    For example, the following loadjava command will load the dbwsclient.jar file into the SYS schema.

    %loadjava -u sys -r -v -f -s -grant public -noverify -genmissing dbwsclient.jar
    Password: password
    

    The following loadjava command illustrates how to load the dbwsclient.jar file into a specific schema.

    % loadjava -u scott -r -v -f -noverify -genmissing dbwsclient.jar
    Password: password
    

Example

The following example illustrates how to generate Java and PL/SQL wrappers for a Web service client and then invoke it by using SQL statements. The example follows these general steps:

  1. Identify the Web service you want to invoke.

  2. Call Oracle JPublisher with the appropriate options to generate the client proxy, the PL/SQL and Java wrappers, and load them into the database.

    An Oracle JPublisher command to do this would include the required -proxywsdl and -user options. The command could also include the optional -endpoint, -httpproxy, -sysuser, -dir, and -proxyopts options. For example:

    % jpub -user=username -sysuser=sysuser_name/sysuser_password -proxywsdl=WSDL_URL -endpoint=Web_services_endpoint
    

    It is assumed that the Web service has been previously deployed at http://localhost:8888/javacallout/javacallout

    The following command creates the Web service client and its Java and PL/SQL wrappers in the subdirectory tmp, then loads the wrappers into the database.

    % jpub -user scott -sysuser sys/sys_password -proxywsdl=sample/javacallout.wsdl
       -endpoint=http://localhost:8888/javacallout/javacallout -dir=tmp
    Enter scott password: password
    

    This command produces the following output:

    tmp/HelloServiceEJBJPub.java
    tmp/plsql_wrapper.sql
    tmp/plsql_dropper.sql
    tmp/plsql_grant.sql
    tmp/plsql_revoke.sql
    Executing tmp/plsql_dropper.sql
    Executing tmp/plsql_wrapper.sql
    Executing tmp/plsql_grant.sql
    Loading tmp/plsql_proxy.jar
    
  3. Invoke the Web service from inside the database.

    You can invoke the PL/SQL functions provided in tmp/plsql_wrapper.sql. Each PL/SQL function corresponds to an operation in the Web service. For example, if your Web service is available at the following endpoint:

    http://localhost:8888/javacallout/javacallout
    

    Then you can issue the following SQL command.

    SQL> select jpub_plsql_wrapper.sayhello('hello') from dual;
    

    The command will return the following output.

    JPUB_PLSQL_WRAPPER.SAYHELLO('HELLO')
    -----------------------------------
    HELLO!! You just said :hello
    

For more information about Oracle JPublisher call-out support, see "Web service Call-out using Dynamic Invocation Interface and the SYS.UTL_DBWS Utility" in Oracle Database JPublisher User's Guide. This is available from the following Web site.

http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

Server-Side Java Invocation (Call-in)

The server-side Java call-in functionality allows JPublisher to publish Java classes in the database for client-side invocation. JPublisher generates Java clients to invoke server-side Java.

In Oracle Database 10g release 1 (10.1), the JPublisher option for server-side call-in is -java. JPublisher generates a Java client that uses the dynamic invocation interface, oracle.jpub.runtime.Client, that is provided in the JPublisher run time, to invoke the oracle.jpub.runtime.Server server-side class, which in turn calls the desired Java stored procedure. The Client and Server interfaces are a part of the JPublisher run time. Only static methods with serializable parameters and return types are supported. Beginning with Oracle Database 10g release 1 (10.1), oracle.jpub.runtime.Server is located in the database.

In Oracle Database 10g release 2 (10.2), for server-side call-ins, JPublisher generates a PL/SQL wrapper for the stored procedure and the Java client that calls this PL/SQL wrapper. It supports both static and instance methods. The parameter and return types supported are primitive types, Java Beans, Serializable objects, and Oracle Java Database Connectivity (JDBC) types, typically those with the package name oracle.sql.

In Oracle Database 10g release 2 (10.2), the -java option is deprecated and the JPublisher option for server-side call-in is -dbjava. However, the -java option is still supported for backward compatibility. When the -compatible option is set to 10.1, -dbjava acts same as -java.

Features to Filter JPublisher Output

JPublisher provides some options that allow you to filter what JPublisher produces. For example, publishing just a subset of stored procedures from a package, filtering generated code according to parameter modes or parameter types, and ensuring that generated classes follow the JavaBeans specification.

The following sections provide details:

Publishing a Specified Subset of Functions or Procedures

Extended functionality of the -sql option enables you to publish just a subset of the stored functions or procedures from a package or from the SQL top level.

Recall that the following syntax results in publication of all the stored procedures of a package:

-sql=plsql_package

To publish only a subset of the stored procedures of the package, use the following syntax:

-sql=plsql_package(proc1+proc2+proc3+...)

You can also specify the subset according to stored procedure names and argument types. Instead of just specifying proc1, you can specify the following:

proc1(sqltype1, sqltype2, ...)

Publishing Functions or Procedures According to Parameter Modes or Types

In some cases, particularly for code generation for Web services, not all parameter modes or types are supported in method signatures or attributes for the target usage of your code. The -filtermodes and -filtertypes options are introduced to allow you to filter generated code as needed, according to parameter modes, parameter types, or both.

For each option setting, start with a 1 to include all possibilities by default, that is no filtering is done. Then list specific modes or types that you want to exclude each followed by a minus sign (-). For example:

-filtertypes=1,.ORADATA-,.ORACLESQL-

-filtermodes=1,out-,inout-

Alternatively, you can start with a 0 to filter everything out. Then list specific modes or types that you want to allow each followed by a plus sign (+). For example:

-filtertypes=0,.CURSOR+,.INDEXBY+

-filtermodes=0,in+,return+

Ensuring that Generated Methods Adhere to the JavaBeans Specification

The -generatebean option is a flag that you can use to ensure that generated classes follow the JavaBeans specification. The default setting is -generatebean=false.

With the -generatebean=true setting, some generated methods are renamed so that they are not assumed to be JavaBean property getter or setter methods. This is accomplished by prefixing the method names with an underscore (_).

Backward Compatibility and Migration

This section discusses issues of backward compatibility, compatibility between Java Development Kit (JDK) versions, and migration between Oracle8i, Oracle9i, Oracle Database 10g, and Oracle Database 11g releases of the JPublisher utility.

Default option settings and some features of the generated code changed in Oracle9i. If you have created an application using an Oracle8i implementation of JPublisher, you probably will not be able to rerun JPublisher in Oracle Database 10g (or Oracle9i) and have the generated classes still work within your application. In addition, there were changes in JPublisher functionality between Oracle9i and Oracle Database 10g, although to a lesser degree. The main difference is that .sqlj files are no longer visibly generated by default, but you can change this behavior through a JPublisher setting.

The following subsections cover the details:

JPublisher Backward Compatibility

The JPublisher run time is packaged with JDBC in the ojdbc14.jar, ojdbc5.8.jar, or ojdbc6*.jar library. Code generated by an earlier version of JPublisher is compatible as follows:

  • It can continue to run with the current release of the JPublisher run time.

  • It can continue to compile against the current release of the JPublisher run time.

If you use an earlier release of the JPublisher run time and Oracle JDBC drivers in generating code, then you can compile the code against that version of the JPublisher run time.

Changes in JPublisher Behavior Between Oracle Database 10g Release 1 and Release 2

Since Oracle Database 10g release 2 (10.2), JPublisher adds the following new APIs for Java classes generated for PL/SQL:

  • <init>(javax.sql.DataSource)

    A constructor that takes a java.sql.DataSource object as argument

  • setDataSource(javax.sql.DataSource)

    A method to set the data source that takes a java.sql.DataSource object as argument

These methods allow the Java wrapper to acquire a JDBC connection from the data source provided as argument.

JPublisher supports the use of SQL URI types that store URLs, referred to as data links. In Oracle Database 10g release 1 (10.1), JPublisher maps the SQL URI type, SYS.URITYPE, and the subtypes, SYS.DBURITYPE, SYS.XDBURITYPE, and SYS.HTTPURITYPE, to java.net.URL. When SQL URI types are used as PL/SQL stored procedures or SQL statement parameter and return types, this mapping works. However, when a SQL URI type is used as an attribute of a SQL type or element of a SQL array type, the mapping raises ClassCastException at run time.

To overcome this issue, in Oracle Database 10g release 2 (10.2), the SQL URI types are mapped to the ORAData subclasses that are generated by JPublisher. This is similar to the mapping used for user-defined SQL object types. You can also force JPublisher to map a SQL URI type to java.net.URL by specifying the following:

-adddefaulttypemap=
SYS.URITYPE:java.net.URL:VARCHAR2:SYS.URIFACTORY.GETURI:SYS.SQLJUTL.URI2VCHAR
-adddefaulttypemap=
SYS.DBURITYPE:java.net.URL:VARCHAR2:SYS.DBURITYPE.CREATEURI:SYS.SQLJUTL.URI2VCHAR
-adddefaulttypemap=
SYS.XDBURITYPE:java.net.URL:VARCHAR2:SYS.XDBURITYPE.CREATEURI:SYS.SQLJUTL.URI2VCHAR
-adddefaulttypemap=
SYS.HTTPURITYPE:java.net.URL:VARCHAR2:SYS.HTTPURITYPE.CREATEURI:SYS.SQLJUTL.URI2VCHAR

This includes the specification of data conversion functions.

Changes in JPublisher Behavior Between Oracle9i Database and Oracle Database 10g

Regarding backward compatibility, a key difference in JPublisher behavior between Oracle9i Database and Oracle Database 10g is that now, by default, SQLJ source code is translated automatically and the .sqlj source files are invisible to the user.

In addition, note the following changes in JPublisher behavior in Oracle Database 10g:

  • In Oracle9i Database, JPublisher generates SQLJ classes with a protected constructor with a boolean argument to specify whether the object must be initialized. For example:

    protected BaseClass(boolean init) { ... }
    

    This constructor is removed in Oracle Database 10g because it conflicts with the constructor generation for a SQL object type with BOOLEAN attributes.

  • In Oracle Database 10g, SMALLINT is mapped to int instead of short in Java.

Changes in JPublisher Behavior Between Oracle8i Database and Oracle9i Database

Note the following changes in JPublisher behavior, beginning with Oracle9i Database:

  • By default, JPublisher does not declare the inner SQLJ connection context class _Ctx for every object type. Instead, it uses the sqlj.runtime.ref.DefaultContext connection context class throughout.

    In addition, user-written code must call the getConnectionContext() method to have a connection context instance, instead of using the _ctx connection context field declared in code generated by Oracle8i versions of JPublisher.

  • Even with the -methods=true setting, non-SQLJ classes are generated if the underlying SQL object type or PL/SQL package does not define any methods. However, a setting of -methods=always always results in SQLJ classes being produced.

  • By default, JPublisher generates code that implements the oracle.sql.ORAData interface instead of the deprecated oracle.sql.CustomDatum interface.

  • By default, JPublisher places generated code into the current directory, rather than into a package/directory hierarchy under the current directory.

Changes in User-Written Subclasses of JPublisher-Generated Classes

If you provided user-written subclasses for classes generated by an Oracle8i version of JPublisher, then you must be aware that several relevant changes were introduced in Oracle9i Database related to JPublisher code generation. You must make changes in any applications that have Oracle8i functionality if you want to use them in Oracle9i Database, Oracle Database 10g, or Oracle Database 11g.


Note:

If you use the -compatible=8i or -compatible=both8i option setting, then you will not see the changes discussed here and your application will continue to build and work as before. For more information, refer to "Backward Compatibility Option".

However, it is advised that you make the transition to Oracle Database 11g or Oracle Database 10g JPublisher functionality, which insulates your user code from implementation details of JPublisher-generated classes.


You must make the following changes to use your code in Oracle9i Database, Oracle Database 10g, or Oracle Database 11g:

  • Replace any use of the declared _ctx connection context field with use of the provided getConnectionContext() method. The _ctx field is no longer supported.

  • Replace the explicit implementation of the create() method with a call to a superclass create() method, and use ORAData instead of CustomDatum as the return type.

    In the example that follows, assume that UserClass extends BaseClass. Instead of writing the following method in UserClass:

    public CustomDatum create(Datum d, int sqlType) throws SQLException
    {
      if (d == null) return null;
      UserClass o = new UserClass();
      o._struct = new MutableStruct((STRUCT) d, _sqlType, _factory);
      o._ctx = new _Ctx(((STRUCT) d).getConnection());
      return o;
    }
    

    Supply the following:

    public ORAData create(Datum d, int sqlType) throws SQLException
    {
      return create(new UserClass(),d,sqlType);
    }
    

    Alternatively, if the class is part of an inheritance hierarchy, then write the following:

    protected ORAData createExact(Datum d, int sqlType) throws SQLException
    {
      return create(new UserClass(),d,sqlType);
    }
    
  • In addition to the getConnectionContext() method, JPublisher provides a getConnection() method that can be used to obtain the JDBC connection instance associated with the object.

JPublisher Backward-Compatibility Modes and Settings

JPublisher supports settings for backward-compatibility modes through the -compatible option. At the most elementary level, this includes a setting to explicitly generate .sqlj files, which are transparent to users in Oracle Database 11g and Oracle Database 10g by default. There are also Oracle9i and Oracle8i compatibility modes, involving differences in the generated code itself as well as the creation of visible .sqlj files. The following topics are discussed:

Explicit Generation of .sqlj Files

In Oracle Database 11g, if you want to avoid automatic SQLJ translation so that JPublisher generates .sqlj files that you can work with directly, then you can use the -compatible=sqlj JPublisher setting.


Note:

In Oracle Database 11g, you do not have to invoke the SQLJ translator directly to explicitly translate .sqlj files. You can use the JPublisher -sqlj option instead.

Oracle9i Compatibility Mode

The -compatible=9i JPublisher option setting enables Oracle9i compatibility mode. In this mode, JPublisher generates code that is compatible with Oracle9i SQLJ and JDBC releases. In addition, JPublisher typically produces .sqlj files that are visible to the user, as is the case with Oracle9i JPublisher.

JPublisher has the following functionality in Oracle9i compatibility mode:

  • In SQLJ classes, JPublisher generates a protected constructor with a boolean argument that specifies whether the object must be initialized, as it does in Oracle9i:

    protected BaseClass(boolean init) { ... }
    

    This constructor has neen removed since Oracle Database 10g

  • The mapping in Java from SMALLINT reverts from int, which is the mapping in Oracle Database 11g, to short.

Oracle8i Compatibility Mode

Either the -compatible=both8i or -compatible=8i JPublisher setting enables Oracle8i compatibility mode. In this mode, JPublisher generates code that is compatible with Oracle8i SQLJ and JDBC releases. In addition, JPublisher typically produces .sqlj files visible to the user, as is the case with Oracle8i JPublisher.

However, for the use of this mode to be permissible, at least one of the following circumstances must hold:

  • You translate JPublisher-generated .sqlj files with the default SQLJ -codegen=oracle setting.

  • The JPublisher-generated code runs under JDK 1.5 or later and uses the SQLJ runtime12.jar library or runs in the Oracle Database 11g release of the server-side Oracle JVM.

  • You run JPublisher with the -methods=false or -methods=none setting.

Note the following functionality in Oracle8i compatibility mode:

  • JPublisher generates code that implements the deprecated CustomDatum and CustomDatumFactory interfaces instead of the ORAData and ORADataFactory interfaces, as with the -compatible=customdatum setting. In addition, if you choose the -compatible=both8i setting, then the generated code also implements the ORAData interface, though not ORADataFactory.

  • With the -methods=true setting, JPublisher always generates a SQLJ class for a SQL object type, even if the object type does not define any methods. This is the same as using the -methods=always setting.

  • JPublisher generates connection context declarations and connection context instances on every object wrapper class, as follows:

    #sql static context _Ctx;
    protected _Ctx _ctx;
    

    This is the same as the -context=generated setting.

  • JPublisher provides a constructor in the wrapper class that takes a generic ConnectionContext instance, which is an instance of any class implementing the standard sqlj.runtime.ConnectionContext interface, as input. In Oracle Database 11g, the constructor accepts only a DefaultContext instance or an instance of the class specified through the -context option when JPublisher was run.

  • JPublisher does not provide an API for releasing a connection context instance that has been created implicitly on a JPublisher object.

    By contrast, the JPublisher utility in Oracle Database 11g provides both a setConnectionContext() method for explicitly setting the connection context instance for an object, and a release() method for releasing an implicitly created connection context instance of an object.

If you must choose Oracle8i compatibility mode, then it is advisable to use the -compatible=both8i setting. This permits your application to work in a middle-tier environment, such as Oracle Application Server, in which JDBC connections are obtained through data sources and will likely be wrapped using oracle.jdbc.OracleXxxx interfaces. CustomDatum implementations do not support such wrapped connections.


Note:

The -compatible=both8i setting requires a JDBC implementation from Oracle9i release 1 (9.0.1) or later.

Oracle8i compatibility mode is now the only way for a _ctx connection context instance to be declared in JPublisher-generated code. No other option setting accomplishes this particular Oracle8i behavior. The _ctx instance may be useful if you have legacy code that depends on it, but otherwise you should obtain connection context instances through the getConnectionContext() method.

Individual Settings to Force Oracle8i JPublisher Behavior

The individual option settings detailed in Table 4-1 will produce results, most of which are similar to those produced when using JPublisher in Oracle8i compatibility mode.

Table 4-1 JPublisher Backward Compatibility Options

Option SettingBehavior

-context=generated

This setting results in the declaration of an inner class, _Ctx, for SQLJ connection contexts. This is used instead of the default DefaultContext class or user-specified connection context classes.

-methods=always

This setting forces generation of SQLJ classes, in contrast to non-SQLJ classes, for all JPublisher-generated classes, whether or not the underlying SQL objects or packages define any methods.

-compatible=customdatum

For Oracle-specific wrapper classes, this setting results in JPublisher implementing the deprecated oracle.sql.CustomDatum and CustomDatumFactory interfaces instead of the oracle.sql.ORAData and ORADataFactory interfaces.

-dir=.

Setting this option to a period (.), results in the generation of output files into a hierarchy under the current directory, as was the default behavior in Oracle8i.


For detailed descriptions of these options, refer to the following:

PK,PK.A OEBPS/lot.htm$ List of Tables PK2)$PK.AOEBPS/trblshtg.htm - Troubleshooting

B Troubleshooting

This chapter covers the troubleshooting tips for JPublisher. It contains the following sections:

Error While Publishing Web Services Client

When publishing Web services client using the -proxywsdl opting, you may come across one of the following errors:

java.lang.Exception: Error compiling generated client proxy
Can't load library "jdk12/jre/lib/i386/libjava.so", because
jdk12/jre/lib/i386/libjava.so: symbol __libc_wait, version
GLIBC_2.0 not defined in file libc.so.6 with link time reference
Could not create the Java Virtual Machine.

Or

% jpub -proxywsdl=...
 
Method getStackTrace() not found in class java.lang.Exception.
         _e.setStackTrace(e.getStackTrace());
                                         ^
1 error

This problem is caused by Java Development Kit (JDK) 1.2 used in the environment. You must include JDK 1.4 in the PATH environment variable to resolve this error.

PKxm PK .Aoa,mimetypePK.A# RM:iTunesMetadata.plistPK.AYuMETA-INF/container.xmlPK.A[pTOOEBPS/cover.htmPK.A#OOEBPS/img/avl_prod_cmp.gifPK.A}OEBPS/img_text/avl_prod_cmp.htmPK.AqxH C OEBPS/img_text/jpub01094.htmPK.Azo!bOEBPS/img_text/install_loc.htmPK.AVQOEBPS/img_text/prereq_check.htmPK.A_HOEBPS/img_text/install.htmPK.AOEBPS/img_text/welcome.htmPK.Aj "OEBPS/img_text/install_type.htmPK.A& OEBPS/img_text/summary.htmPK.ABAQ OEBPS/genclint.htmPK.ATlJ MOEBPS/toc.ncxPK.AJ` YOEBPS/content.opfPK.A zOEBPS/lof.htmPK.A_ OEBPS/dcommon/prodbig.gifPK.AY@ OEBPS/dcommon/doclib.gifPK.AJ/;JhgMOEBPS/dcommon/oracle-logo.jpgPK.AOEBPS/dcommon/contbig.gifPK.AOEBPS/dcommon/darbbook.cssPK.AMά""!OEBPS/dcommon/O_signature_clr.JPGPK.APz OEBPS/dcommon/feedbck2.gifPK.A-TOEBPS/dcommon/feedback.gifPK.Aː5i$OEBPS/dcommon/booklist.gifPK.AN61%OEBPS/dcommon/cpyr.htmPK.A!:3.F8OEBPS/dcommon/masterix.gifPK.AeӺ1,9OEBPS/dcommon/doccd.cssPK.A7 7<OEBPS/dcommon/larrow.gifPK.A#^>OEBPS/dcommon/indxicon.gifPK.AS'"@OEBPS/dcommon/leftnav.gifPK.Ahu,7BOEBPS/dcommon/uarrow.gifPK.Al-OJREOEBPS/dcommon/oracle.gifPK.A(MOEBPS/dcommon/index.gifPK.AGC -OOEBPS/dcommon/bookbig.gifPK.AJV^MYOEBPS/dcommon/rarrow.gifPK.A枰pkh[OEBPS/dcommon/mix.gifPK.Ao"nR M ^OEBPS/dcommon/doccd_epub.jsPK.Av I hOEBPS/dcommon/toc.gifPK.A r~$jOEBPS/dcommon/topnav.gifPK.A1FAmkOEBPS/dcommon/prodicon.gifPK.A3( # nOEBPS/dcommon/bp_layout.cssPK.Ax[?:l|OEBPS/dcommon/bookicon.gifPK.Ap*c^OEBPS/dcommon/conticon.gifPK.AʍOEBPS/dcommon/blafdoc.cssPK.A+&OEBPS/dcommon/rightnav.gifPK.Aje88OEBPS/dcommon/oracle-small.JPGPK.Aއ{&!QOEBPS/dcommon/help.gifPK.ArXX OEBPS/toc.htmPK.AܩL|L1OEBPS/usejpub.htmPK.A,~OEBPS/adfeacon.htmPK.A2)$ tIOEBPS/lot.htmPK.Axm QOEBPS/trblshtg.htmPKDD?[