PK .[Eoa,mimetypeapplication/epub+zipPK.[EiTunesMetadata.plistj artistName Oracle Corporation book-info cover-image-hash 115764181 cover-image-path OEBPS/dcommon/oracle-logo.jpg package-file-hash 284966038 publisher-unique-id E16180-01 unique-id 60652233 genre Oracle Documentation itemName Oracle® Fusion Middleware Desktop Integration Developer's Guide for Oracle Application Development Framework, 11g Release 2 (11.1.2.0.0) releaseDate 2011-04-27T22:57:58Z year 2011 PKtOPK.[EMETA-INF/container.xml PKYuPK.[EOEBPS/ap_desk_integ_el_expr.htmeT ADF Desktop Integration EL Expressions

B ADF Desktop Integration EL Expressions

This appendix describes the syntax for EL expressions in ADF Desktop Integration and provides guidelines for writing EL expressions.

This appendix includes the following sections:

B.1 Guidelines for Creating EL Expressions

The following list describes the characteristics that EL expressions for your integrated Excel workbook can have and provides recommendations for writing EL expressions:

B.2 EL Syntax for ADF Desktop Integration Components

Table B-1 lists supported expression properties for the ADF Desktop Integration components that support EL expressions.

The EL expressions use the following syntax to reference these properties:

#{components.componentID.property}

where componentID references the ID of the component and property references the property (for example, rowCount).

Table B-1 Expression Properties for ADF Desktop Integration Components

PropertyComponent TypeProperty TypeExpected Runtime ValuesValue at Design Time

rowCount

Table

ROTable

Int

>=0

0

currentRowIndex

Table

ROTable

Int

>= 0 AND < RowCount (zero based index)

-1

currentRowMode

Table

String

"insert"

"update"

"unknown"

errors

Table

String

N/A

N/A

readOnly

Table.Column

Boolean

TRUE

FALSE

FALSE


Write EL expressions with the following syntax to retrieve:

Table B-2 describes the supported syntax and properties for Oracle ADF control bindings. For information about the attribute control hints (controlHint) that ADF Desktop Integration supports, see Table B-3.

You can use the expression builder described in Section 5.8, "Using the Expression Builder" to generate some of the EL expressions described in Table B-2. You have to write some other EL expressions as indicated in Table B-2.

Table B-2 Expression Properties and Syntax for Oracle ADF Control Bindings

SyntaxComponent TypeObject PropertyValue at Design Time

Use the expression builder to generate EL expressions with the following syntax:

#{bindings.attributeID}
#{bindings.attributeID.label}
#{bindings.attributeID.hints.controlHint}

You can also write the previous EL expressions in addition to the following EL expression:

#{bindings.attributeID.inputValue}

Attribute

Attribute control hint

""

Use the expression builder to generate EL expressions with the following syntax:

#{bindings.ListID}
#{bindings.ListID.label}
#{bindings.ListID.hints.controlHint}

List

Attribute control hint

""

Write EL expressions with the following syntax for a column in a table-type component

#{row.bindings.attributeID.inputValue}

Write an EL expression with the following syntax when adding a dynamic column to an ADF Table component as described in Section 7.15, "Adding a Dynamic Column to Your ADF Table Component":

#{bindings.TreeID.[TreeNodeID].AttributeNamePrefix*.inputValue}
#{bindings.TreeID.AttributeNamePrefix*.inputValue}
#{bindings.TreeID.[TreeNodeID].hints.AttributeNamePrefix*.controlHint}
#{bindings.TreeID.[TreeNodeID].hints.AttributeNamePrefix*.label}

A value for AttributeNamePrefix and [TreeNodeID] is optional while * is required.

Table.Column

inputValue

""

B.3 Attribute Control Hints in ADF Desktop Integration

ADF Desktop Integration can read the values of the attribute control hint names described in Table B-3. You write EL expressions that ADF Desktop Integration uses to retrieve the value of an attribute control hint from your Fusion web application. Table B-2 describes the EL expression syntax that retrieves the values of attribute control hints at runtime.

You configure attribute control hints in your Fusion web application. Information about how to add an attribute control hint to an entity object can be found in the "Defining Attribute Control Hints for Entity Objects" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework. Information about how to add an attribute control hint to a view object can be found in the "Defining Attribute Control Hints for View Objects" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Table B-3 Attribute Control Hints Used by ADF Desktop Integration

Attribute Control HintTypeValue to configure in the Fusion web application

label

String

References the value of the label attribute control hint configured for an entity or view object.

updateable

Boolean

Returns true if the associated attribute binding is updatable.

readOnly

Boolean

This attribute control hint is unique to ADF Desktop Integration. Returns true if the associated attribute binding is not updatable.

To optimize the performance of an integrated Excel workbook when it evaluates Excel formulas in EL expressions, it is recommended that you write an EL expression with the following syntax for a component's ReadOnly property:

#{bindings.attributeID.hints.readOnly}

rather than:

=NOT(#{bindings.attributeID.hints.updateable})

Note that the attribute control hint readOnly property differs to the ReadOnly property of ADF Desktop Integration components described in Section A.1, "Frequently Used Properties in the ADF Desktop Integration."

mandatory

Boolean

Returns true if a value for the associated attribute binding is required.

dataType

String

Returns the data type of the attribute control hint. A Fusion web application can support many data types with complex names. The dataType attribute control hint was introduced in ADF Desktop Integration to simplify the writing of EL expressions. It maps the data types that a Fusion web application supports to the values supported by ADF Desktop Integration listed here:

  • string

  • number

  • date

  • boolean

  • other


The ADF Desktop Integration attribute control hints are based on information available in the web application's model configuration. ADF Desktop Integration supports view object or entity object hint values, but does not support programmatic overrides of hint values if they are calculated at a row-by-row level at runtime.

PKK jTeTPK.[EOEBPS/config_appear.htm Configuring the Appearance of an Integrated Excel Workbook

9 Configuring the Appearance of an Integrated Excel Workbook

This chapter describes how you configure the appearance of an integrated Excel workbook using styles that ADF Desktop Integration defined and that you define in Excel. The chapter also discusses how you can use EL expressions to dynamically apply styles to Oracle ADF components in a workbook at runtime.

This chapter includes the following sections:

9.1 About Configuring the Appearance of an Integrated Excel Workbook

You can configure the appearance of an integrated Excel workbook using both Excel functionality and Oracle ADF functionality. Configuring the appearance of a workbook may make the workbook more usable for end users. For example, applying a particular style to cells that render ADF Output Text components at runtime may indicate to end users that the cell is read-only. You may also want to configure the appearance of an integrated Excel workbook so that it aligns with your company's style sheet or the color scheme of the Fusion web application that the Excel workbook integrates with.

Using styles to configure your data in your integrated Excel workbook gives you many benefits. For example, you can use a particular style for ADF Output Text components, and a different style for ADF Input Text components.

ADF Desktop Integration provides several predefined Excel styles to apply to the ADF Desktop Integration components you configure in a workbook. You may want to define additional styles to meet the needs of your desktop integration project. If you do, familiarize yourself with the formats in an Excel workbook that render differently depending on the locale, region, and language.

9.1.1 Integrated Excel Workbook Configuration Use Cases and Examples

You can customize the appearance of ADF Desktop Integration components using styles. For example,Figure 9-1 shows various styles applied to the columns of ADF Table in EditPriceList.xlsx. Note that some styles shown in Figure 9-1 are predefined styles (for example, _ADFDI_TableCellStyle) and others are created by the developer (for example, mplTableCellR0Pctg).

Figure 9-1 Styles Applied to Columns of ADF Table in EditPriceList.xlsx

Styles Applied to Columns of ADF Table in EditPriceList.xlsx

9.1.2 Additional Functionality for Configuring the Appearance of an Integrated Excel Workbook

After you have applied styles to configure the appearance of your integrated Excel workbook, you may find that you need to add additional functionality to configure your workbook. Following are links to other functionalities that you can use:

9.2 Working with Styles

ADF Desktop Integration provides a mechanism to apply Excel-defined styles to some Oracle ADF components at runtime. The Oracle ADF components that support the application of styles have properties with StyleName in their name. For example, the column properties of the ADF Table and ADF Read-only Table components both support the properties HeaderStyleName and CellStyleName that determine styles to apply at runtime.

9.2.1 Predefined Styles in ADF Desktop Integration

Many properties have default values that are drawn from a predefined list of ADF Desktop Integration module styles. For example, the HeaderStyleName property's default value is _ADFDI_HeaderStyle, one of the predefined styles in ADF Desktop Integration. ADF Desktop Integration automatically adds these predefined styles to the Excel workbook once when it is enabled for use with ADF Desktop Integration.

The following is the list of predefined styles:

  • _ADFDI_FormBottomStyle

  • _ADFDI_FormDoubleClickCellStyle

  • _ADFDI_FormTopStyle

  • _ADFDI_HeaderStyle

  • _ADFDI_InputTextStyle

  • _ADFDI_LabelStyle

  • _ADFDI_OutputTextStyle

  • _ADFDI_ReadOnlyTableStyle

  • _ADFDI_TableCellROStyle

  • _ADFDI_TableCellStyle

  • _ADFDI_TableChangedColumnStyle

  • _ADFDI_TableDoubleClickCellStyle

  • _ADFDI_TableFlagColumnStyle

  • _ADFDI_TableKeyCellStyle

  • _ADFDI_TriangleHeaderStyle

You can merge these styles and other styles that you define yourself from an integrated Excel workbook into another Excel workbook that you intend to integrate with a Fusion web application. You may create additional styles for use in your Excel workbook. For example, to add a date-specific formatting, you can duplicate _ADFDI_TableCellStyle, call it MyTableCellDateStyle, and add your date-specific formatting.

Once you have decided what styles to apply to the ADF Desktop Integration components at runtime, you can write EL expressions to associate a style with a component. The ADF Desktop Integration component properties that include StyleName in their name take an EL expression as a value. The ADF Label component and the Label property of other ADF components also support EL expressions. These EL expressions can retrieve the values of string keys defined in resource bundles or the values of attribute control hints defined in your Fusion web application.

For more information about creating new styles and merging styles into a workbook, see Excel's documentation.

9.2.2 Excel's Date Formats and Microsoft Windows' Regional and Language Options

Some formats in the Date category of the Number styles that Excel can apply to cells change if a user changes the locale of the local system using the Regional and Language Options dialog that is accessible from the Microsoft Windows Control Panel. The * character precedes these formats in the Type list. Figure 9-2 shows an example of a Date type that formats dates in a cell using French (France) conventions.

Figure 9-2 French Date Formats in Excel

Date Formats in Excel

If the end user changes the regional options of a system to use English (United States), as illustrated in Figure 9-3, the cells that are formatted with the style in Figure 9-2 use the English (United States) conventions.

Figure 9-3 US English Date Formats in Excel

Regional and Language Options in Excel

9.2.3 How to Apply a Style to an Oracle ADF Component

To apply a style to an Oracle ADF component, use the property inspector to set values for properties with StyleName in their name.

Before you begin:

It may be helpful to have an understanding of styles. For more information, see Section 9.2, "Working with Styles."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 9.1.2, "Additional Functionality for Configuring the Appearance of an Integrated Excel Workbook."

To apply a style:

  1. In the integrated Excel workbook, select the cell that references the Oracle ADF component you want to modify and then click the Edit Properties button in the Oracle ADF tab.

    For example, select a cell that references an ADF Table component.

  2. Click Columns and then the value for the column in the array of columns where you want to modify the format of cells at runtime.

  3. Select the CellStyleName property and click the ellipsis button (...) to display the Edit Expression dialog.

  4. Expand the Styles node and select the style to apply to cells in the column at runtime.

    For example, apply a currency-based style (Currency[0] style) to the List Price databound column of Currency type. Applying the Currency[0] style rather than a general style to a databound column of Currency type results in runtime data (price values) appearing as values rounded off to zero decimal places rather than a regular value (with two decimal places).

  5. Click Insert Into Expression to insert Currency[0] into the Expression field.

    Figure 9-4 shows the Edit Expression dialog.

    Figure 9-4 Edit Expression Dialog Applying a Style

    The Edit Expression dialog box applies a style.
  6. Click OK.

9.2.4 What Happens at Runtime: How Style Is Applied to an ADF Component

The EL expression that you entered as a value for the property with StyleName in its name is evaluated at runtime. If it corresponds to one of the predefined styles or one that you defined, the style is applied to the ADF component that you set the property for.

If a cell that references an ADF component has a style applied to it that differs from the style defined in the properties of the ADF component, the ADF component overwrites the existing style at runtime and applies the style defined by its properties.

For example, Figure 9-5 shows the runtime values of the Site Price column after the Currency[0] style is applied, overriding the default TableCellCurrency style.

Figure 9-5 Runtime Values After Applying Another Style

Runtime values of a column after applying another Style

9.3 Applying Styles Dynamically Using EL Expressions

Oracle ADF component properties that include StyleName in their name can take an EL expression as a value. The EL expressions that you write can resolve to a named Excel style at runtime that is applied to the ADF component. The EL expressions that you write are Excel formulas that may include ADF data binding expressions. ADF Desktop Integration does not evaluate or apply results when a user navigates between cells or during upload.

The following examples show different contexts where you can use EL expressions to determine the behavior and appearance of ADF components at runtime. Example 9-1 applies a style dynamically during download. If the status value for binding is Closed, apply a read-only style (MyReadOnlyStyle). Otherwise apply another style (MyReadWriteStyle).

Example 9-1 Applying a Style Dynamically During Download

=IF("#{bindings.Status}" = "Closed", "MyReadOnlyStyle", "MyReadWriteStyle")

Example 9-2 uses a mixture of Excel formulas and ADF binding expressions to handle errors and type conversion.

Example 9-2 EL Expressions to Handle Errors and Type Conversion

=IF(ISERROR(VALUE("#{bindings.DealSize}")), "BlackStyle", IF(VALUE("#{bindings.DealSize}") > 300, "RedStyle", "BlackStyle"))

9.3.1 What Happens at Runtime: How an EL Expression Is Evaluated

When evaluating EL expressions at runtime, ADF Desktop Integration determines the value that the EL expression references. It then replaces the EL expression in the Excel formula with the value. In Example 9-1, ADF Desktop Integration first determines that value of the EL expression, #{bindings.Status}, in the following Excel formula:

=IF("#{bindings.Status}" = "Closed", "MyReadOnlyStyle", "MyReadWriteStyle")

It then replaces the EL expression with the runtime value, as in the following example, where the expression evaluated to Closed:

=IF("Closed" = "Closed", "MyReadOnlyStyle", "MyReadWriteStyle")

Excel evaluates the formula and, in this example, applies the MyReadOnlyStyle style.

9.3.2 How to Write an EL Expression That Applies a Style at Runtime

You write EL expressions for the Oracle ADF component properties that support EL expressions in the Edit Expression dialog that is accessible from the Oracle ADF component's property inspector. Figure 9-6 displays an Edit Expression dialog launched from the property inspector window of an ADF Button component.

Figure 9-6 Edit Expression Dialog

EL Edit Expression dialog box

Before you begin:

It may be helpful to have an understanding of how to apply styles dynamically. For more information, see Section 9.3, "Applying Styles Dynamically Using EL Expressions."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 9.1.2, "Additional Functionality for Configuring the Appearance of an Integrated Excel Workbook."

To write an EL expression that applies a style at runtime:

  1. Open the integrated Excel workbook.

  2. Select a cell in the Excel worksheet that references the Oracle ADF component for which you want to write an EL expression.

  3. Click the Edit Properties button in the Oracle ADF tab to display the property inspector.

  4. Select the property in the property inspector with which you want to associate an EL expression and click the ellipsis button (...) to display the Edit Expression dialog.


    Note:

    The Edit Expression dialog appears only if the Oracle ADF component that you selected in Step 2 supports EL expressions. Depending on the context, the ellipsis button (...) can launch other editors such as the Edit Action dialog.

    The Edit Expression dialog, as illustrated in Figure 9-6, displays a hierarchical list of the Oracle ADF components, bindings, styles, resources, and Excel functions that you can reference in EL expressions. For more information about the syntax of EL expressions that you enter in this dialog, see Appendix B, "ADF Desktop Integration EL Expressions."

9.3.3 What You May Need to Know About EL Expressions That Apply Styles

EL expressions that evaluate to styles are applied when:

  • An ADF Table component invokes its Download or DownloadForInsert actions

  • Rows are inserted into an ADF Table component

  • A worksheet invokes its DownSync action

EL expressions that evaluate to styles are not applied when:

  • An ADF Table component invokes its RowDownSync action

  • The end user edits the format properties of a cell

    Note also that an EL expression that evaluates to a style is not reevaluated when the end user edits a cell's value.

  • The runtime value of an EL expression does not match a style defined in the end user's integrated Excel workbook

    In this scenario the style formats of the targeted cells do not change. Instead, they retain their existing style formats. If you configured client-side logging, ADF Desktop Integration generates an entry in the log file when an EL expression evaluates to a style that is not defined in the end user's integrated Excel workbook. For more information about client-side logging, see Section C.3, "Generating Log Files for an Integrated Excel Workbook."

9.4 Using Labels in an Integrated Excel Workbook

Use labels to provide end users with information about how they use the functionality in an integrated Excel workbook. You can write EL expressions that retrieve the value of string keys defined in a resource bundle or that retrieve the values of attribute control hints. An integrated Excel workbook evaluates the value of a Label property only when the workbook is initialized.

9.4.1 Retrieving the Values of String Keys from a Resource Bundle

Figure 9-7 shows a portion of the design time view of the EditPriceList-DT.xlsx workbook in the Master Price List module. It shows examples of ADF Label components and ADF Button components that have EL expressions specified for their Label properties.

Figure 9-7 Design Time View of an ADF Label Component and an ADF Button Component with Label Property

Design-time view of label properties

At runtime, these EL expressions resolve to string keys defined in the res resource bundle that is registered with the Master Price List module. You define resource bundles in the workbook properties dialog. For information about referencing string keys from a resource bundle, see Section 10.2, "Using Resource Bundles in an Integrated Excel Workbook."

Figure 9-8 shows the corresponding runtime view of the ADF Label component and ADF Button component illustrated in design mode in Figure 9-7.

Figure 9-8 Runtime View of an ADF Label Component and an ADF Button Component with Label Property

Runtime view of label properties

9.4.2 Retrieving the Values of Attribute Control Hints

In addition to string keys from resource bundles, the ADF Label component and the Label property of other ADF components can reference attribute control hints that you define for entity objects and view objects in your JDeveloper project. Figure 9-9 shows the expression builder for the Product Name column in the EditPriceList-DT.xlsx workbook's ADF Table component. The expression builder contains an EL expression for the HeaderLabel property of the ProductName column that retrieves the value (Product Name) defined for an attribute control hint at runtime.

Figure 9-9 EL Expression That Retrieves the Value of an Attribute Control Hint for a Label Property

EL expression to retrieve an attribute control hint

Attribute control hints can be configured for both view objects and entity objects. Information about how to add an attribute control hint to an entity object can be found in the "Defining Attribute Control Hints for Entity Objects" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework. Information about how to add an attribute control hint to a view object can be found in the "Defining Attribute Control Hints for View Objects" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

9.4.3 How an Integrated Excel Workbook Evaluates a Label Property

An integrated Excel workbook evaluates the Label properties of ADF components when the workbook is initialized after you or the end user opens the workbook for the first time. The integrated Excel workbook saves the retrieved values for the Label properties when the workbook itself is saved to a directory on the system.

The retrieved values for the Label properties do not get refreshed during invocation of actions such as the worksheet's DownSync action or the ADF Table component's Download action. You indirectly refresh the retrieved values of the Label properties if you invoke the workbook actions ClearAllData or EditOptions described in Table A-17.

9.5 Using Styles to Improve the User Experience

It is good practice to provide end users of integrated Excel workbooks with information that helps them understand how to use the ADF components that you provide to integrate with a Fusion web application. You can do this by:

9.5.1 Using ADF Label Components to improve the User Experience

You can use ADF Label components to provide end users of an integrated Excel workbook information about how to use other ADF components in the workbook. For example, many forms, by convention, use an * to indicate to end users that they must enter a value in an input field. Figure 9-10 shows three ADF Input Text components with ADF Label components in adjoining cells. Each ADF Label component references an EL expression that retrieves the value of a string key from a resource bundle at runtime. Each string key includes the * character to indicate to end users that they must supply a value.

Figure 9-10 ADF Label Components Providing End-User Instruction

ADF Label Components Providing End-User Instruction

For information about using resource bundles, see Section 10.2, "Using Resource Bundles in an Integrated Excel Workbook."

9.5.2 What You May Need to Know About the Read-Only Property in an Integrated Excel Workbook

Note the following points about the read-only property in an integrated Excel workbook:

  • ADF Output Text, ADF Label, and ADF Table header row do not have read-only properties. However, these components have implied read-only behavior. In addition, end users can enter values in the cells that host these components and temporarily change the values that appear in these cells. ADF Desktop Integration ignores these changes when uploading from the worksheet and overwrites them when it downloads data from the Fusion web application.

  • The ADF Input Text component, ADF List of Values component, and TreeNodeList subcomponent each have a read-only property (ReadOnly).


    Note:

    If you specify an Excel formula in the Value property of an ADF Input Text component, the component behaves as if its ReadOnly property were True. The component ignores the actual value of the ReadOnly property.

  • To protect the values of read-only cells at runtime, set the worksheet protection to automatic. When an attempt is made to edit a read-only cell after enabling worksheet protection, Excel displays a warning message and the edit is blocked. For more information about worksheet protection, see Section 9.7, "Using Worksheet Protection."

  • Do not use the Excel's Protect Sheet or Protect Workbook features directly in an integrated Excel workbook. Also, ensure that end users do not use these features.

To prevent end-user confusion, apply styles to components, such as the ADF Output Text component, that indicate to end users whether a component is read-only or can be edited. By default, the ADF Output Text component uses the predefined style, _ADFDI_OutputTextStyle. You can define your own styles and apply them to components as described in this chapter.

For more information about the properties that ADF Desktop Integration components support, see Appendix A, "ADF Desktop Integration Component Properties and Actions."

9.6 Branding Your Integrated Excel Workbook

ADF Desktop Integration provides several features that you can configure to brand your integrated Excel workbook with information such as application name, version information, and copyright information. You can use the workbook BrandingItems group of properties to associate this information with an integrated Excel workbook. You must configure a Ribbon tab as described in Section 8.3, "Configuring the Runtime Ribbon Tab" so that the end user can view this branding information by clicking a ribbon button that invokes the ViewAboutDialog workbook action at runtime. For more information about workbook actions, see Table A-17.

You can also define string keys in a resource bundle to define information, such as titles, in one location that can then be used in multiple locations in an integrated Excel workbook at runtime when EL expressions retrieve the values of these string keys. For information about defining string keys, see Section 10.2, "Using Resource Bundles in an Integrated Excel Workbook."

9.6.1 How to Brand an Integrated Excel Workbook

You define values for the workbook BrandingItems group of properties.

Before you begin:

It may be helpful to have an understanding of how to customize brand of your integrated Excel workbook. For more information, see Section 9.6, "Branding Your Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 9.1.2, "Additional Functionality for Configuring the Appearance of an Integrated Excel Workbook."

To brand an integrated Excel workbook:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. In the Edit Workbook Properties dialog, click the ellipsis button (...) beside the input field for BrandingItems.

  4. In the Edit BrandingItems dialog, click Add and specify values for the new element as follows:

    • Name

      Specify the name, or the EL expression, of the branding item to define.

    • Value

      Specify a literal string or click the ellipsis button (...) to invoke the expression builder and write an EL expression that retrieves a value at runtime. BrandingItems must use literal strings or resource expressions, and must not contain any binding expression.

    Figure 9-11 shows the design time view of branding items in the Master Price List module.

    Figure 9-11 Design Time View of Branding Items in the Master Price List Module

    Design-time View of Branding Items in the MPL Module
  5. Click OK.

9.6.2 What Happens at Runtime: the BrandingItems Group of Properties

At runtime, the name-value pairs that you define for the BrandingItems group of properties appear in a dialog that the end user invokes from the About button of the Oracle ADF tab, which you configured to appear, as described in Section 8.3, "Configuring the Runtime Ribbon Tab." Figure 9-12 shows the runtime view of branding items in the Master Price List module's EditPriceList.xlsx workbook.

Figure 9-12 Runtime View of Branding Items in the Master Price List Module

Runtime View of Branding Items in the MPL Module

9.7 Using Worksheet Protection

By default, the end user can edit the values of locked cells and ADF Desktop Integration read-only components, such as ADF Label and ADF Output Text, at runtime. While uploading data, ADF Desktop Integration ignores these changes and overwrites them when it downloads data from the Fusion web application.

To prevent editing of locked cells at runtime, you must enable worksheet protection. Optionally, you can also provide a password to prevent the end user from turning off worksheet protection.

9.7.1 How to Enable Worksheet Protection

Worksheet protection enables true read-only mode for locked and read-only cells, and prevents any editing at runtime.

Before you begin:

It may be helpful to have an understanding worksheet protection. For more information, see Section 9.7, "Using Worksheet Protection."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 9.1.2, "Additional Functionality for Configuring the Appearance of an Integrated Excel Workbook."

To enable Worksheet Protection:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. In the Edit Worksheet Properties dialog, expand the Protection property and configure values as follows:

    • To enable worksheet protection at runtime, set the Mode to Automatic.

    • If desired, provide a value in the Password field. The end user cannot turn off sheet protection at runtime without knowing this value.

      Note that the password is not encrypted and that the maximum password length allowed by Excel is 255 characters. If you specify a longer password, it will be truncated silently at runtime when sheet protection is toggled.

    Figure 9-13 shows the design time view of worksheet protection in the Master Price List module.

    Figure 9-13 Design Time View of Worksheet Protection in the Master Price List Module

    Design Time View of Worksheet Protection Mode
  4. Click OK.

9.7.2 What Happens at Runtime: How the Locked Property Works

At runtime, if the end user tries to edit a read-only cell or a ADF Desktop Integration read-only component, Excel displays the warning message, as shown in Figure 9-14.

Figure 9-14 Worksheet Protection Warning at Runtime

Worksheet Protection Error at Runtime

When worksheet protection is enabled, ADF Desktop Integration controls the Locked property for cells that are within the bounds of ADF Desktop Integration components. The Locked property of cells outside the bounds of ADF Desktop Integration components is not affected.

At runtime, ADF Desktop Integration evaluates the read-only behavior of its components. Some components such as ADF Label and ADF Output Text, are always read-only, and other components, such as ADF Input Text, have a read-only property. At runtime, the Locked property is set to true when read-only for the component evaluates to true. The header labels of ADF Table components are always read-only, but column subcomponents might be ADF Output Text or ADF Input Text. At runtime, each components read-only behavior is evaluated and the corresponding cell's Locked property is set to the appropriate value.

9.7.3 What You May Need to Know About Worksheet Protection

Worksheet protection is not enabled by default, you need to enable it at design time if you want to use it for a particular worksheet. Also, after worksheet protection is enabled, the Locked property for cells is set at runtime, not at design time.

It is important to note that the password used for worksheet protection is itself not encrypted or stored in a safe location. Worksheet protection is used to improve worksheet usability, not to protect sensitive data.

After worksheet protection is enabled, Excel behaves differently. Here are some differences that you can expect:

  • The ADF Table components cannot be sorted, as they include read-only cells in the Key column.

  • The end user can insert a full row or column. However, once inserted, they cannot be deleted.

  • The end user cannot insert partial rows or columns.

PK cYPK.[EOEBPS/dcommon/oracle.gifJGIF87aiyDT2F'G;Q_oKTC[ 3-Bq{ttsoGc4I)GvmLZ).1)!ꑈ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.[EOEBPS/dcommon/oracle-logo.jpgwJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222'7" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE!KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEzE7V%ȣ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@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((_ğ<+F; sU%ԑ >,BH(uSU xþ1Wϲs${wgoQn_swB/'L\ܓFgԏZ ^dj^L^NmH Ҁ6(?nƓjh%ةlΣ /F6}pj2E3HgHЌ(UQR8oX,G8OB]>o9@$xWy'ڹOM=ҼWb"٠9-*r⬻zWokeh͝(F@n~X=q+⟇1b>ƑeIX.~C,o5የ-m;D Nʬ` `+CcE??Ki!R!cxw[ jvc}&Eٱ7T)8&þ/?os$wSn^bo:-4^js4JKm!#rv89>' O59t , \8r,Vk|IgxEv((RmĜ+bkz6,u/}-|.'<VÚ~tk,^cH61¢ !;M;Ėz[#CuAƶ+j_&*/;Q8d ǹHyAsM↷7l-6rò,%Fs;A*',}'f[]tݷs~UWhk?:4JE]WpcY=" ƚw/|_xSw(kycH#r28,X7D5Kh76 mɍ~0H;6194WpGӧգ%8Z&GdPƧo6kcO5Kv`{}fyq \`@?Kv=26OޝyAe Qɼ芍H8͟2敮j#;iѻm؏6+wTx;KYY\-%'Aӣ?|=\-ٴk+٬$ɷ_X<+{#:8Il>/K[]TՇzY-߇c]lh-C~_nJpTxl7d-j ?m]'Sː,I1@Ug>yfnvyx]kN8\fU#=[dl6N02*7w6p%ծߴBn]9\Fzן/G5r ~\&%B@C)G'9+4fH<j7_t "}j 4#9a'zxw:j평!tbԴ4o5$  @Ey^? oFoZl ŇeY#xJX9pvUim/g/J?w?^Lͻ~=Q\]45i]2[5b s #j6 7*T<6Bp qX濳}hmS`rqҳYs/ZZ|>JI3HrFOy];Yt5&-i7c̏?6*?wnG&}w k+ϲG 4WZ׊0?LGk1UXR'qw,/F[o=88+@%sqd4QEQEQEQEQEQEQEQEQEbj??G_h߷nw}s{aE~4?֖0֦bّL cs:FխeZ|i4m$ldnxuzE~ιqnO yQGA9bVqlX?|'}X,Xno-FIZ7 rrצQ@OxA _6_hkDC2@0p;u<&rwӡm/Ay$MȦcbJ_[YwwW[ ˴e98@MF?kk}:o۾._Tz(<þ }ƺG-<]g[ L2m" U?9C>y<׍dv.U$('ڽ2Ej7[[~wBp;_< ]Zi1En${g[K#y : 0:`(%˩?#'CuȌ#n]ʣzLzl4M%g鳋d6"c! 6b gfJ( 3";_:?>sks~|Kc2M.-m͵ΓD 2$7>᫙`;q:ȷ3I cgyawݬ4 H8a~Լ[xCҳ\x.N&irx#x*FoM=>ģl]g%I5Q@?'YmMѺu{r~g8$zU9#KO xe'BSbFO`FI種St}ll<kH3(?[mO})Ŧ9%@Gn>-$ʞo[/S>G:ۺy^3ͷcPټI5$:m$ǰo/Xn~%!mjؼMuHlM#,B8$ >Ey"ρ|Q?t5#;ܹ :rM9/F[Go=!I+\@%qq,~&cAšn oLn‘$RfN>Ep~< Ac՟H{-000{8D~#E2bȆ6p[~@n ~lc (׊|-gũr̐0hlrG#psr Xƞ)X ͍ +};r9>S8&χN[;̋z;Tx h[j>q:ȷ3I ((((((((((Imc,kʞkLJ$ cԚi?xf[].!Mp4.ǃF1:7~:^}O U.nI 5zń~WwZ]GSZQú#ȏk >Or: XvV2j  M23.ywl< V=ƷzZ;>DګG<7A "I( 2O5M/ i-#B]2Ha6P|H|avq/^IbFvW2q@/Og4dӵ _1 iTJvI2Ȳɵ#↸Yԓ;azq4O;d9p&lj[yc SQx䍃+R#5mlwM߈Ulүfvp[$2r=TWgq65Eoo0EexxgE W%xAd݊gPtKx8 r8R-+5[]Hy^JKddTx{O%ԒUմEu1TuA{/3ƓIaaiC;~D0O~ |^|? MƀݛDAĦ8Q;v:M{Fx^ZQ/LɒBqF20H E4A/#%F\>6m oϵpdCEkkOkc)xM%KYyW&q#E`gk3YյYhjzm0Q60pr3Q__uoY Zj*w(?4F FV<mxZm*}&6fgq`i&B>V- F_Paiq|oû>T}F8d!!ar S,69hIÐs"i'#U/Xpq93^1eԓ&F7'`A8R'/\hگZ+y)ʧ-'wOawqbû>WMF99Ypa8*78WVqq,pi$0UEI$i?<\XwwƉdryXێ6b|{}6mgƿtvg$(guC@-~&k:ǟ;Q[I>[@?1ClCj%2A+$ AT/<3['?kU~P𔈃@ 1?vz]4}6i{,er+gr2x((((((((((((((((#xo :$Tuӣ 3IX-0v㸪|C}&S>^<If*Pp<(9vW/|EyYzZ]_+@̜N<4)Ro.SzXu SEp|` vO8 wGq@p2*? 5MSG$[v%ZhWSЩ yErľ;>=͚jF/jO]գt/b7H88hk>vg6 p Ov8-in˰HaqpFiQtZ{BC$EzN9džٴo ]FYCo#FIRȁI#VykIĩ Z }2 =do-0!>PA_,uڶ/u-G^ Es5E&I`X`!ߌ(oľ>. uhg m$"r8:ЇzEφ]$[ɹ@Xg#+x J+^[BhUro` |Wi@=\MnĈLnBJ33_N[I;s;Tu!ёb2 V#n\k:,7eK5hDJt3X N99 +7\F9D2)B ]9 SM.4BEv(ZB 8%N`x/4>GfHFvrNA8d#UzGtԴ[ ޠVC+T8 pAEjQ\<<"m8;)dz5O7^tD U FIgjQ\|u;ZM+cѻl$u>&.hv W ǹv# @IxuV^=#[jZvo`XUA,zxow4=^ #hp[c~`7c8h~ >/5#ːȲw|w#xssV5i_|[]qj-Y?,jr2)q #C񝽭rkB./-TX lu?ZeƙrO.OXةր6(/д_z߇[OH|+vٽmFqggZ,muN /ϳTm˟zFs@W'Ŀ᩼BcK3C".بWs0<Oc_q=Gu<Hom'3H23PIEr_wmuhT 3*37kݑEH`zYEe#[ӯGI}_kc/]9<SNGZkK}$G GqÒ00~lg"; +YV]cSK3rU`^d_Ykwo/K+IA-W#P^a]^cSɷ'!Aڼ>V9N6(((((((((((kM'O4 5fJ%u#'lckiO [AmJ.nKŢw1# HTM;KuJ&ݝ`0f$^QhvfrvNUԆFA䎄_.wZgyݷlۻn`ǧP>'wٻ3GxAEd&MaF(myxsH𶖺ncr,ǩfbK$3*G}ܾ3w_W1' Om_Cfvw vytW_Ɖ ?|N/?KiflyJ|q8:צj5{cilf*T QJ[%{k?w'>9oڳ;9_+ng N4Z}]<1v r;V_|Aq1OA#I Fsu4/).r\'(g"l tx'L1 K[o2C"ʸT`8gܩtxJï:|Aq1OA#I Fsu5q<-G>2YM&O>kduP͟΀83j|O+?0="Nyfwl˶3ľ t G mFr@9N:ЇÚE`-$۵BT ''-Iy/~G ,m<3~?]O<5`_=}^FSfxsV,,m:?.$NPNho_u͞mVW}ZIgegk$03IHC ~Ig;WWïVh$];<W!;q3o].ֶOܶe:qHX̻8ȓn7g]A5^LR\G9V` 1 `xv =NK;H.dgHʞOJM}TԬ4<nkArg࿊IJoݭaP@nd܁pO&7~1X׼Goqsq+,F[FqӻO|'?/q`ǧP>'wٻ3i_0 {M r쌄2px4 ik1Z/Ibzf$2I ?¯~o7qusy_>4^neD;vonwgO~hg1dfǙ7ӭzf#Yh71ȉhɉB@A t/U5(#?ّcCQ?)+bGJ>5XYsR;H;O08lv$t[4:,gEv 9R[4:,gEv 9R' ÿf;j[>^~m~|V8`S8P!+4N>oKۏ|ύ8ڣ摧V1ķ7L4Č1S' *E-;y_]親w_2_zW.d v#ʺ }ON̵7#OJx) j=-n۞UXCu}0HFU> }3N˵!7'ZwiƝ\|߲K.Aj#zmIծKY>ɱ@>Ząz+Yz^|{𝮭5N(4 QY;!Iz5i)M֬c.cXt*ASd#5:yi$Zy ̜fc0I=gn[kq(1I7<0Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_SIZgB&~bBk֥6]#TX{(n$X 1$d'%Uj< $_ K@!J/5ifWsa PprH?2Wv?=\h 56K[H&P6c#`@xA55G{ @prOchA<7V\[J6 dGk]_nj&PñoC O<5`_xL? G5֯_)-UMXGZ)Ig ZDHw}rvHo#I?G˼:'n@#jzL_kk2e7 ڨ@ ' jZ[ƩZXdbR'8Ԗ7zwp]ɝA G^'˨k?w~+M"g\jnDG0lgeszO-BOA}OD fI.cLl'$A[|GIյk_OyTݶgQ€ni%u6uBJrHRN2@ϸP-omd8rG9qwg4oΧ#O(EFH+0*`рtPpkzlvChH҆\FF8qj03Y.X ,@85z~SJ%5ʻ `f•zY G-zuơ V$Hd- fyW?,o;8,.໵;&A"6  88 «wz=Γj_&. $^=^I]k^)|?}ʓ80IaJpwnVT$yQe1uz%r i-jڭ:mS(b8nqFkC\_Ӵkh(mA`io'XV0TMn%Prq[%{k(yMczv_i{}\FXLy'8SIZgB&~bBjk+*E5\֥6]#TX{(n$X 1$dԮO<5`_PƱfZm3Os@Dg'`H?o_u@~)n&ypR]#r/68'Wm7Śg_~=+h$'vq(jjzvvY_I8I \^xx]ɭh1܆ ,˜ *2yk>(<c=GTg0P~l<n 񽜿_Nп#!C(c)&scP,!d-ʓv5f~-m"i_諒bp$\K_il`Y2G n3I ~kRJ"rUI4'#iZ\>'<5sald:H>>bg5F]k Y/sHnaA&pTߘ 6c wJʘH6I2kt;(둎spMk_[E$3Ŧ[$ȥYD (CIԡtkRdX/m㸍d0WP3jy/$:DQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQELj|Ac[KK [%>G< -㴿pU Q@'uWC ˷$JrB;喇<+[]k>"IyW`^叭tP͚?4/  ۼz^̖r(eP-N afѼ+iw Oee %K"$dAZP>=Oz.4֑FP#nd0GG7g[;X.-.⽶3`=H9Es~%F{/gk-R [Z| @an`pQodmk\ծ# oޙ$0U3稢9/.%ђf *f#`a¥ӿKϹfzy;qvq߽zΗk[U35֓swN0$89s|3ׇ"-yY!yّP+) ~vXQ@~ 4o-e҉UgY6'=A xG Kd)oi."Ryaf2MtP/[wQsVh1zgPX qT_:sOp5ݴhI-$ &܂@$1$wJ(I V70D#=X* Q@-]J{c9e*XWd4FNmΈv6K v.G5EyBR^+y4-.LU7 HZ+$>-/qXgEd*A$6WYEr~$>o_@gKKT .$V=3zֹ ֯}EddrO[PvoxK]g0^- er88]d^|?5J 淒q%,K@l8V tsF4յH44Aj֗ 3"F cscIxXQwNkKͅ~e3{]nSM$uygD`ہ8?~z5]S1y3]i7?g{Cm8\vP?<1GCH 噹y\w=~@GSMѭt\{uRҀ01$v9oql_k7Z]G,bX#+cԜ99KXS{`,>H8 [C#5Q@6FF;xB E 8QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEPKehwwPK.[EOEBPS/dcommon/cpyr.htmD Oracle Legal Notices

Oracle Legal Notices

Copyright Notice

Copyright © 1994-2014, 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 END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

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 preproduction status:

This documentation is in preproduction 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

PK0hPK.[EOEBPS/dcommon/blafdoc.cssc@charset "utf-8"; /* Copyright 2002, 2011, Oracle and/or its affiliates. All rights reserved. Author: Robert Crews Version: 2011.8.12 */ 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%; text-align: left; } h2 { font-size: 152%; font-weight: bold; text-align: left; } h3 { font-size: 139%; font-weight: bold; text-align: left; } h4 { font-size: 126%; font-weight: bold; text-align: left; } h5 { font-size: 113%; font-weight: bold; display: inline; text-align: left; } h6 { font-size: 100%; font-weight: bold; font-style: italic; display: inline; text-align: left; } 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; } li { text-align: left; } dd { text-align: left; } 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: #f00; background: inherit; } .betadraftsubtitle { text-align: center; font-weight: bold; color: #f00; 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; } } PKr.hcPK.[EOEBPS/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.[E OEBPS/toc.ncx| Oracle® Fusion Middleware Desktop Integration Developer's Guide for Oracle Application Development Framework, 11g Release 2 (11.1.2.0.0) Cover Title and Copyright Information Contents Preface 1 Introduction to ADF Desktop Integration 2 Introduction to the ADF Desktop Integration Sample Application 3  Setting Up Your Development Environment 4 Preparing Your Integrated Excel Workbook 5 Getting Started with the Development Tools 6 Working with ADF Desktop Integration Form-Type Components 7 Working with ADF Desktop Integration Table-Type Components 8 Adding Interactivity to Your Integrated Excel Workbook 9 Configuring the Appearance of an Integrated Excel Workbook 10 Internationalizing Your Integrated Excel Workbook 11 Securing Your Integrated Excel Workbook 12 Adding Validation to an Integrated Excel Workbook 13 Testing Your Integrated Excel Workbook 14 Deploying Your Integrated Excel Workbook 15 Using an Integrated Excel Workbook Across Multiple Web Sessions and in Disconnected Mode A ADF Desktop Integration Component Properties and Actions B ADF Desktop Integration EL Expressions C Troubleshooting an Integrated Excel Workbook D Using Workbook Management Tools E ADF Desktop Integration Settings in the Web Application Deployment Descriptor F String Keys in the Overridable Resources G Java Data Types Supported By ADF Desktop Integration H Using the ADF Desktop Integration Model API I End User Actions Copyright PK߬!|PK.[EOEBPS/content.opfdk Oracle® Fusion Middleware Desktop Integration Developer's Guide for Oracle Application Development Framework, 11g Release 2 (11.1.2.0.0) en-US E16180-01 Oracle Corporation Oracle Corporation Oracle® Fusion Middleware Desktop Integration Developer's Guide for Oracle Application Development Framework, 11g Release 2 (11.1.2.0.0) 2011-04-27T22:57:58Z Describes how to integrate desktop applications with web-based applications built using the Oracle Application Development Framework (Oracle ADF). PK` ddPK.[E OEBPS/mpl.htm){ք Introduction to the ADF Desktop Integration Sample Application

2 Introduction to the ADF Desktop Integration Sample Application

This chapter provides an overview of the Master Price List module, which is the ADF Desktop Integration module's sample application. The Master Price List module is a module in the Fusion Order Demo application. It contains several Microsoft Excel workbooks that are integrated with a Fusion web application.

This chapter includes the following sections:

2.1 About the Master Price List Module

The Master Price List module allows end users to download information (product names, prices, and so on) about electronic devices that are sold through a storefront-type web application. End users can search the downloaded information, modify pricing information, and upload the modified information to the Fusion web application.

Set up the development environment before you set up and run the Master Price List module. After setting up the development environment, you can download the Fusion Order Demo application, which includes the Master Price List module.

2.2 Setting Up and Executing the Master Price List Module

Set up the development environment as described in Chapter 3, " Setting Up Your Development Environment", so that you can run the Master Price List module.

Once you have set up the development environment, download the Fusion Order Demo application, which includes the Master Price List module. For information about how to download the Fusion Order Demo application, see the "How to Download the Application Resources" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

The Fusion Order Demo application includes a directory named Infrastructure. This directory includes scripts that create the users and data that the Fusion Order Demo application and Master Price List module require. For information about how to run these scripts, see the "How to Install the Fusion Order Demo Schema" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


Note:

If you have an old version of ADF Desktop Integration installed on the system, do the following:
  1. Upgrade ADF Desktop Integration as described in Section 3.7, "Upgrading ADF Desktop Integration."

  2. Refresh the Fusion Order Demo schema as described in "How to Install the Fusion Order Demo Schema" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.


To run the Master Price List module:

  1. Open the MasterPriceList.jws file in JDeveloper.

    This file is located in the MasterPriceList subdirectory of the directory into which you extracted the Fusion Order Demo application.

  2. In the Application Navigator, click the Application Resources accordion title to expand the panel.

  3. In the Application Resources panel, choose Connections > Database > FOD.

  4. Right-click the FOD connection and choose Properties.

  5. In the Edit Database Connection dialog, modify the connection information shown in Table 2-1 for your environment.

    Table 2-1 Database Connection Properties for the Master Price List Module

    PropertyDescription

    Host Name

    The host name for your database. For example:

    localhost

    JDBC Port

    The port for your database. For example:

    1521

    SID

    The SID of your database. For example:

    ORCL or XE


    Do not modify the user name and password fod/fusion. These must remain unchanged. If you click Test Connection and get any error message, ignore it.

    Click OK to close the dialog.

  6. In the Application Navigator, click the Project accordion title to expand the panel.

  7. Right-click Model and choose Rebuild Model.jpr.

  8. Right-click ViewController and choose Rebuild ViewController.jpr.

  9. Expand the ViewController project and choose Web content > login.jspx.

  10. Right-click login.jspx and choose Run.

  11. In the Select a Starting View Activity dialog, choose login, and click OK.

  12. In the login page, to log on as an administrator, enter sking in the User Name field and welcome1 in the Password field. To log on as a manager, enter ahunold in the User Name field and welcome1 in the Password field. For more information about users, see Section 2.3.1, "Log on to the Fusion Web Application in the Master Price List Module."

    You can download the integrated Excel workbooks as described in Section 2.3.3, "Downloading Integrated Excel Workbooks." Open and connect the workbook, as described in Section 2.4, "Overview of the Integrated Excel Workbooks in the Master Price List Module," to the Fusion web application that the Master Price List module deploys.

2.3 Overview of the Fusion Web Application in the Master Price List Module

The Fusion web application in the Master Price List module enables end users to edit and navigate through a list of products, search for a product, download integrated Excel workbooks, sort and reorder columns, and so on.

2.3.1 Log on to the Fusion Web Application in the Master Price List Module

When the end user runs the Master Price List Fusion web application in JDeveloper, the default browser opens the login page after the Master Price List module is deployed on Oracle WebLogic Server.

Figure 2-1 Login Dialog of Master Price List Fusion Web Application

Fusion Web Application login page

The Master Price List module provides two user profiles to log on to the Fusion web application. Table 2-2 summarizes both user profiles.

Table 2-2 User Profiles for the Master Price List Module

Login NamePasswordRoleDescription

sking

welcome1

Administrator

Enables you to access and modify information.

ahunold

welcome1

Manager

Enables you to access information, but you cannot modify it.


After the login credentials are verified, the end user is redirected to the home page of the Master Price List Fusion web application.

2.3.2 Introduction to the Fusion Web Application in the Master Price List Module

The Master Price List Fusion web application is divided into four panes: Product Search, Matching Products, Product Detail, and Active Discounts.

Figure 2-2 Web Interface of Master Price List Fusion Web Application

The web interface of MPL web application.

The Product Search pane has tabs for searching a product in the application repository. The Product Search pane is an accordion pane and the end user can hide it, if desired.

The Matching Products pane displays products in a tabular format, according to the search criteria set in the Product Search pane. By default, all products are displayed. The end user can use the Matching Products pane's toolbar to do various activities such as download integrated Excel workbooks, sort columns in ascending or descending order, hide a column, and so on.

The Product Detail pane displays detailed information about the product selected in the Matching Products pane. The information includes the attributes available in the table, and additional information about the product's supplier, product's current availability status, a graphical representation of the product's sale in each month, and so on.

The Active Discounts pane is an independent pane. It displays the available discounts on products with their discount codes and discount percentages.

2.3.3 Downloading Integrated Excel Workbooks

The Master Price List module provides various integrated Excel workbooks to meet different requirements. End users can download the integrated Excel workbooks from the Excel menu of the toolbar.

Figure 2-3 Excel Menu of Matching Products Toolbar

Excel menu of Master Price List module.

Table 2-3 provides the description for each menu option.

Table 2-3 Download Excel Menu Options

Menu OptionDescription

Export as Read-only Spreadsheet

Exports all Product table data into a spreadsheet. The spreadsheet is not an integrated Excel workbook.

The exported file is saved as read_only_pricelist.xls.

Edit Using Live Spreadsheet

Downloads the integrated Excel workbook that enables you to edit and update common data.

The downloaded file is saved as EditPriceList.xlsx.

Edit Using Advanced Live Spreadsheet

Downloads the integrated workbook that enables you to edit and update all data.

The downloaded file is saved as AdvEditPriceList.xlsx.

View and Query Using Live Spreadsheet

Downloads the integrated workbook that enables you to view all products and, if desired, search for a product. This integrated Excel workbook does not allow you to edit and update data.

The downloaded file is saved as ReadOnlyPriceList.xlsx.


2.4 Overview of the Integrated Excel Workbooks in the Master Price List Module

The Master Price List module provides the EditPriceList.xlsx, AdvEditPriceList.xlsx, and ReadOnlyPriceList.xlsx integrated Excel workbooks. All workbooks enable end users to:

  • Log on to the Fusion web application from the workbook

  • Download rows of data about product pricing

  • Search the workbook for information about product pricing

In addition, the EditPriceList.xlsx and AdvEditPriceList.xlsx workbooks permit end users to:

  • Search the Master Price List module Fusion web application for information about products and product pricing

  • Modify product pricing information in the workbook

  • Use Excel formulas to perform calculations on values in an ADF Table component

  • Upload modified product pricing information to the Master Price List module Fusion web application from the workbook

Subsequent sections in this chapter provide more information about the functionality in the workbooks along with cross-references to implementation details.

2.4.1 Log on to the Fusion Web Application from an Integrated Excel Workbook

At runtime, the integrated Excel workbooks in the Master Price List module render an Excel ribbon tab that allows end users to log on to the Fusion web application. Figure 2-4 shows the runtime Fusion Order Demo tab in the Ribbon of the EditPriceList.xlsx workbook.

Figure 2-4 Runtime Fusion Order Demo Tab

FOD tab at runtime in EditPriceList-DT.xlsx

The EditPriceList.xlsx workbook prompts the end user to log on to the Fusion web application when the end user clicks Login or invokes an action that requires a connection with the Fusion web application. Because the worksheet Startup event in the EditPriceList.xlsx workbook invokes the ADF Table component Download action, end users are prompted to log on immediately after starting up the EditPriceList.xlsx workbook.

The Login button invokes the workbook Login action. For information about configuring the Login button (and other buttons in Figure 2-4), see Section 8.3, "Configuring the Runtime Ribbon Tab."

The workbook Login action invokes the Fusion web application's authentication process. For more information about implementing this functionality, see Chapter 11, "Securing Your Integrated Excel Workbook."

The Master Price List module provides two user profiles to log in to the application, as summarized in Table 2-2.

2.4.2 Download Rows of Data About Product Pricing

The EditPriceList.xlsx workbook uses an ADF Table component to host information downloaded from the Fusion web application about product pricing. This component allows end users to edit rows and upload modified rows to the Fusion web application.

The following sections provide information about how to implement the download functionality:

The ReadOnlyPriceList.xlsx workbook uses an ADF Read-only Table component to download data from the Fusion web application about product pricing. End users can view this data, but they cannot modify data or save changes to the Fusion web application.

The following sections provide information about how to implement the download functionality of the ReadOnlyPriceList.xlsx workbook:

2.4.3 Simple Search for Products in the Workbooks

The integrated Excel workbooks have ADF components configured to provide end users with a search form. End users can enter a search term in the form to invoke a query on the Fusion web application and download the results to the workbook. Figure 2-5 shows a runtime view of these components in the EditPriceList.xlsx workbook.

Figure 2-5 Runtime View of a Simple Search Form in the EditPriceList.xlsx Workbook

Runtime View of a Simple Search Form

The following sections provide information about how to implement a simple search form that you can use in the EditPriceList.xlsx workbook:

2.4.4 Advanced Search for Products in the Edit Price List Workbook

The EditPriceList.xlsx and AdvEditPriceList.xlsx workbooks have search functionality configured that allow end users to invoke a page from the Fusion web application, specify search criteria, and download the results to the ADF Table component in the workbooks. Figure 2-6 shows the page from the Fusion web application that end users invoke by clicking the Advanced Search button.

Figure 2-6 Advanced Search Dialog in the EditPriceList.xlsx Workbook

Advanced Search Dialog

For more information about how to implement the advanced search functionality in the EditPriceList.xlsx workbook, see Section 8.6, "Creating ADF Databound Search Forms in an Integrated Excel Workbook."

2.4.5 Modify Product Pricing Information in the Edit Price List Workbook

End users of the EditPriceList.xlsx and AdvEditPriceList.xlsx workbooks can edit product pricing information that the ADF Table component downloads from the Fusion web application. Columns in the runtime ADF Table component that have an UpdateComponent property configured permit end users to modify values and upload the changes to the Fusion web application. For example, end users can modify the values that appear in the ProductId, ProductName, and CostPrice columns.

End users can enter or modify the values that appear in the cells of other columns. However, the ADF Table component does not upload these changes to the Fusion web application, because some of these columns display the results of evaluating Excel formulas using values downloaded from the Fusion web application. Such columns should use a read-only style to distinguish themselves from other columns. For example, the Difference column displays the result of an Excel formula that subtracts the cost price from the list price and uses a read-only style, which makes it easily distinguishable from other input columns.

Other columns, such as Status and Changed, appear in the ADF Table component to provide status information about upload operations and changed columns.

The following sections provide information about how to implement this functionality:

2.4.6 Upload Modified Product Information to the Fusion Web Application

The EditPriceList.xlsx and AdvEditPriceList.xlsx workbooks allow end users to upload modified data in the ADF Table component to the Fusion web application. An action set is configured for the runtime Save Changes button that invokes the ADF Table component's Upload action. For information about implementing this functionality, see Section 7.8, "Configuring an ADF Component to Upload Changes from an ADF Table Component."


Tip:

You can also use the Upload to Server button in the Fusion Order Demo tab to upload modified data.

PK.{){PK.[EOEBPS/ap_deploy_desc.html~ ADF Desktop Integration Settings in the Web Application Deployment Descriptor

E ADF Desktop Integration Settings in the Web Application Deployment Descriptor

This appendix describes the values that you set for the ADF Desktop Integration servlet (adfdiRemote) so that the Fusion web application can use it. The appendix also describes the values in the deployment descriptor file that determine the behavior of the HTTP filter that ADF Desktop Integration provides. Finally, it provides an extract from a deployment descriptor file that shows these values in use.

This appendix includes the following sections:


Note:

Adding ADF Desktop Integration and ADF Library Web Application Support to your desktop integration project automatically generates the entries in the web.xml file discussed in this appendix. For more information, see Section 4.2, "Adding an Integrated Excel Workbook to a Fusion Web Application."

E.1 Configuring the ADF Desktop Integration Servlet

A Fusion web application with integrated Excel workbooks must contain entries in its deployment descriptor file (web.xml) to use the adfdiRemote servlet. The Excel workbooks that you integrate with a Fusion web application call this servlet to synchronize data with the Fusion web application. The adf-desktop-integration.jar file stores the servlet in the following directory:

MW_HOME\oracle_common\modules\oracle.adf.desktopintegration_11.1.1

where MW_HOME is the Middleware Home directory.

When you add ADF Desktop Integration to your project as described in Section 4.2, "Adding an Integrated Excel Workbook to a Fusion Web Application," ADF Desktop Integration automatically configures your deployment descriptor with the necessary entries to enable the servlet (DIRemoteServlet) on your Fusion web application. If required, then you can configure the servlet manually.

To configure the ADF Desktop Integration servlet:

  1. In JDeveloper, locate and open the deployment descriptor file (web.xml) for your ADF Desktop Integration project.

    Typically, this file is located in the WEB-INF directory of your project.

  2. Click the Servlets page, and then click the Add icon to create a row entry in the Servlets table. The icon is in the top-right corner of the servlets table.

    Enter the values as described in Table E-1 to enable the adfdiRemote servlet on the Fusion web application.

    Table E-1 Values to Enable adfdiRemote Servlet

    For this property...Enter this value...

    Name

    adfdiRemote

    Type

    Servlet Class

    Servlet Class/JSP file

    oracle.adf.desktopintegration.servlet.DIRemoteServlet


  3. In Servlets page, click the Servlet Mappings tab, and then click the Add icon to create a row in the Servlet Mapping table.

    Enter the value as described in Table E-2 to add a URL pattern for the adfdiRemote servlet in the Fusion web application. The value that you enter must match the value that you specify in the integrated Excel workbook for the RemoteServletPath workbook property. Note that values are case sensitive.

    Table E-2 Values to Add A URL Pattern to adfdiRemote Servlet

    For this property...Enter this value...

    URL Patterns

    /adfdiRemoteServlet


    Figure E-1 displays the Servlets page of web.xml of Master Price List module.

    Figure E-1 Servlets Page of Deployment Descriptor

    Illustrates Servlet mapping properties.
  4. Click the Filters page, and verify that whether a adfBindings filter exists in the Filters table. If an entry exists, select it and proceed to the next step. If there is no such entry, then click the Add icon to create a row entry in the Filters table. The icon is available in the top-right corner of the filters table.

    Enter the values as described in Table E-3 to add the ADF binding filter to the adfdiRemote servlet.

    Table E-3 Values to Add Binding Filter to adfdiRemote Servlet

    For this property...Enter this value...

    Name

    adfBindings

    Class

    oracle.adf.model.servlet.ADFBindingFilter


  5. In Filters page, click the Filter Mappings tab, and then click the Add icon to create a row in the Filter Mapping table.

    Enter the values as described in Table E-4 to add the mapping filter to the adfdiRemote servlet. The filter mapping must match with the Servlet name in Step 2.

    Table E-4 Values to Add Mapping Filter to adfdiRemote Servlet

    For this property...Enter this value...

    Mapping Type

    Servlet

    Mapping

    adfdiRemote


    Figure E-2 displays the Filters page of web.xml of Master Price List module.

    Figure E-2 Filters Page of Deployment Descriptor

    Illustrates Filter mapping properties.
  6. Save the deployment descriptor file, and then rebuild your ADF Desktop Integration project to apply the changes you made.

E.2 Configuring the ADF Desktop Integration Excel Download Filter

ADF Desktop Integration includes an HTTP filter in the adf-desktop-integration.jar stored in the following directory:

MW_HOME\oracle_common\modules\oracle.adf.desktopintegration_11.1.1

where MW_HOME is the Middleware Home directory.

You configure an entry in the deployment descriptor file (web.xml) of your Fusion web application so that the application invokes the HTTP filter to make changes in an integrated Excel workbook before the integrated Excel workbook is downloaded by the end user from the Fusion web application. These changes ensure that the integrated Excel workbook functions correctly when the end user opens it. The HTTP filter makes the following changes:

  • WebAppRoot

    Sets the value for this property to the fully qualified URL for the Fusion web application from which the end user downloads the integrated Excel workbook.

  • Workbook mode

    Changes the integrated Excel workbook mode to runtime mode in case the workbook was inadvertently left in design mode or test mode.


Note:

If you choose not to use the adfdiExcelDownload filter, you can instead use the workbook administration tool to set the WebAppRoot property on your workbooks. For more information, see Section D.1, "Using the Workbook Administration Tool."

By default, JDeveloper adds the HTTP filter to your ADF Desktop Integration project when ADF Desktop Integration is enabled in your project.

To configure the HTTP filter:

  1. In JDeveloper, locate and open the deployment descriptor file (web.xml) for your ADF Desktop Integration project.

    Typically, this file is located in the WEB-INF directory of your project.

  2. Click the Filters page, and verify that a adfBindings filter exists in the Filters table. If an entry exists, select it and proceed to the next step. If there is no such entry, then click the Add icon to create a row entry in the Filters table.

    Enter the values as described in Table E-5 to create a filter, or configure the values to modify the existing HTTP filter.

    Table E-5 Properties to Configure HTTP Filter

    For this property...Enter this value...

    Name

    adfdiExcelDownload

    Class

    oracle.adf.desktopintegration.filter.DIExcelDownloadFilter

    Display Name

    (Optional) In General Filter tab, enter a display name for the filter that appears in JDeveloper.

    Description

    (Optional) In General Filter tab, enter a description of the filter.


  3. In the Filters page, click the Filter Mappings tab, and then click the Add icon to create a row in Filter Mapping table.

    Add a filter mapping for integrated Excel workbooks that use the default file format (.xlsx) by entering values as described in Table E-6.

    Table E-6 Properties to Configure Filter Mappings

    For this property...Enter this value...

    Mapping Type

    URL Pattern

    Mapping

    *.xlsx

    Dispatcher Type

    No value is required for this property.


  4. Add another filter mapping for integrated Excel workbooks that use the macro-enabled workbook format (.xlsm) by entering values as described in Table E-7.

    Table E-7 Properties to Configure Filter Mappings

    For this property...Enter this value...

    Mapping Type

    URL Pattern

    Mapping

    *.xlsm

    Dispatcher Type

    No value is required for this property.


    Figure E-3 displays the Filters page of web.xml of Master Price List module.

    Figure E-3 Filters Page of Deployment Descriptor

    Displays Filters page properties.
  5. Click the Application page, expand MIME Mappings section, and click the Add icon.

    Add a MIME type for integrated Excel workbooks that use the default file format (.xlsx) by entering values as described inTable E-8.

    Table E-8 Properties to Add MIME Mappings

    For this property...Enter this value...

    Extension

    *.xlsx

    MIME Type

    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet


  6. Add another MIME type for integrated Excel workbooks that use the macro-enabled workbook format (.xlsm) by entering values as described in Table E-9.

    Table E-9 Properties to Add MIME Mappings

    For this property...Enter this value...

    Extension

    *.xlsm

    MIME Type

    application/vnd.ms-excel.sheet.macroEnabled.12


    Figure E-4 displays the Application page of web.xml of Master Price List module.

    Figure E-4 Application Page of Deployment Descriptor

    Displays Application page of deployment descriptor.
  7. Save the deployment descriptor file, and then rebuild your ADF Desktop Integration project to apply the changes you made.

While updating filter and filter mapping information in the web.xml file, ensure that the filter for ADF Library Web Application Support (<filter-name>ADFLibraryFilter</filter-name>) appears below the adfdiExcelDownload filter entries, so that integrated Excel workbooks can be downloaded from the Fusion web application.

E.3 Examples in a Deployment Descriptor File

The following extracts from the web.xml file of a Fusion web application with ADF Desktop Integration shows the entries that you configure for a desktop integration project. For more information ordering of filters, see Section 4.4.4, "What Happens When You Add ADF Desktop Integration to Your JDeveloper Project."

    <filter>
        <filter-name>adfBindings</filter-name>
        <filter-class>
            oracle.adf.model.servlet.ADFBindingFilter</filter-class>
        </filter>
        <filter>
            <filter-name>adfdiExcelDownload</filter-name>
            <filter-class>
                oracle.adf.desktopintegration.filter.DIExcelDownloadFilter
            </filter-class>
        </filter>
        <filter-mapping>
            <filter-name>adfBindings</filter-name>
            <servlet-name>adfdiRemote</servlet-name>
        </filter-mapping>
        <filter-mapping>
            <filter-name>adfdiExcelDownload</filter-name>
            <url-pattern>*.xlsx</url-pattern>
        </filter-mapping>
        <filter-mapping>
            <filter-name>adfdiExcelDownload</filter-name>
            <url-pattern>*.xlsm</url-pattern>
        </filter-mapping>
        <servlet>
            <servlet-name>adfdiRemote</servlet-name>
            <servlet-class>
                oracle.adf.desktopintegration.servlet.DIRemoteServlet
            </servlet-class>
        </servlet>
    <servlet-mapping>
        <servlet-name>adfdiRemote</servlet-name>
        <url-pattern>/adfdiRemoteServlet</url-pattern>
    </servlet-mapping>
    <mime-mapping>
        <extension>xlsx</extension>
        <mime-type>
            application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
        </mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>xlsm</extension>
        <mime-type>
            application/vnd.ms-excel.sheet.macroEnabled.12
        </mime-type>
    </mime-mapping>
PKlğllPK.[EOEBPS/work_table_comp.htm Working with ADF Desktop Integration Table-Type Components

7 Working with ADF Desktop Integration Table-Type Components

This chapter describes how you work with the table-type components that ADF Desktop Integration provides.

This chapter includes the following sections:

7.1 About ADF Desktop Integration Table-Type Components

ADF Desktop Integration provides the following table-type components to display structured data:

  • ADF Table component

  • ADF Read-only Table component

The ADF Table and ADF Read-only Table components provide end users with the functionality to download and upload rows of data. The ADF Table component also enables end users to edit or delete downloaded data, or to insert new rows of data. Figure 7-1 shows the ADF Table and the ADF Read-only Table components.

Figure 7-1 ADF Desktop Integration Table-Type Components

ADF Desktop Integration Table-type Components

Each ADF Table component contains a Key column. Do not remove the Key column, as it contains important information that is used by ADF Desktop Integration for the proper functioning of the table. Removal of the Key column, or any modification in the Key column cell, results in errors and data corruption. For more information about the Key column, see Section 7.12, "Configuring ADF Table Component Key Column."

The other ADF Desktop Integration components that you can use with these table-type components are described in Chapter 6, "Working with ADF Desktop Integration Form-Type Components."

7.1.1 ADF Desktop Integration Table-Type Components Use Cases and Examples

Tables are used to display the structured information. For example, Figure 7-2 shows an ADF Table component of Master Price List module with data downloaded from the respective Fusion web application.

Figure 7-2 ADF Table component with Downloaded Data

ADF Table component with downloaded data

7.1.2 Additional Functionality of Table-Type Components

After you have added a table component to your integrated Excel workbook, you may find that you need to add additional functionality to configure your table. Following are links to other functionalities that table components can use.

7.2 Page Definition Requirements for an ADF Table Component

The ADF Table component is one of the Oracle ADF components that ADF Desktop Integration exposes. It appears in the components palette of the ADF Desktop Integration Designer task pane and, after inserted into an Excel worksheet, allows the following operations:

  • Read-only

  • Insert-only

  • Update-only

  • Insert and update

Review the following sections for information about page definition file requirements specific to an ADF Table component.

Before you can configure an ADF Table component to provide data-entry functionality to your end users, you must configure the underlying page definition file for the Excel worksheet with ADF bindings. For general information about the page definition file requirements for an integrated Excel workbook, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

Expose the following control bindings when you create a page definition file for authoring an ADF Table component:


Note:

As Excel displays a flat list of bindings and iterators are not displayed, use descriptive names for the attributes of different iterators.

Figure 7-3 shows the bindings that the ExcelPriceListPageDef.xml page definition file includes. This page definition file can support the use of an ADF Table component in the Excel worksheet that it is associated with.

Figure 7-3 ADF Bindings Supporting Use of an ADF Table Component

ADF Bindings for use with a DEG

7.3 Inserting ADF Table Component into Excel Worksheet

After you have configured a page definition file correctly, you can insert the ADF Table component into the worksheet and configure its properties to achieve the functionality you want. The ADF Table component enables you to download, edit, and upload rows of data.

7.3.1 How to Insert ADF Table Component

You can insert the ADF Table component from the ADF Desktop Integration Designer task pane.

Before you begin:

It may be helpful to have an understanding of ADF Table component. For more information, see Section 7.3, "Inserting ADF Table Component into Excel Worksheet."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To insert ADF Table component into Excel worksheet:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet into which you want to insert the ADF Table component. When inserting an ADF Table component, you must ensure that the data of two tables does not overlap at runtime.

  3. In the bindings palette of the ADF Desktop Integration Designer task pane, select the tree binding to use and click Insert Binding. Based on your selection, the Select Component dialog or the Insert Component dialog appears.

  4. In the dialog that appears, select ADF Table and click OK.


    Notes:

    • You can also insert an ADF Table component by using the components palette or the Oracle ADF tab. Select ADF Table and click Insert Component. Alternatively, in the Oracle ADF tab, select ADF Table from the Insert Component dropdown list. If you use either the components palette or the Oracle ADF tab to create the table component, you would have to add each column to appear in the component at runtime.

    • When you insert an ADF Table component using Insert Binding, then by default, InputText is defined as the subcomponent type for all columns. If you want a column to have a list subcomponent (TreeNodeList or ModelDrivenColumnComponent), then delete the old column and reinsert it with your desired subcomponent type.


  5. Configure properties for the ADF Table component using the property inspector shown in Figure 7-4.

    Figure 7-4 ADF Table Property Inspector

    Table Component Property Inspector
  6. Specify a binding expression for the attribute that uniquely identifies each row in the iterator associated with the tree binding. The UniqueAttribute property may be left blank if the binding's iterator supports row keys.

  7. Configure the BatchOptions properties of the ADF Table component as described in Table 7-1.

    Table 7-1 BatchOptions Properties of the ADF Table Component

    Set this property to...This value...

    CommitBatchActionID

    The Commit action binding that the page definition file exposes.


  8. Optionally, configure the RowLimit group of properties to determine what number of rows the ADF Table component can download.

    For more information, see Section 7.17, "Limiting the Number of Rows Your Table-Type Component Downloads."

  9. Click OK.

Figure 7-5 shows the ADF Table component in EditPriceList-DT.xlsx in design mode.

Figure 7-5 ADF Table Component in Design Mode

ADF Table component in design mode

Figure 7-6 shows the ADF Table component in EditPriceList-DT.xlsx at runtime.

Figure 7-6 ADF Table Component at Runtime

ADF Table component at runtime

For more information about the properties that you can set for the ADF Table component, see Section A.9, "ADF Table Component Properties and Actions."

7.3.2 How to Add a Column in an ADF Table Component

After inserting an ADF Table component in the worksheet of your integrated Excel workbook, you may want to add a column that is not available in the tree binding. For example, you may want to add a column that displays values calculated by an Excel formula.

Before you begin:

It may be helpful to have an understanding of ADF Table component. For more information, see Section 7.3, "Inserting ADF Table Component into Excel Worksheet."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To add a column in an ADF Table component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet that references the ADF Table component and click the Edit Properties button in the Oracle ADF tab.

  3. In the Edit Component: ADF Table dialog, click the ellipses button (...) of the Columns property to open the Edit Columns dialog. The dialog lists all columns of the selected ADF Table component.

  4. Click Add to add a new column. The new column is inserted at the end of the Members list. To move the column to a specific position, select the column and use the Up and Down arrow keys.

  5. Configure the new column's properties in the right pane of the dialog. Figure 7-7 shows an example of the new column Difference in ProductTable of EditPriceList-DT.xlsx.

    Figure 7-7 Adding a Column in ADF Table Component

    Adding a column in ADF Table component
  6. Click OK.


Note:

If you have not moved the new column as described in step 4, it appears at the left of Key column.

Figure 7-8 shows the new column Difference in ProductTable of EditPriceList-DT.xlsx in design mode.

Figure 7-8 New Column in ADF Table in Design Mode

New column in ADF Table in design mode

Figure 7-9 shows the new column Difference in ProductTable of EditPriceList-DT.xlsx at runtime.

Figure 7-9 New Column in ADF Table at Runtime

New column in ADF Table at runtime

ADF Desktop Integration does not limit the number of columns you can add in an ADF Table component you can add as many columns as your version of Excel supports. However, it has been observed that a very wide table gives slow performance and poor user experience. If you experience the same, you must try reducing the number of columns of the table before diagnosing other reasons for slow performance.

7.4 Configuring an ADF Table Component to Update Existing Data

When you add the ADF Table component, by default, it allows end users to edit the existing data, but it does not allow them to add new data rows or to delete existing data rows.

7.4.1 How to Configure an ADF Table Component to Update Data

If you want the end user to be able to edit existing data, but would like to restrict the addition or deletion of data rows, no additional configuration is required. Ensure that the ADF Table component RowAction properties are set, as described in Table 7-2. and shown in Figure 7-10.

Table 7-2 RowAction Properties of ADF Table Component

PropertyValue

InsertRowEnabled

False

DeleteRowEnabled

False

UpdateRowEnabled

True


Figure 7-10 ADF Table RowAction Properties to Update Data

ADF Table RowAction properties to update data

7.4.2 What Happens at Runtime: How the ADF Table Component Updates Data

When the end user changes data in a row, ADF Desktop Integration marks the row and an upward pointing triangle appears in a row of the _ADF_ChangedColumn column. After updating the existing data, the end user initiates the upload process to save the changes. For more information about the ADF Table component's upload process, see Section 7.8, "Configuring an ADF Component to Upload Changes from an ADF Table Component."

Excel uploads modified rows from the integrated workbook in batches rather than row by row. You can configure the size of batches and the actions an ADF Table component invokes when it uploads a batch. For more information about batch processing, see Section 7.10, "Batch Processing in an ADF Table Component."

For more information about the properties that you can set for the ADF Table component, see Section A.9, "ADF Table Component Properties and Actions."

7.5 Configuring an ADF Table Component to Insert Data

The primary purpose of an ADF Table component is to provide end users with an interface where they can input or edit data which can then be uploaded to the database that serves your Fusion web application. For this to happen, you must expose methods on data controls, create action bindings in your page definition file, and set properties for the ADF Table component that an Excel worksheet hosts. Note that a full Excel row must be inserted for this functionality to work correctly.

7.5.1 How to Configure an ADF Table Component to Insert Data Using a View Object's Operations

If you want the changes that the end user makes in an ADF Table component to be committed invoking the ADF Table component's Upload action, you must configure some of the ADF Table component's properties.

Before you begin:

It may be helpful to have an understanding of how to configure ADF Table component to insert data. For more information, see Section 7.5, "Configuring an ADF Table Component to Insert Data."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To configure an ADF Table component to insert data using a view object's operations:

  1. Open the project in JDeveloper.

  2. If not present, add a CreateInsert and a Commit action binding to the page definition file that is associated with the Excel worksheet that hosts the ADF Table component.

    For more information, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook" and Section 7.2, "Page Definition Requirements for an ADF Table Component."

  3. Open the integrated Excel workbook.

  4. Select the cell in the Excel worksheet that references the ADF Table component and click the Edit Properties button in the Oracle ADF tab.

  5. In the Edit Component: ADF Table dialog, configure the RowActions properties of the ADF Table component as described in the Table 7-3:

    Table 7-3 RowActions properties of ADF Table component

    Set this property to...This value...

    InsertRowEnabled

    True

    InsertBeforeRowActionID

    The CreateInsert action binding that the page definition file exposes.

    InsertRowsAfterUploadEnabled

    True, to upload the inserted rows again regardless of whether they have been previously uploaded. By default, this property is set to False.

    The property is ignored if InsertRowEnabled is set to False.


  6. Configure the BatchOptions properties of the ADF Table component as described in the following table:

    Table 7-4 BatchOptions Properties of the ADF Table Component

    Set this property to...This value...

    CommitBatchActionID

    The Commit action binding that the page definition file exposes.


  7. Configure the Columns property of the ADF Table component as described in the following table:

    Table 7-5 Columns property of ADF Table component

    Set this property to...This value...

    InsertUsesUpdate

    True

    UpdateComponent

    • Set the Value field of the UpdateComponent property to the update attribute from the page definition file. For example, #{row.bindings.ProductId.inputValue}.

    • Verify that ReadOnly property of UpdateComponent is set appropriately.

      This property only appears if you selected InputText or TreeNodeList as the subcomponent to associate with the column. Set ReadOnly to False if you do want users to edit the values in the column, set to True otherwise.

      For more information about the components that you can use as a subcomponent, see Chapter 6, "Working with ADF Desktop Integration Form-Type Components."

    ID

    Set a value in this field that uniquely identifies the column in the ADF Table component's list of columns. A value for this property is required. The ADF Table component generates an initial value that you need not modify.

    CellStyleName

    Set this property to a style defined in the workbook or to an EL expression that applies a style to the cells in the column at runtime. For more information about styles, see Chapter 9, "Configuring the Appearance of an Integrated Excel Workbook."

    HeaderLabel

    Set this property to a label or to an EL expression that evaluates to a label which is rendered in the column header at runtime. For more information about labels, see Section 9.4, "Using Labels in an Integrated Excel Workbook."

    HeaderStyleName

    Set this property to a style defined in the workbook or to an EL expression that applies a style to the column's header cell at runtime. For more information about styles, see Chapter 9, "Configuring the Appearance of an Integrated Excel Workbook."


  8. Repeat Step 7 for each column that contains data to commit during invocation of the Upload action.

    For information about ADF Table component properties, see Section A.9, "ADF Table Component Properties and Actions."


Notes:

  • If you are using a polymorphic view object and want to insert a new row, the default CreateInsert action binding is not sufficient. You must create a custom method that also sets the discriminator value in the newly created row.

    While creating the custom method, you must expose the custom method as an action binding in the page definition file. The action binding must be specified as the InsertBeforeActionId rather than CreateInsert.

  • If the InsertRowsAfterUploadEnabled property is set to False and the end user tries to upload the inserted rows again, an error message in the status column is displayed indicating that the row cannot be inserted more than once.


7.6 Configuring Oracle ADF Component to Download Data to an ADF Table Component

After you add an ADF Table component to a worksheet, you configure it and the worksheet that hosts it, so that the ADF Table component downloads data from the Fusion web application. To achieve this, you configure an Oracle ADF component, such as ADF Button, a worksheet ribbon button, or a worksheet event to invoke an action set. The action set that is invoked must include the ADF Table component Download action among the actions that it invokes.

The number of rows that an ADF Table or an ADF Read-only Table component contains expands or contracts based on the number of rows to download from a Fusion web application. You should not place anything to the left or right of a table-type component unless you want to replicate it when Excel inserts rows to accommodate the data that one of the table-type components downloads. You can place other components above or below a table-type component as they maintain their position relative to the table-type component at runtime. End users who want to insert new rows of data into an ADF Table component at runtime must insert full rows into the Excel worksheet that hosts the ADF Table component.

7.6.1 How to Configure an ADF Component to Download Data to an ADF Table Component

Configure an Oracle ADF component, a worksheet ribbon button, or a worksheet event to invoke an action set that, in turn, invokes the ADF Table component Download action.

Before you begin:

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

It may be helpful to have an understanding of how to configure ADF component to download data to an ADF Table data component. For more information, see Section 7.6, "Configuring Oracle ADF Component to Download Data to an ADF Table Component."

To configure an ADF component to download data to an ADF Table component:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog to configure an action set for the worksheet event, worksheet ribbon button, or Oracle ADF component (a button, for example) that is going to invoke the action set at runtime.

    For more information about invoking action sets, see Section 8.2, "Using Action Sets."

  3. Add the ADF Table component Download action to the list of actions that the action set invokes at runtime.

    The ADF Table component Download action downloads the current state of the binding referenced by the ADF Table component TreeID property. To ensure that the state of this binding is up to date before download, add a query action that refreshes the binding before the action set invokes the ADF Table component Download action.

    Figure 7-11 shows the Edit Action dialog in the EditPriceList-DT.xlsx workbook where the action set invoked by the worksheet event Startup is configured.

    Figure 7-11 Action Set Downloading Data to an ADF Table Component

    ActionSet Download Data to a Data Entry Grid Component
  4. Click OK.

7.6.2 What Happens at Runtime: How the ADF Table Component Downloads Data

The end user invokes the action set that you configured. The action set invokes the list of actions specified in order. These include an action that invokes the Download action of the ADF Table component. This action downloads the current state of the binding referenced by the ADF Table component TreeID property. If the tree binding referenced by the TreeID property contains data with a master-detail relationship (for example, a product category with multiple products), the ADF Table component shows the first record in the detail result set (for example, the first product). How you configured the tree binding in the Fusion web application determines which of the detail records is defined as the first record. For more information about using tree bindings to display master-detail data, see the "Using Trees to Display Master-Detail Objects" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

The number of rows that the action downloads depends on the values set for the RowLimit group of properties in the ADF Table component. For more information, see Section 7.17, "Limiting the Number of Rows Your Table-Type Component Downloads."

7.7 Configuring a Worksheet to Download Pre-Insert Data to an ADF Table Component

Pre-insert data is data contained in one or more rows of data that you configure an iterator in a Fusion web application to reference. These rows of data have not yet been committed to the Fusion web application's database. You can configure the iterator to populate values for some or all of its attributes.

At design time in the integrated Excel workbook, you can configure an ADF Table component and the worksheet that hosts it so that the ADF Table component downloads pre-insert data from the Fusion web application. To achieve this, you configure an Oracle ADF component, such as an ADF Button component, a worksheet ribbon button, or a worksheet event to invoke an action set. The action set that is invoked must include the ADF Table component DownloadForInsert action among the actions that it invokes.

The DownloadForInsert action differs from the Download action as follows:

  • DownloadForInsert populates table cell data with the value of the EL expression for the insert component that is associated with each column in the ADF Table component. Download populates the table cell data with the EL expression for the update component that is associated with each column in the ADF Table component.

  • The EL expression #{components.componentID.currentRowMode} returns Insert when evaluated by the DownloadForInsert action. In contrast, the same EL expression evaluated by the Download action returns Update. The componentID part of the EL expression references the ID of the ADF Table component.

Note the following points to invoke the DownloadForInsert action:

  • Use the action with data rows that are in the STATUS_INITIALIZED state, as these data rows are ignored when the transaction is committed.

  • An action set that includes the DownloadForInsert action does not execute this action if an ADF Table component's RowActions.InsertRowEnabled property is set to False.

  • It serves no purpose to include both the DownloadForInsert and Download actions in the same action set, as the last executed action determines what data appears in the ADF Table component.

7.7.1 How to Configure a Worksheet to Download Pre-Insert Data to an ADF Table Component

Configure an Oracle ADF component, a worksheet ribbon button, or a worksheet event to invoke an action set that, in turn, invokes the ADF Table component DownloadForInsert action.

Before you begin:

It may be helpful to have an understanding of Worksheet configuration to download pre-insert data to an ADF Table component. For more information, see Section 7.7, "Configuring a Worksheet to Download Pre-Insert Data to an ADF Table Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To configure a worksheet to download pre-insert data to an ADF Table component:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog to configure an action set for the worksheet event, worksheet ribbon button, or Oracle ADF component that is going to invoke the action set at runtime.

    For more information about invoking action sets, see Section 8.2, "Using Action Sets."

  3. Add the ADF Table component DownloadForInsert action to the list of actions that the action set invokes at runtime.

  4. Click OK.

7.7.2 What Happens at Runtime: How the ADF Table Component Downloads Pre-Insert Data

The end user invokes the action set that you configured. The action set invokes the list of actions specified in order. These include an action that invokes the DownloadForInsert action of the ADF Table component. This action downloads pre-insert data from the Fusion web application and inserts it in rows of the ADF Table component in the Excel worksheet. The InsertComponent property is configured for the ADF Table component columns associated with the rows inserted to host the pre-insert data. End users can invoke the ADF Table component's Upload action to commit the pre-insert data to the Fusion web application's database.

7.8 Configuring an ADF Component to Upload Changes from an ADF Table Component

You configure the ADF Table component and the worksheet that hosts it so that end user can upload changes they make to data in the ADF Table component to the Fusion web application. To configure this functionality, you decide what user gesture or worksheet event invokes the action set that invokes the ADF Table component's Upload action.

To provide upload options to end users in a web page from the Fusion web application that differ from the default upload dialog, you must specify a Dialog action in the action set before the action that invokes the ADF Table Component's Upload action. For more information, see Section 7.8.5, "How to Create a Custom Upload Dialog."


Note:

In a master-detail relationship, ADF Desktop Integration does not support editing of the ViewLink source attributes, as the selections in the child view object would change as a result. To prevent any accidental editing, define the ViewLink source attributes to be read-only, or use a model configuration that does not include a view link between master and detail.

7.8.1 How to Configure an ADF Component to Upload Data from an ADF Table Component

Configure an ADF component, a worksheet ribbon button, a component (a button, for example), or a worksheet event to invoke an action set that, in turn, invokes the ADF Table component Upload action.

Before you begin:

It may be helpful to have an understanding of how to configure ADF component to upload data from an ADF Table data component. For more information, see Section 7.8, "Configuring an ADF Component to Upload Changes from an ADF Table Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To configure an ADF component to upload changed data from an ADF Table component:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog to configure the action set that invokes the ADF Table component Upload action.

    For more information about action sets, see Section 8.2, "Using Action Sets."

  3. Add the ADF Table component Upload action to the list of actions that the action set invokes at runtime.

    Figure 7-12 shows the Edit Action dialog in the EditPriceList-DT.xlsx workbook where the action set invoked by the ADF Button labeled Save Changes at runtime is configured.

    Figure 7-12 Action Set Uploading Data from an ADF Table Component

    ActionSet Uploading Data from a Data Entry Grid Component
  4. Click OK.


Note:

The action set does not include a call to a commit-type action as the ADF Table component's batch options already include calls to Commit. For more information, see Section 7.10.1, "How to Configure Batch Options for an ADF Table Component."

7.8.2 What Happens at Runtime: How the ADF Table Component Uploads Data

At runtime, the end user invokes the action set through whatever mechanism you configured (ADF component, worksheet ribbon button, worksheet event). This triggers the following sequence of events:

  1. If the ADF Table component contains dynamic columns, ADF Desktop Integration verifies whether the dynamic columns that were expanded the last time the ADF Table component's Download action was invoked are still present in the Fusion web application. If the columns are not present, ADF Desktop Integration prompts the end user to determine whether to continue upload process. If the end user decides not to continue, ADF Desktop Integration returns an abort code to the executing action set.

  2. If the ADF Table component contains no pending changes to upload, the ADF Table component's Upload action returns a success code to the executing action set.

  3. If you did not configure a custom upload dialog for the action set, as described in Section 7.8.5, "How to Create a Custom Upload Dialog," ADF Desktop Integration presents the default upload dialog shown in Figure 7-13.

    Figure 7-13 Default Upload Dialog

    Default Upload Options

    If the end user clicks Cancel, ADF Desktop Integration returns an abort code to the executing action set. If the end user clicks OK, the action set continues executing with the options specified in the dialog for the upload operation.

  4. The ADF Table component uploads modified rows in batches, rather than row by row. You can configure the batch options using the BatchOptions group of properties. For more information about batch options for the ADF Table component, see Section 7.10, "Batch Processing in an ADF Table Component."

    Each row of a batch is processed in the following way, and the process continues until all changed rows of each batch are processed:

    1. For inserted rows, invoke the InsertBeforeRowActionID action, if specified.

    2. Set attributes from the worksheet into the model, including any cached row attribute values.

    3. For edited rows, invoke the UpdateRowActionID action; and for inserted rows, invoke the InsertAfterRowActionID action, if specified.

    4. For each uploaded row, displays a status message in the Status column. For more information, see Section 8.2.5, "How to Display a Status Message While an Action Set Executes."

    5. For any row failure, it verifies the value of AbortOnFail. If AbortOnFail is set to False, it continues upload process, otherwise it stops uploading data and invokes the commit action.

  5. While uploading data, the ADF Table component returns a success or failure code to the executing action set based on the following:

    • If the ADF Table component uploads all batches successfully, it returns the success status to the executing action set. If the end user has selected the Download all rows after successful upload option in Step 3, the ADF Table component then downloads all rows from the Fusion web application.

    • If the ADF Table component did not upload all batches successfully, the action set invokes the action specified by the RowActions.FailureActionID property, if an action is specified for this property. ADF Desktop Integration returns a failure code to the action set.

If you selected On failure, continue to upload subsequent rows in the Upload Options dialog of Step 3, the Upload action returns a success code to the action set even if some individual rows encountered validation failures.


Note:

If an ADF Table component column's ReadOnly property evaluates to True, the ADF Table component's Upload action ignores changes in the column's cells.

For more information about an ADF Table component column's properties, see Table A-10.


7.8.3 What Happens at Runtime: How the ReadOnly EL Expression Is Evaluated During Upload

At runtime, if an ADF Table component column's ReadOnly property evaluates to True, the ADF Table component's Upload action ignores all changes in the column's cells.

It is recommended that you avoid ReadOnly EL Expressions that specify row value binding expressions as part of the expression. If a row value binding must be used, you must understand how the EL expression is evaluated during Upload.Currently, all EL expression evaluation is performed on the client. Therefore, an extra roundtrip to the server would be needed to first evaluate a ReadOnly EL expression containing a row value binding before the row value can be updated. In order to avoid the high cost of making an extra call to the server, ReadOnly EL expression evaluation during upload is performed the same as during table change tracking (as if the user were offline).

For more information about change tracking, see Section 7.19, "Tracking Changes in an ADF Table Component."

7.8.4 What Happens at Runtime: Upload Failure

When the ADF Table component starts uploading data, ADF Desktop Integration creates a DataControlFrame savepoint before initiating the upload process (once per batch of uploaded rows). In case of any failure, ADF Desktop Integration reverts back to the same savepoint, ensuring the integrity of the server-side state of the Fusion web application.

For each row in a batch of uploaded rows, ADF Desktop Integration does the following:

  1. Invokes configured actions, applies row attribute value changes, and performs data validation.

  2. In case of any error, reverts back to the savepoint state.


Note:

A second iteration is performed, if required, to re-upload any successfully uploaded rows whose changes were reverted due to a subsequent upload error.

For more information about savepoints, see the "Using Trees to Display Master-Detail Objects" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

7.8.5 How to Create a Custom Upload Dialog

You display a page from Fusion web application that offers end users different options to those presented in the default upload dialog. You add a Dialog action before the action that invokes the ADF Table component's Upload action in the action set.

Before you begin:

It may be helpful to have an understanding of how to configure ADF component to upload data from an ADF Table data component. For more information, see Section 7.8, "Configuring an ADF Component to Upload Changes from an ADF Table Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To create a custom upload dialog:

  1. Create a page in the JDeveloper project where you develop the Fusion web application. For information on how to create this page, see Section 8.4, "Displaying Web Pages from a Fusion Web Application."

  2. In addition to the ADFdi_CloseWindow element (for example, a span element) described in Section 8.4, "Displaying Web Pages from a Fusion Web Application," the page that you create in Step 1 must include the elements described in Table 7-6.

    Table 7-6 Span Elements Required for Custom Upload

    NameDescription

    ADFdi_AbortUploadOnFailure

    If you set this element to True, the action set stops uploading if it encounters a failure. If the element references False, the action set attempts to upload all rows and indicates if each row succeeded or failed to upload.

    ADFdi_DownLoadAfterUpload

    

    Set this element to True so the action set downloads data from the Fusion web application to the ADF Table component after the action set uploads modified data.



    Note:

    The page you create must include both elements to prevent ADF Desktop Integration presenting the default upload dialog to end users.

  3. Add a Dialog action to invoke the page you created in Step 1 before the action in the action set that invokes the ADF Table component's Upload action.

    For more information about displaying pages from a Fusion web application, see Section 8.4, "Displaying Web Pages from a Fusion Web Application."

7.8.6 What Happens at Runtime: Custom Upload Dialog

When a custom dialog appears, the page from the Fusion web application that you configure the Dialog action in the action set to display appears instead of the default upload dialog.


Note:

If there is no server connectivity when the end user tries to upload data, the end user gets an error when the Dialog action fails to find the custom upload page. ADF Desktop Integration does not revert to the standard dialog when server connectivity is not available.

For more information about displaying a page from the Fusion web application, see Section 8.4, "Displaying Web Pages from a Fusion Web Application." Otherwise, the runtime behavior of the action set that you configure to upload data is as described in Section 7.8.2, "What Happens at Runtime: How the ADF Table Component Uploads Data."

7.9 Configuring an ADF Table Component to Delete Rows in the Fusion Web Application

The ADF Table component exposes an action (DeleteFlaggedRows) that, when invoked, deletes the rows in the Fusion web application that correspond to the flagged rows in the ADF Table component. A flagged row in an ADF Table component is a row where the end user has double-clicked or typed a character in the cell of the _ADF_FlagColumn column as described in Section 7.10, "Batch Processing in an ADF Table Component." The _ADF_FlagColumn column must be present in the ADF Table component to configure it to delete rows in the Fusion web application.

In addition, the page definition file that you associate with the worksheet that hosts the ADF Table component must expose a Delete action binding.

7.9.1 How to Configure an ADF Table Component to Delete Rows in the Fusion Web Application

To delete rows from an ADF Table component, you must add the Delete action binding to the page definition file, configure RowActions group of properties of the ADF Table component, and configure an action set to invoke the DeleteFlaggedRows action.

Before you begin:

It may be helpful to have an understanding of how to configure ADF Table component to delete data rows in Fusion web application. For more information, see Section 7.9, "Configuring an ADF Table Component to Delete Rows in the Fusion Web Application."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To configure an ADF Table component to delete rows in a Fusion web application:

  1. Open your Fusion web application in JDeveloper.

  2. If not present, add a Delete action binding to the page definition file that is associated with the Excel worksheet that hosts the ADF Table component.

    For more information, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

  3. Open the property inspector for the ADF Table component and set values for the RowActions group of properties as described in Table 7-7.

    Table 7-7 RowActions Properties of ADF Table component

    Set this property...To...

    DeleteRowActionID

    The Delete action binding that the page definition file exposes.

    DeleteRowEnabled

    True to enable the ADF Table component to delete rows in the Fusion web application.

    False is the default value.


    For more information about ADF Table component properties, see Section A.9, "ADF Table Component Properties and Actions."

  4. Click OK.

  5. Open the integrated Excel workbook.

  6. Open the Edit Action dialog to configure an action set for the Oracle ADF component, ribbon control, or worksheet event that the end user uses to invoke the action set at runtime.

  7. Add the ADF Table component's DeleteFlaggedRows action to the list of actions that the action set invokes at runtime.

    For more information about invoking action sets, see Section 8.2, "Using Action Sets."

  8. Click OK.

7.9.2 What Happens at Runtime: How the ADF Table Component Deletes Rows in a Fusion Web Application

The end user flags rows to delete, as described in Section 7.10.2, "Row Flagging in an ADF Table Component." The end user then invokes the action set. The following sequence of events occurs:

  1. If specified, the action binding referenced by the BatchOptions.StartBatchActionID property is invoked.

    Failures from this step are treated as errors. An error stops the action set invoking. It also returns the error condition to the action set. If an action binding is specified for the ActionSet.FailureActionID property, the action set invokes the specified action binding.

    For more information about configuring batch options, see Section 7.10, "Batch Processing in an ADF Table Component."

  2. The action set invokes the Delete action binding specified by RowActions.DeleteRowActionID.


    Note:

    Rows inserted since the last invocation of the ADF Table component's Download action but not uploaded to the Fusion web application are ignored even if flagged for deletion.

  3. If no errors occur during the invocation of the Delete action binding, a success message entry appears in the _ADF_StatusColumn column. If a failure occurs, the ADF Table component stops invocation of the Delete action binding and continues to Step 4.

  4. If an action binding is specified for the BatchOptions.CommitBatchActionID property, the action set invokes it. If this step fails, the action set stops processing batches. If no failures occur, the action set processes the next batch by invoking the action binding specified by the BatchOptions.StartBatchActionID property, and so on until the action set processes all batches.

  5. If the action set processes all batches successfully, it invokes the action binding specified by its ActionOptions.SuccessActionID property if an action binding is specified for this property. It then removes the rows deleted in the Fusion web application by invocation of the Delete action binding specified by RowActions.DeleteRowActionID from the worksheet and returns a success code to the action set.

    If failures occur while the action set processes the batches, the action set invokes the action binding specified by its ActionOptions.FailureActionID property if an action binding is specified for this property. This action binding returns a failure code to the action set.

  6. If an unexpected exception occurs while the action set invokes its actions, an error code is returned to the action set. All row level errors are displayed in the Status column, and all batch level errors can be tracked through Table.errors. For more information about error handling, see Section 12.4, "Error Reporting in an Integrated Excel Workbook."

7.10 Batch Processing in an ADF Table Component

The ADF Table component uploads modified rows from the Excel workbook in batches rather than row-by-row. You can configure batch option properties that determine the size of batches and what actions the ADF Table component invokes when it uploads a batch.

7.10.1 How to Configure Batch Options for an ADF Table Component

The ADF Table component has a group of properties (BatchOptions) that allow you to configure how the ADF Table component manages batches of rows. Information about these properties can be found in Section A.9, "ADF Table Component Properties and Actions."

Before you begin:

It may be helpful to have an understanding of batch processing in the ADF Table component. For more information, see Section 7.10, "Batch Processing in an ADF Table Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To configure batch options for an ADF Table component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet that references the ADF Table component, and then click the Edit Properties button in the Oracle ADF tab.

  3. Set values for the BatchOptions group of properties in the property inspector that appears.

    Table 7-8 RowData.BatchOptions Properties

    Set this property...To...

    BatchSize

    Specify how many rows to process before an ADF Table component action (Upload or DeleteFlaggedRows) invokes the action binding specified by CommitBatchActionID. Any value other than a positive integer results in all rows being processed in a single batch. The default value is 100 rows.

    CommitBatchActionID

    The action binding to invoke after the ADF Table component processes each batch. Typically, this is the Commit action binding.

    LimitBatchSize

    True

    When True, the ADF Table component processes rows in batches determined by the value of BatchSize. When False, the ADF Table component uploads all modified rows in a single batch.

    True is the default value.

    StartBatchActionID

    Specify the action binding to invoke at the beginning of each batch.


  4. Click OK.

Note that a failure at the Entity level is not considered a batch failure. A failure at the commit level (for example, a wrong value for a foreign key attribute) is considered a batch failure.

7.10.2 Row Flagging in an ADF Table Component

By default, the ADF Table component includes a column, _ADF_FlagColumn, that facilitates the selection of rows for flagged-row processing. Double-clicking a cell of the _ADF_FlagColumn column flags the corresponding row for processing by actions invoked by a component action.

When the end user double clicks a cell of the _ADF_FlagColumn column, a solid circle appears, or disappears, in the cell to indicate that the row is flagged, or not. Figure 7-14 shows an example of a flagged column.

Figure 7-14 Flagged Column in ADF Table Component

Flagged column in DEG component

Note:

By default, the solid circle character indicates a row flagged for flagged-row processing. However, any nonempty cell in a _ADF_FlagColumn column flags the corresponding row for flagged-row processing.

The following component actions can be invoked on flagged rows:

  • DeleteFlaggedRows

  • DownloadFlaggedRows

You can use the FlagAllRows component action to flag all rows, and the UnflagAllRows component action to unflag all rows of the ADF Table component.


Note:

The ADF Table component's DownloadFlaggedRows action does not support changes in table column structure after the last invocation of the Download or DownloadForInsert action. The table column structure usually changes if you are using dynamic columns, or if the table contains columns with complex expressions in the Visible property.

Use of these component actions is dependent on the appearance of the _ADF_FlagColumn column in the ADF Table component. If you remove the _ADF_FlagColumn column from the ADF Table component, you cannot invoke any of these component actions. For more information about these component actions, see Section A.9.3, "ADF Table Component Actions."

At runtime, the end user can invoke any of the previously listed component actions from an action set. The invoked component action processes all flagged rows. For example, it downloads or deletes all flagged rows. For more information about configuring an action set to invoke a component action, see Section 8.2.2, "How to Invoke Component Actions in an Action Set."

7.10.3 Troubleshooting Errors While Uploading Data

End users might encounter unexpected reports of errors under certain circumstances while uploading data from ADF Table components. After posting changes from a batch, ADF Desktop Integration runs the action specified by the CommitBatchActionID. Errors that occur during the commit action might continue to be reported on subsequent batch commit actions, even though those batches of records do not contain the error. This can happen when any pending model updates are not automatically reverted when the CommitBatchActionID action fails.

To avoid any such error, you must explicitly revert pending model updates that exist after a commit failure. For example, you could create a custom action for the CommitBatchActionID that first attempts to commit the pending model changes. However, if an exception occurs during commit, the custom method should first roll back the pending model changes, so that any subsequent batch commit attempts can succeed.


Note:

It is important that the commit exception gets thrown again after rollback so that the commit errors are reported, as expected on the client.

7.11 Special Columns in the ADF Table Component

By default, the ADF Table component includes some columns when you insert an ADF Table component in a worksheet. You can retain or remove these columns, if required. The following list describes the columns and the purpose they serve:

  • _ADF_ChangedColumn

    The cells in this column track changes to the rows in the ADF Table component. If a change has been made to data in a row of the ADF Table component since download or the last successful upload, a character that resembles an upward pointing arrow appears in the corresponding cell of the _ADF_ChangedColumn column. This character toggles (appears or disappears) when a user double-clicks a cell in this column. Figure 7-15 shows an example.

    Figure 7-15 Changed Column in an ADF Table Component

    Changed column in DEG component

    Note:

    If the end user does not want the ADF Table component's Upload action to upload changes in the rows flagged by this column, he or she must clear the entry that appears in the corresponding cell.

    A confirmation dialog appears to end users when the ADF Table component's Download action is invoked, and one or more rows in this column are flagged as changed. The end user clicks OK to allow the Download action to execute, or Cancel to stop the execution of the Download action.

  • _ADF_FlagColumn

    When the end user double-clicks a cell in this column, the corresponding row is flagged for flagged-row processing. A solid circle character appears to indicate that the row is flagged for flagged-row processing. For more information about the use of this column, see Section 7.10.2, "Row Flagging in an ADF Table Component."

    A confirmation dialog appears to end users when the ADF Table component's DownloadFlaggedRows action is invoked, and one or more rows in _ADFChangedColumn and _ADF_FlagColumn are flagged. The end user clicks OK to allow the action to execute or Cancel to stop the execution of the action.


    Note:

    By default, the solid circle character indicates a row flagged for flagged-row processing. However, any nonempty cell in a _ADF_FlagColumn flags the corresponding row for flagged-row processing.

  • _ADF_StatusColumn

    This column reports the results of invocation of the following ADF Table component actions:

    • DeleteFlaggedRows

    • Upload

    A message appears in the cell of the _ADF_StatusColumn to indicate the result of the invocation for the corresponding row. If the end user invokes a DoubleClickActionSet defined in an ADF Table column and an error occurs, the errors are also reported in the status column of the corresponding row. Figure 7-16 shows an example of Status column message.

    Figure 7-16 Status Column in an ADF Table Component

    Status Column in DEG Component
  • _ADF_RowKeyColumn

    This column, also referred to as the Key column, contains important information about the ADF Table component used by ADF Desktop Integration at runtime. The column appears both at runtime and design time. You can remove the column from the table at design time, but note that it automatically appears at runtime as the last column of the table.

    For more information about the _ADF_RowKeyColumn, see Section 7.12, "Configuring ADF Table Component Key Column."

The ADF Table component treats the properties of the _ADF_ChangedColumn, _ADF_FlagColumn, _ADF_RowKeyColumn, and _ADF_StatusColumn columns differently from the properties of other columns that it references. It ignores the values set for properties such as InsertComponent, InsertUsesUpdate, and UpdateComponent unless it invokes the DisplayRowErrors action described in Table A-11. It reads the values for properties related to style and appearance, for example CellStyleName and HeaderStyleName.

7.12 Configuring ADF Table Component Key Column

When you add ADF Table to your integrated Excel workbook, the Key column (column ID: _ADF_RowKeyColumn) appears automatically at design time. The Key column contains important information that is used by ADF Desktop Integration for proper functioning of the table. Note that you must not remove the Key column at runtime.

7.12.1 How to Configure the Key Column

You can configure the Key column's position, style properties, and header label. By default, the _ADFDI_TableKeyCellStyle style is applied to it.

Before you begin:

It may be helpful to have an understanding of the Key column in the ADF Table component. For more information, see Section 7.12, "Configuring ADF Table Component Key Column."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To configure the Key column:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet that references the ADF Table component and click the Edit Properties button in the Oracle ADF tab.

  3. In the Edit Component: ADF Table dialog, click the ellipsis button (...) beside the input field for Columns to invoke the Edit Columns dialog.

  4. Select the column with an ID of _ADF_RowKeyColumn.

  5. Change the column properties as desired, but do not change the following properties:

    • DynamicColumn

    • InsertComponent

    • InsertUsesUpdate

    • UpdateComponent

    • ID

    • Visible

  6. If desired, change the position of the column using the Up and Down arrow keys.

  7. Click OK to close Edit Columns dialog.

  8. Click OK to close the Edit Component: ADF Table dialog.

7.12.2 How to Manually Add the Key Column At Design Time

If you are using the integrated Excel workbook prepared and configured using an earlier version of ADF Desktop Integration, the Key column will not be available at design time. It will appear only at runtime. If you want to configure the Key column properties, you can add it in the workbook at design time.

Before you begin:

It may be helpful to have an understanding of the Key column in the ADF Table component. For more information, see Section 7.12, "Configuring ADF Table Component Key Column."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To manually add the Key column at design time:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet that references the ADF Table component, and then click the Edit Properties button in the Oracle ADF tab.

  3. Add a new column in the ADF Table, and specify the properties as described in Table 7-9. For more information about adding a column, see Section 7.3.2, "How to Add a Column in an ADF Table Component."

    Table 7-9 Key Column Properties

    Set this property...To ...

    CellStyleName

    _ADFDI_TableKeyCellStyle

    HeaderStyleName

    _ADFDI_HeaderStyle

    DynamicColumn

    False

    HeaderLabel

    #{_ADFDIres[COMPONENTS_TABLE_ROWKEY_COL_LABEL]}

    ID

    _ADF_RowKeyColumn

    InsertUsesUpdate

    True

    UpdateComponent

    OutputText

    The Value property must be empty.

    Visible

    True


    If desired, you may change the position of the Key column using the Up and Down arrow keys.

  4. Click OK.


Note:

You must specify the ID property of the new column as _ADF_RowKeyColumn; otherwise, the column will not be considered to be a Key column, and another Key column will automatically appear at runtime.

7.13 Creating a List of Values in an ADF Table Component Column

Use the TreeNodeList subcomponent when you want to render a dropdown list of values in an ADF Table component column. The list of values can display a maximum of two hundred and fifty values at runtime. Unlike other ADF Desktop Integration components, the TreeNodeList subcomponent does not appear in the components palette described in Section 5.5, "Using the Components Palette." Instead, you invoke it as a subcomponent when you specify values for the InsertComponent or UpdateComponent properties of an ADF Table component column. For information about the properties of an ADF Table component column, see Section A.9.2, "ADF Table Component Column Properties."

After you invoke the TreeNodeList subcomponent, you must specify a tree binding attribute associated with a model-driven list as a value for the TreeNodeList subcomponent's List property. The tree binding attribute associated with a model-driven list populates the dropdown menu in the Table component's column with a list of values after invocation of the Table component's Download action.


Note:

You can create a model-driven list of values in your ADF Table component by choosing ModelDrivenColumnComponent as the subcomponent type. For more information about creating a model-driven list, see Section 7.14, "Adding a ModelDrivenColumnComponent Subcomponent to Your ADF Table Component."

For information about the properties of a TreeNodeList subcomponent, see Section A.6, "TreeNodeList Subcomponent Properties."

7.13.1 How to Create a List of Values in an ADF Table Component Column

You add a column to the ADF Table component column and select TreeNodeList as the subcomponent. You then specify a tree binding attribute as the value for the TreeNodeList subcomponent's List property. A model-driven list must be associated with the tree binding attribute that you specify.


Note:

The TreeNodeList subcomponent does not support a model-driven list whose control type is input_text_lov or combo_lov.

Before you begin:

It may be helpful to have an understanding of how to create a list of values in ADF Table component. For more information, see Section 7.13, "Creating a List of Values in an ADF Table Component Column."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To create a list of values in an ADF Table component column:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet that references the ADF Table component and click the Edit Properties button in the Oracle ADF tab.

  3. In the Edit Component: ADF Table dialog, click the ellipsis button (...) beside the input field for Columns to invoke the Edit Columns dialog.

  4. Click Add to add a new column.

  5. Choose the appropriate option for the newly created column:

    • Click the ellipsis button (...) beside the input field for InsertComponent to configure the runtime list of values for insert operations.

    • Click the ellipsis button (...) beside the input field for UpdateComponent to configure the runtime list of values for update and download operations.

    In both options, the Select subcomponent to create dialog appears.

  6. Select TreeNodeList and click OK.

  7. Expand the property that you selected in Step 5 and configure values as follows:

    Figure 7-17 shows the property inspector for an ADF Table component column in AdvEditPriceList-DT.xlsx after TreeNodeList is selected as the subcomponent for the column's UpdateComponent property.

    Figure 7-17 ADF Table Component Column Configured to Display a List of Values

    Table Component Column to Display a List of Values
  8. Click OK.

7.13.2 What Happens at Runtime: How the ADF Table Column Renders a List of Values

At runtime, the ADF Table component invokes the Download action and populates each column. This action also populates the list of values in the column that you configure to render a list of values. Figure 7-18 shows an example from AdvEditPriceList-DT.xlsx of the Master Price List module where Category is the column configured to display a list of values.

Figure 7-18 Runtime View of an ADF Table Component Column Displaying a List of Values

Table Component Column Displaying a List of Values

7.14 Adding a ModelDrivenColumnComponent Subcomponent to Your ADF Table Component

You can add a ModelDrivenColumnComponent subcomponent to an ADF Table component. The value of ModelDrivenColumnComponent is determined by the Control Type hint specified for each attribute on the server.

At design time, for a column, specify the subcomponent type as ModelDrivenColumnComponent for the UpdateComponent or InsertComponent properties. At runtime, if there is a model-driven list associated with the attribute, then the column uses a dropdown list using the TreeNodeList subcomponent.


Note:

If there is no model-driven list associated with the attribute, or if any non-list-based control type is specified, then the column uses an InputText subcomponent. If there is a model-driven list whose control type is input_text_lov or combo_lov, then the column uses an InputText subcomponent.

For more information about creating a model-driven list, see the "How to Create a Model-Driven List" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Support for Dependent List of Values

When multiple ModelDrivenColumnComponent list subcomponents are exposed in an ADF Table component, then for each list ADF Desktop Integration determines whether it depends on another model-driven list. It verifies that the bind variable specified for a list references an attribute bound to another list.

If the list depends on another model-driven list, the subcomponent's DependsOnList value is set automatically at runtime.

As server-side list binding dependencies are determined only for lists in the same tree node, the following tree node list bindings are not supported:

  • A binding that depends on a list binding in a different tree or tree node

  • A binding that depends on a list binding in the page definition file

7.15 Adding a Dynamic Column to Your ADF Table Component

You can add dynamic columns to an ADF Table component so that the ADF Table component expands or contracts at runtime depending on the available attributes returned by the view object. The DynamicColumn property of the Columns group in the TableColumn array controls this behavior. To make a column dynamic, set the DynamicColumn property to True. A dynamic column in the TableColumn array is a column that is bound to a tree binding or a tree node binding whose attribute names are not known at design time. A dynamic column can expand to more than a single worksheet column at runtime.

The ADF Table component's dynamic column supports the following subcomponent types:

  • InputText

  • OutputText

  • ModelDrivenColumnComponent


Note:

ADF Desktop Integration does not support the subcomponent type TreeNodeList in a dynamic column.

Support for Model-Driven List of Values

You can also configure a dynamic column to support the List of Values subcomponent where the subcomponent type is determined from model configuration at runtime. At design time, specify the subcomponent type as ModelDrivenColumnComponent for the UpdateComponent or InsertComponent properties. At runtime, during dynamic column expansion, the model-driven runtime component is determined before caching the list of values. The remote servlet allows the client to retrieve Model configuration, allowing the client to choose the desired column subcomponent type. For more information about ModelDrivenColumnComponent, see Section 7.14, "Adding a ModelDrivenColumnComponent Subcomponent to Your ADF Table Component."

7.15.1 How to Configure a Dynamic Column

You configure a dynamic column by specifying an EL expression with the following format for the Value property of the component specified by the ADF Table component column's InsertComponent property as a subcomponent:

#{bindings.TreeID.[TreeNodeID].AttributeNamePrefix*.inputValue}

or:

#{bindings.TreeID.AttributeNamePrefix*.inputValue}

where:

  • TreeID is the ID of the tree binding used by the ADF Table component

  • TreeNodeID is an optional value that specifies the tree node binding ID. If you omit this value, all matching attributes from the tree binding display regardless of which tree node binding the attribute belongs to.

  • AttributeNamePrefix identifies a subset of attributes that exist within the tree binding's underlying iterator. If you do not specify a value for AttributeNamePrefix, all attributes for the tree binding or tree binding node are returned. Always use the * character.


Note:

While adding a dynamic column, ensure that tree node attribute names are not specified in the page definition file. At runtime, the tree node object returns all attribute names from the underlying iterator. If there are attribute names specified in the page definition file, the tree node object limits the list of available attribute names based on that list.

The following example returns all attributes that begin with the name "period" in the model.EmpView node of the EmpTree binding:

#{bindings.EmpTree.[model.EmpView].period*.inputValue} 

7.15.2 What Happens at Runtime: How Data Is Downloaded or Uploaded In a Dynamic Column

When the ADF Table component's Download or DownloadForInsert action is invoked, the ADF Table component automatically updates the dynamic columns so that they contain an up-to-date set of matching attributes. For each invocation of Download, ADF Desktop Integration requires that all rows must have the same set of attributes for the dynamic column. It may generate errors if the set of attributes changes from row to row during Download.

If a dynamic column supports both Insert and Update operations, you should specify the same EL expression for the Value properties of the dynamic column's InsertComponent and UpdateComponent subcomponents. At runtime, the ADF Table component expands to include a dynamic column that displays the value of the attribute binding returned by the EL expression.

When the ADF Table component's Upload action is invoked, the workbook prompts the end user to determine if the end user wants to continue to upload data when the previously downloaded attributes no longer exist in the tree binding.

Support for View Objects with Declarative SQL Mode

To support view objects that are configured with declarative SQL mode and customized at runtime, ADF Desktop Integration ignores all attributes with the selected property set to False. On the server side, the JUCtrlHierNodeBinding object determines the attribute list and passes it to the integrated Excel workbook on request.

7.15.3 How to Specify Header Labels for Dynamic Columns

Use the following syntax to write EL expressions for the HeaderLabel property of a dynamic column:

#{bindings.TreeID.[TreeNodeID].hints.AttributeNamePrefix*.label}

or:

#{bindings.TreeID.hints.AttributeNamePrefix*.label}

Specify the same tree binding ID, tree node binding ID, and attribute name prefix values in the HeaderLabel property of the dynamic column as the values you specify for the Value properties of the dynamic column's InsertComponent and UpdateComponent if the dynamic column supports Insert and Update operations.


Note:

The ADF Table component ignores the value of a column's Visible property when you configure a column to be dynamic. For more information about ADF Table component column properties, see Table A-10.

If you want the mandatory columns, where the end user must enter a value, to be marked with a character or a string, you must configure the HeaderLabel property. Use the following syntax to write EL expression to add a character or string to all mandatory columns:

=IF(#{bindings.TreeID.[TreeNodeID].hints.*.mandatory}, "<prefix_for_mandatory_cols>", "") & "#{bindings.TreeID.[TreeNodeID].hints.*.label}"

For example, the following EL expression adds an asterisk (*) character to the mandatory columns label:

=IF(#{bindings.MyTree.[myapp.model.MyChildNode].hints.*.mandatory}, "* ", "") & "#{bindings.MyTree.[myapp.model.MyChildNode].hints.*.label}"

7.15.4 How to Specify Styles for Dynamic Columns According to Attribute Data Type

You can specify different styles for each data type according to the data type of the column. Use the following syntax to write EL expressions for the CellStyleName property of a dynamic column:

=IF("#{bindings.TreeID.[TreeNodeID].hints.*.dataType}"="<data_type>", <custom_style_expression1>, <custom_style_expression2>)

In the following example, the MyDateStyle style is applied to all date columns, and MyDefaultStyle is applied to other data type columns:

=IF("#{bindings.MyTree.[myapp.model.MyChildNode].hints.*.dataType}"="date", "MyDateStyle", "MyDefaultStyle")

The following example shows another scenario where the MyDateStyle style is applied to all date data type columns, MyNumberStyle is applied to all number data type columns, and MyDefaultStyle is applied to other data type columns:

=IF("#{bindings.MyTree.[myapp.model.MyChildNode].hints.*.dataType}"="date", "MyDateStyle", IF("#{bindings.MyTree.[myapp.model.MyChildNode].hints.*.dataType}"="number", "MyNumberStyle", "MyDefaultStyle"))

For more information about EL expressions, see Appendix B, "ADF Desktop Integration EL Expressions."

7.16 Creating an ADF Read-Only Table Component

At runtime, the ADF Read-only Table component renders a table across a continuous range of cells that displays data from the tree binding that the ADF Read-only Table component references. Use this component to display data that you do not want the end user to edit.

This component supports several properties, such as RowLimit, that determine how many rows the component downloads when it invokes its Download action. It also includes a group of properties (Columns) that determine what columns from the tree binding appear at runtime in the Excel worksheet. The TreeID property specifies the tree binding that the component references. More information about these properties and others that the ADF Read-only Table component supports can be found in Section A.10, "ADF Read-only Table Component Properties and Actions."

Figure 7-19 shows the ADF Read-only Table component at design time with the property inspector in the foreground.

Figure 7-19 ADF Read-only Table Component at Design Time

The Read-only Table component at design time.

Figure 7-20 shows the columns that an ADF Read-only Table component which references the ProductList tree binding in the ExcelReadOnlyPageDef.xml page definition file of the Master Price List module renders at runtime.

Figure 7-20 Columns in an ADF Read-only Table Component at Runtime

Columns in a Read-only Table Component at run time

Note:

At runtime, inserting a row into the ADF Read-only Table component results in a new Excel row that behaves as if it is part of the downloaded data set, but the new row exists only in Excel. The data from the new row is not uploaded to the server, and does not affect the Fusion web application data.

7.16.1 How to Insert an ADF Read-only Table Component

You use the ADF Desktop Integration Designer task pane to insert an ADF Read-only Table component into a worksheet.

Before you begin:

It may be helpful to have an understanding of ADF Read-only Table component. For more information, see Section 7.16, "Creating an ADF Read-Only Table Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To insert an ADF Read-only Table component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet where you want to anchor the component.

  3. In the bindings palette, select the binding to create the ADF Read-only Table component, and then click Insert Binding.

  4. In the dialog that appears, select ADF Read-only Table.


    Note:

    You can also insert an ADF Read-only Table component by using the components palette or Oracle ADF tab. Select ADF Read-only Table and click Insert Component. If you use the components palette to create the component, you would have to add each column to appear in the component at runtime.

  5. Configure properties in the property inspector that appears to determine the columns to appear and the actions the component invokes at runtime.

  6. Click OK.


    Note:

    You can modify the properties of the component at a later time by selecting the cell in the worksheet that anchors the component and then displaying the property inspector.

7.16.2 How to Manually Add a Column to the ADF Read-only Table Component

You can manually add additional columns to an ADF Read-only Table component or re-add columns that you previously removed.

Before you begin:

It may be helpful to have an understanding of ADF Read-only Table component. For more information, see Section 7.16, "Creating an ADF Read-Only Table Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To manually add a column to the ADF Read-only Table component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the worksheet that hosts the ADF Read-only Table component and click the Edit Properties button in the Oracle ADF tab to display the Edit Component: ADF Read-only Table dialog.

  3. Click the ellipsis button (...) beside the input field for Columns to invoke the Edit Columns dialog.

  4. Click Add to add a new column to the ADF Read-only Table component.

  5. Set values for the properties of the new column.

    For information about the properties of an ADF Read-only Table component column, see Table A-13.

  6. Click OK.

7.17 Limiting the Number of Rows Your Table-Type Component Downloads

You can configure the number of rows that an ADF Table or ADF Read-only T6=able component downloads by setting values for the component's RowLimit group of properties. You can also display a warning message, if desired, that alerts the end user when the number of rows available to download exceeds the number of rows specified for download.

7.17.1 How to Limit the Number of Rows a Component Downloads

Specify the number of rows that the component downloads when it invokes its Download action as a value for the RowLimit.MaxRows property. Optionally, write an EL expression for the RowLimit.WarningMessage property so that the end user receives a message if the number of rows available to download exceeds the number specified by RowLimit.MaxRows.

Before you begin:

It may be helpful to have an understanding of how to limit the number of rows while downloading data in your ADF Table component. For more information, see Section 7.17, "Limiting the Number of Rows Your Table-Type Component Downloads."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To limit the number of rows a table-type component downloads:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet that references the table-type component and click the Edit Properties button in the Oracle ADF tab.

    For more information, see Section 8.2, "Using Action Sets."

  3. Configure properties for the RowLimit group of properties, as described inTable 7-10. For more information about these properties, see Section A.1, "Frequently Used Properties in the ADF Desktop Integration."

    Table 7-10 RowLimit Group of Properties

    Set this property to...This value...

    RowLimit.Enabled

    Set to True to limit the number of rows downloaded to the value specified by RowLimit.MaxRows.

    RowLimit.MaxRows

    Specify an EL expression that evaluates to the maximum number of rows to download.

    RowLimit.WarningMessage

    Write an EL expression for this property to generate a message for the end user if the number of rows available to download exceeds the number specified by RowLimit.MaxRows.

    The default value also generates a message:

    #{_ADFDIres['ROWLIMIT_WARNINGS_MESSAGE_1']}

    If the value for this property is null, the Download action downloads the number of rows specified by RowLimit.MaxRows without displaying a message to the end user.


  4. Click OK.

Figure 7-21 shows the Edit Component dialog in the EditPriceList-DT.xlsx workbook where the row limit of an ADF Table component is configured.

Figure 7-21 Limiting Number of Rows of an ADF Table Component

The RowLimit attribute group at design time.

7.17.2 What Happens at Runtime: How the RowLimit Property Works

When invoked, the Table-type component's Download action downloads the number of rows that you specified as the value for RowLimit.MaxRows from the Fusion web application. A message dialog similar to the one in Figure 7-22 appears if you specify an EL expression for RowLimit.MaxRows or do not modify its default value:

#{_ADFDIres['ROWLIMIT_WARNINGS_MESSAGE_1']}

Figure 7-22 Row Limit Exceeded Warning Message

Row Limit Exceeded Warning Message

7.18 Clearing the Values of Cached Attributes in an ADF Table Component

The RowData group of properties described in Table A-9 allow you to specify data to cache in the ADF Table component. For more information about this functionality, see the following:

The ADF Table component exposes an action (ClearCachedRowAttributes) that, when invoked, clears the values of cached attributes for the current row of the ADF Table component.

Do not configure a component (for example, an ADF Table component's column or an ADF Input Text component) so that an end user can view or edit an attribute binding that you have also specified for an element in the RowData.CachedAttributes array. The RowData.CachedAttributes array caches the values retrieved by the worksheet DownSync action. The worksheet UpSync action sends the values of the RowData.CachedAttributes array to the Fusion web application. This may override edits an end user makes to an attribute binding exposed through a component in the worksheet.

7.18.1 How to Clear the Values of Cached Attributes in an ADF Table Component

Configure a DoubleClickActionSet that includes an action to invoke the ADF Table component's ClearCachedRowAttributes action.

Before you begin:

It may be helpful to have an understanding of how to clear cached attributes in an ADF Table component. For more information, see Section 7.18, "Clearing the Values of Cached Attributes in an ADF Table Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 7.1.2, "Additional Functionality of Table-Type Components."

To clear the values of cached attributes in an ADF Table component:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog for the Oracle ADF component that is going to invoke the DoubleClickActionSet at runtime.

    For more information about invoking action sets, see Chapter 8, "Using Action Sets."

  3. Add an action to the DoubleClickActionSet that invokes the ADF Table component's ClearCachedRowAttributes action.

  4. Click OK.

7.18.2 What Happens at Runtime: How the ADF Table Component Clears Cached Values

The action set invokes the ADF Table component's ClearCachedRowAttributes action. This action clears the cached values specified by the RowData.CachedAttributes property for the current row of the ADF Table component.

7.19 Tracking Changes in an ADF Table Component

End users can create or modify data in the cells of an integrated Excel workbook that hosts an ADF Table component.

If a column is updatable and not read-only, change tracking is activated. End users can make the following changes to activate change tracking:

  • Edit cell values

  • Insert or delete cell values

  • Paste values to cells in the ADF Table component column that they copied elsewhere

A character that resembles an upward pointing arrow appears in a row of the _ADF_ChangedColumn column if the end user makes a change to data in a corresponding row. Figure 7-23 shows an example.

Figure 7-23 Changed Column in an ADF Table Component

Changed column in DEG component

This character appears if the end user makes a change to data hosted by a component where the component's ReadOnly property value is False. The ADF Input Text and TreeNodeList subcomponents both have a ReadOnly property. You can write an EL expression or a static string for this ReadOnly property that evaluates to True or False. If you write a static string or an EL expression that evaluates to True, no character appears in the _ADF_ChangedColumn column. For more information about ReadOnly EL expressions and change tracking, see Section 7.8.2, "What Happens at Runtime: How the ADF Table Component Uploads Data."

If you write an EL expression for this ReadOnly property that evaluates to True, ADF Desktop Integration evaluates it differently to other EL expressions during change tracking. This is because it is not desirable to invoke a connection to the Fusion web application if the end user makes changes to data in an ADF Table component while working in disconnected mode. Instead, ADF Desktop Integration substitutes an empty string value for any part of an EL expression that requires a connection to the Fusion web application. This behavior also applies to the ADF Table component column's CellStyleName property.


Note:

During change tracking, cell styles are applied when the end user inserts new worksheet rows.

For example, the end user in disconnected mode makes a change to a data value hosted by the ADF Input Text component in an ADF Table component column. During change tracking, ADF Desktop Integration substitutes an empty string value in the parts of the EL expression for the ADF Input Text component's ReadOnly property and the ADF Table component column's CellStyleName property that require a connection to the Fusion web application. For this reason, write EL expression for these properties that evaluate as you intend if an empty string value is substituted for a part of the expression that requires a connection to the Fusion web application to retrieve a runtime value.

The ADF Output Text component does not have a ReadOnly property. Changes that you make to a value hosted by this component, or the ADF Input Text and TreeNodeList subcomponents, do not result in a change to the _ADF_ChangedColumn column.

PKU66PK.[EOEBPS/ap_model_api.htm*f Using the ADF Desktop Integration Model API

H Using the ADF Desktop Integration Model API

This appendix describes how to use the ADF Desktop Integration Model API library to enable custom ApplicationModule methods to access attribute values passed during upload process when there are no actual rows available in a tree node binding.

This appendix includes the following sections:

H.1 About the Temporary Row Object

Each ADF Table component is bound to a tree binding defined within a page definition. Each tree control binding has one (or more) tree nodes defined. For parent-child relationships, the tree binding has two nodes, one for parent table and another for child table. At runtime, the ADF Table component displays both parent and child attributes within each worksheet row. On upload, ADF Desktop Integration sets attribute values to both the parent and child nodes.

In certain situations, a particular tree node may not have actual data rows available during Table.Upload request processing. Two common scenarios where a tree node may not have data are:

  • The tree node's iterator result set does not have any data rows available. This could be because of a query returning zero rows.

  • In a parent-child relationship, if the foreign key has not been populated in the parent table, the link between parent and child tree node may not contain actual rows.

There may be certain cases when, even though there is no actual row available on the server, you still want to allow the end user to enter values in the worksheet and upload them to the server. During upload, ADF Desktop Integration creates a temporary row object and stores the values uploaded from the worksheet row. Using the ADF Desktop Integration Model API, you can write custom Java code to access the temporary row object and collect its values.

To call your custom Java code during upload, you must expose your custom Java code through a pageDef action binding and then configure the ADF Table component's UpdateRowActionID or InsertAfterRowActionID to point to the pageDef action binding.

H.2 About ADF Desktop Integration Model API

While data is being uploaded, if a tree node of the ADF Table component contains no actual rows, the ADF Desktop Integration remote servlet creates a temporary row object to store the attribute values. If you want to access the temporary row object and its attribute values, you must write custom Java code that uses the ADF Desktop Integration Model API library.


Note:

The ADF Desktop Integration Model API is not supported for EJB or Toplink data controls.

For more information about the classes and methods available in the API, see Section H.3, "ADF Desktop Integration Model API Classes and Methods."

H.2.1 How to Add ADF Desktop Integration Model API Library to Your JDeveloper Project

You typically add the ADF Desktop Integration Model API Library to your application's data model project. The library is an independent library, not included with any feature. You can add it through Project Properties dialog box.

To add ADF Desktop Integration Model API library to your project:

  1. In the Application Navigator, right-click the data model project and choose Project Properties.

  2. In the Project Properties dialog, select Libraries and Classpath to view the list of libraries available.

  3. Click Add Library and in the Add Library dialog box, select the ADF Desktop Integration Model API library.

    Figure H-1 Add Library Dialog

    Add Library Dialog showing Model API library.
  4. Click OK. The library name adds to the Classpath Entries list.

  5. Click OK to close the Project Properties dialog box.

H.3 ADF Desktop Integration Model API Classes and Methods

The ADF Desktop Integration Model API library contains one public class that contains APIs for retrieving temporary row objects.

H.3.1 The oracle.adf.desktopintegration.model.ModelHelper Class

The ModelHelper class is a public class that exposes Model APIs. The following sections describe the methods available in the class.

H.3.1.1 The getAdfdiTempChildRow Method

The method is used to lookup temporary child row object (ViewRowImpl object) associated with a particular master row. When required, the servlet code creates the temporary ViewRowImpl object and stores attribute values when there are no actual ViewRowImpl objects available.

The method returns the temporary child ViewRowImpl object containing any attribute values sent from worksheet.

Method Syntax

public static final ViewRowImpl getAdfdiTempChildRow(ViewRowImpl masterRow, java.lang.String childAccessor)

Parameters

  • masterRow – master row object

  • childAccessor – child attribute name

H.3.1.2 The getAdfdiTempRowForView Method

The method is used to lookup temporary child row object (ViewRowImpl object) associated with a particular view. When required, the servlet code creates the temporary ViewRowImpl object and stores attribute values when there are no actual ViewRowImpl objects available.

The method returns the temporary child ViewRowImpl object containing any attribute values sent from worksheet.

Method Syntax

public static final ViewRowImpl getAdfdiTempRowForView(ApplicationModuleImpl am,java.lang.String viewDefName)

Parameters

  • am – application module instance

  • viewDefName – view definition name

H.3.1.3 The getChildViewDef Method

The method is used to lookup polymorphic child view definition if the view link destination attributes specify one or more child discriminator attributes. The master row source attributes lookup the correct polymorphic child view definition through ViewObjectImpl.findViewDefFromDiscrValues API. If no child discriminator attributes are defined, or the child view is non-polymorphic, the default child ViewDefImpl object is returned.

The method returns the temporary child ViewRowImpl object containing any attribute values sent from worksheet, or returns null if the object is not found.

Method Syntax

public static final ViewDefImpl getChildViewDef(ViewRowImpl masterRow,java.lang.String childAccessor)

Parameters

  • masterRow – master row object

  • childAccessor – child attribute name

PKsr**PK.[EOEBPS/deploy_app.htm Deploying Your Integrated Excel Workbook

14 Deploying Your Integrated Excel Workbook

This chapter describes how to deploy a workbook that you have integrated with a Fusion web application to your end users after you have finalized the integration.

This chapter includes the following sections:

14.1 About Deploying Your Integrated Excel Workbook

After you finish development of your integrated Excel workbook, you make the final integrated Excel workbook available to end users by deploying the resulting Fusion web application to an application server. Before you deploy a finalized Excel workbook that integrates with the Fusion web application, you must publish it as described in Section 14.3, "Publishing Your Integrated Excel Workbook." After you have published the Excel workbook, you can deploy it using one of the methods outlined in the "Deploying Fusion Web Applications" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

The end users that you deploy an integrated Excel workbook to must do the following:

When you deploy your integrated Excel workbook with your Fusion web application, you are not required to provide the download URL of workbooks explicitly. The end users can download the integrated Excel workbooks from the Fusion web application's user interface. For more information, see Section 14.4, "Deploying a Published Workbook with Your Fusion Web Application."

14.1.1 Integrated Excel Workbook Deployment Use Cases and Examples

You use the Publish button of the Oracle ADF tab to save a copy of the workbook, which is ready for publishing. Figure 14-1 shows the Publish button and the Publish Workbook dialog that opens when you click the Publish button to save a copy of the integrated Excel workbook ready to be published and deployed with the Fusion web application.

Figure 14-1 Publish Workbook Dialog

Publish Workbook dialog box

14.1.2 Additional Functionality for Deploying Your Integrated Excel Workbook

After you have published and deployed your integrated Excel workbook, you may find that you need to add additional functionality for your workbook. Following are links to other functionalities that you can use:

14.2 Making ADF Desktop Integration Available to End Users

End users who want to use the functionality that you configure in an integrated Excel workbook must install the Runtime edition of ADF Desktop Integration. The setup.exe tool is located in the adfdi-excel-runtime-client-installer.zip file available in MW_HOME\oracle_common\modules\oracle.adf.desktopintegration_11.1.1 directory, where MW_HOME is the Middleware Home directory.

For information about using the setup.exe tool, see Section I.1, "Installing the Runtime Edition of ADF Desktop Integration."

For more information about Microsoft ClickOnce installer, see the following:

http://msdn.microsoft.com/en-us/library/71baz9ah.aspx

14.3 Publishing Your Integrated Excel Workbook

After you finish configuring the Excel workbook with Oracle ADF functionality, you must publish it. Publishing a workbook makes it available to the end users for whom you configured the integrated Excel workbook.

ADF Desktop Integration also provides you with two methods to publish your workbook. You can publish your integrated Excel workbook directly from Excel, or you can use the publish tool available in JDeveloper to publish the workbook from the command line. The command-line publish tool enables you to use ANT build scripts to publish an integrated Excel workbook from your Fusion web application.

14.3.1 How to Publish an Integrated Excel Workbook from Excel

You publish a workbook by clicking a button on the Oracle ADF tab and specifying values in the dialogs that appear, or by using the command-line publish tool. You can use the command line publish tool to publish a workbook from your Fusion web application.

Before you begin:

It may be helpful to have an understanding about how to publish your integrated Excel workbook. For more information, see Section 14.3, "Publishing Your Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 14.1.2, "Additional Functionality for Deploying Your Integrated Excel Workbook."

To publish a workbook from Excel:

  1. Open the integrated Excel workbook.

  2. Ensure that the ApplicationHomeFolder and WebPagesFolder properties in the Edit Workbook Properties dialog are correct. If these properties are not set, ADF Desktop Integration prompts you to set them when you publish the integrated Excel workbook.

    For more information, see Section 4.2.2, "How to Configure a New Integrated Excel Workbook."

  3. In the Oracle ADF tab, click the Publish button.

  4. Specify the directory and file name for the published workbook in the Publish Workbook dialog that appears, as shown in Figure 14-1. The directory and file name that you specify for the published workbook must be different from the directory and file name for the design time workbook.

  5. Click Save to save changes.


Note:

ADF Desktop Integration is not compatible with the Excel's Mark as Final feature. If this feature is used with an integrated workbook, multiple unexpected errors may occur.

14.3.2 How to Publish an Integrated Excel Workbook Using the Command Line Publish Tool

The publish tool is run from the command line, and is available in the MW_HOME\jdeveloper\adfdi\bin\excel\tools\publish directory as publish-workbook.exe. Before you run the publish tool, open the source integrated Excel workbook and ensure that the ApplicationHomeFolder and WebPagesFolder properties in the Edit Workbook Properties dialog are correct.


Note:

You cannot publish a workbook that is already published, or is in runtime mode.

Before you begin:

It may be helpful to have an understanding about how to publish your integrated Excel workbook. For more information, see Section 14.3, "Publishing Your Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 14.1.2, "Additional Functionality for Deploying Your Integrated Excel Workbook."

Now, navigate to MW_HOME\jdeveloper\adfdi\bin\excel\tools\publish directory and run the publish tool using the following syntax:

publish-workbook -workbook (-w) <source-workbook-path> -out (-o) <destination-workbook-path>

where source-workbook-path is the full path of the source workbook, and destination-workbook-path is the full path where the published workbook is saved. Note that the destination workbook cannot have the same name as the source, even if the workbook paths are different.

For example:

publish-workbook -workbook D:\Application1\Project1\ViewController\src\oracle\foddemo\masterpricelist\excel\workbook-src.xlsx -out D:\Application1\Project1\ViewController\public_html\excel\published\workbook.xlsx


Tip:

For more information about the arguments required by the publish tool, run the following command:

publish-workbook -help (-h)


After publishing the integrated Excel workbook successfully, the publish tool displays a success message. If there is any error while publishing the workbook, the publish tool aborts the process and the error messages are displayed on the command line console.

If you are using the command line publish tool, note that by default the publish tool logs messages to the command line console at information level.

Using the Publish Tool with ANT

You can create ANT scripts to run the publish tool from JDeveloper when you build your Fusion web application. You can use either of the following methods to run the utility using ANT:

  • Generate an ANT build script for the project and add a target to run the workbook command line publish tool

  • Generate or create a separate ANT build script for running the workbook command line publish tool

A sample ANT build script (publish-workbook.xml) to run the publish tool is available in the MW_HOME\jdeveloper\adfdi\bin\excel\samples directory. The sample ANT script demonstrates the invocation of the command-line workbook publishing tool.

14.3.3 What Happens When You Publish an Integrated Excel Workbook

When you click the Publish button in design mode, ADF Desktop Integration performs the following actions:

  1. Validates the mandatory workbook settings.

  2. Updates the client registry. For more information, see Section 11.3, "Checking the Integrity of an Integrated Excel Workbook's Metadata."

  3. Creates the published workbook with the specified file name in the specified directory.

  4. Clears the ApplicationHomeFolder, WebAppRoot, and WebPagesFolder properties from the workbook settings of the published workbook.

  5. Removes binding expressions that are visible in the worksheet while the workbook is in design mode.

  6. Changes the mode of the workbook to runtime mode.

14.4 Deploying a Published Workbook with Your Fusion Web Application

Add the integrated Excel workbook to the JDeveloper project for your Fusion web application if it is not packaged with the other files that constitute your JDeveloper project. This makes sure that the Excel workbooks you integrate with your Fusion web application get deployed when you deploy your finalized Fusion web application. For example, the Master Price List module stores the Excel workbooks that it integrates at the following location:

<FOD_HOME>\MasterPriceList\ViewController\src\oracle\foddemo\masterpricelist\excel\excel

where <FOD_HOME> is the installation directory for the Fusion Order Demo application.

After you decide on a location to store your integrated Excel workbooks, you can configure web pages in your Fusion web application allowing end users to access the integrated Excel workbooks. For example, Figure 14-2 shows Internet Explorer's File Download dialog, which was invoked by clicking the Excel > Edit Using Live Spreadsheet menu options on the PriceListSummary.jspx page displayed by the Master Price List module.

Figure 14-2 Invoking an Integrated Excel Workbook from a Fusion Web Application

Invoking a Excel Workbook from a Fusion Web Application

To enable the functionality illustrated in Figure 14-2, the HTTP filter parameters for your Fusion web application must be configured to recognize Excel workbooks. JDeveloper automatically configures these parameters for you ADF Desktop Integration is enabled in the Fusion web application. If you want to manually configure the HTTP filter parameters, see Appendix E, "ADF Desktop Integration Settings in the Web Application Deployment Descriptor."

After you have configured the HTTP filter for your Fusion web application, you configure the web pages that the Fusion web application displays to end users to allow them to invoke Excel workbooks. A basic method of invoking an Excel workbook that you have integrated with a Fusion web application is to provide a hyperlink that invokes the workbook. For example, you could write the following HTML in a web page:

<a href="/excel/EditPriceList.xlsx">Open the Master Price List in Excel</a>

where excel is a subdirectory of the directory specified by the WebPagesFolder workbook property and EditPriceList.xlsx is the Excel workbook that the end user invokes.

You can provide functionality that allows end users to invoke Excel workbooks from buttons, lists and ribbon command buttons. The following list provides some examples:

  • Button

    Display a button on the web page that, when clicked, invokes the integrated Excel workbook.

  • Selection list

    Use the ADF Faces selectOneChoice component with a button to invoke an integrated Excel workbook.

  • Menu

    Use the ADF Faces goMenuItem component.

    The View and Query Using Live Spreadsheet menu, as illustrated in Figure 14-2, uses the goMenuItem component. The PriceListSummary.jspx page displays this menu. The following entry appears in the PriceListSummary.jspx page of the Master Price List module and demonstrates the goMenuItem component:

    <af:goMenuItem id="goReadOnly"
    textAndAccessKey="#{res['pls.productList.menu.lsr.label']}"
    destination="/excel/published/ReadOnlyPriceList.xlsx"/>
    

For more information about creating web pages for a Fusion web application, see the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework.

14.5 Passing Parameter Values from a Fusion Web Application Page to a Workbook

You can configure a page in your Fusion web application to pass parameter values to an integrated Excel workbook when the end user downloads the workbook from the page. For example, if the end user attempts to download a workbook from a page that displays a list of products, the list of products that appears in the workbook corresponds to the list of products displayed in the page when the end user invoked the download. Subsequent changes that the end user makes to data in one location (the worksheet or the Fusion web application's page) do not affect data in the other location.

To configure this functionality, you must:

  • Verify that the HTTP filter is configured to allow end users to download integrated Excel workbooks from the Fusion web application. By default, JDeveloper configures the HTTP filter with appropriate values when you enable ADF Desktop Integration in the Oracle ADF Desktop Integration project. To verify the parameter values of the HTTP filter, see Section E.2, "Configuring the ADF Desktop Integration Excel Download Filter."

  • Configure the page in your Fusion web application from which the end user downloads the integrated Excel workbook so that it passes its parameters through URL arguments to the integrated Excel workbook when the end user downloads it.

  • Configure the page definition file associated with the worksheet in the integrated Excel workbook so that the worksheet is initialized with the parameters from the page in the Fusion web application from which the end user downloads the workbook.

  • Configure workbook and worksheet properties in the integrated Excel workbook that end users download so that the workbook contains the parameters from the page in the Fusion web application from which the end invokes download.

14.5.1 How to Configure the Fusion Web Application's Page to Pass Parameters

You insert an <af:goLink> tag and specify property values for it that reference the integrated Excel workbook the end user downloads and the values to download. You also specify the commands on the page that, when invoked, require the Fusion web application to refresh the values referenced by the <af:goLink> tag and its property values.

Before you begin:

It may be helpful to have an understanding of how to pass parameter values from the Fusion web application to the integrated Excel workbook. For more information, see Section 14.5, "Passing Parameter Values from a Fusion Web Application Page to a Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 14.1.2, "Additional Functionality for Deploying Your Integrated Excel Workbook."

To configure the page in the Fusion web application:

  1. In JDeveloper, insert the af:goLink tag into the page from which the end user downloads the integrated Excel workbook.

  2. In the Structure window, right-click the af:goLink node and choose Go to Properties.

  3. Expand the Common section and set values for the properties, as described in Table 14-1.

    Table 14-1 Properties for af:goLink Tag

    PropertyValue

    Text

    Write the text that appears to end users at runtime.

    For example, write text such as the following to appear at runtime:

    Download to Excel

    Destination

    Invoke the expression builder to write an EL expression that specifies the integrated Excel workbook and the values to download as a URL argument:

    For example, write an EL expression such as the following:

    "/excel/workbook.xlsx?productName=#{bindings.productName.attributeValue}"

    Note that the runtime URL-encoded value of the EL expression to the right of ? must be less than 2048 bytes. If the runtime value exceeds 2048 bytes, the integrated Excel workbook downloads the URL arguments in the first 2048 bytes. Subsequent URL arguments do not get downloaded to the integrated Excel workbook. Instead, the Fusion web application writes log entries for these URL arguments identifying them as having not been downloaded.

    For example, the runtime URL-encoded value of productName=#{bindings.productName.attributeValue} must be less than 2048 bytes.

    Also note that if the URL contains more than 256 characters, an exception is raised when the end user downloads and opens the integrated Excel workbook without saving it. To resolve this problem, you must limit your URL length to 256 characters, or instruct the end user to save the workbook before opening it.


  4. Optionally, expand the Behavior section and specify component IDs for the partialTriggers property that, when invoked, update the values of the af:goLink tag and its Destination property.

    For example, if you have navigation buttons with the IDs NextButton, PreviousButton, FirstButton, and LastButton, specify them as follows:

    :NextButton :PreviousButton :FirstButton :LastButton

  5. Save the page.

    The following example shows the entries that JDeveloper generates in a JSF page using the examples in this procedure:

    <af:goLink text="Download to Excel"
    destination="/excel/workbook.xlsx?productName=#{bindings.productName.attributeValue}"
    partialTriggers=":NextButton :PreviousButton :FirstButton :LastButton"/>
    

14.5.2 How to Configure the Page Definition File for the Worksheet to Receive Parameters

You configure the page definition file associated with the worksheet in the integrated Excel workbook as follows:

  • Add one or more parameter elements that initialize the worksheet with the values specified by the workbook Parameters property that you configure in Section 14.5.3, "How to Configure Parameters Properties in the Integrated Excel Workbook."

    The following example shows a parameter element in a page definition file that is associated with a worksheet in an integrated Excel workbook:

    <parameters>
        <parameter id="ProductNameParam" />
    </parameters>
    
  • Add an invokeAction and a method action binding so that the page definition file associated with the worksheet initializes correctly.


    Note:

    When a page definition file that has an invokeAction is used with an integrated Excel workbook, the method that is used in the invokeAction may be invoked multiple times. If needed, the method should be coded to handle these multiple invocations. The Refresh and RefreshCondition properties of the <invokeAction> element can also be configured to manage the frequency of invocation.

    The following example shows the initializeProductTable invokeAction invoking the filterByProductName method action binding. The invokeAction is refreshed only when a value for ProductNameParam is supplied.

    <executables>
        <invokeAction Binds="filterByProductName" id="initializeProductTable"
                      Refresh="deferred"
                      RefreshCondition="${bindings.ProductNameParam != null}"/>
    ...
    </executables>
    

    The method action binding invokes a view object method (filterByProductName). The view object method takes a single String argument (ProductNameArg) that references the value of ProductNameParam.

    <bindings>
        <methodAction id="filterByProductName" RequiresUpdateModel="true"
                      Action="invokeMethod" MethodName="filterByProductName"
                      IsViewObjectMethod="true" DataControl="AppModuleDataControl"
                      InstanceName="AppModuleDataControl.ProductVO1">
          <NamedData NDName="ProductNameArg" NDValue="${bindings.ProductNameParam}"
                      NDType="java.lang.String"/>
        </methodAction>
    . . .
    </bindings>
    

For more information about configuring a page definition file, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

14.5.3 How to Configure Parameters Properties in the Integrated Excel Workbook

You configure the workbook Parameters property and the worksheet Parameters property so that the integrated Excel workbook that the end user downloads from the Fusion web application receives parameter values included in the query string of the workbook download URL.

Before you begin:

It may be helpful to have an understanding of how to pass parameter values from the Fusion web application to the integrated Excel workbook. For more information, see Section 14.5, "Passing Parameter Values from a Fusion Web Application Page to a Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see %fSection 14.1.2, "Additional Functionality for Deploying Your Integrated Excel Workbook."

To configure the workbook Parameters property:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. Click the ellipsis button (...) beside the input field for Parameters to invoke the Edit Parameters dialog.

  4. Click Add to add a new workbook initialization parameter and configure its properties as follows:

  5. Repeat Step 4 as necessary to add other workbook initialization parameters.

  6. Click OK.

    For more information about the workbook Parameters property, see Table A-18.

To configure the worksheet Parameters property:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. Click the ellipsis button (...) beside the input field for Parameters to invoke the Edit Parameters dialog.

  4. Click Add to add a new worksheet parameter and configure it as in Figure 14-4:

    • (Optional) In the Annotation field, enter a description of the worksheet parameter.

    • In the Parameter field, specify a parameter element that you added to the page definition file associated with the worksheet, as described in Section 14.5.2, "How to Configure the Page Definition File for the Worksheet to Receive Parameters."

    • In the Value field, write an EL expression that references the value of the Parameter property you specified for the workbook initialization parameter (workbook Parameters array). Use the following syntax when writing the EL expression:

      #{workbook.params.parameter}

      where parameter references the value of the Parameter property you specified for the workbook initialization parameter.

    Figure 14-4 Worksheet Parameters

    Worksheet Parameters dialog
  5. Repeat Step 4 as necessary to add other workbook initialization parameters.

  6. Click OK.

    For more information about the worksheet Parameters property, see Table A-19.

By default, the workbook parameters are not sent every time the workbook connects to the server to request metadata, the end user logs out, or the session expires. If required, you can configure the workbook to send the initialization parameters by configuring the SendParameters property.

To configure the worksheet SendParameters property:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. In the property inspector, set the value of SendParameters as shown in the following table and Figure 14-4:

    Table 14-2 SendParameters Property

    Set this property to...This value...

    SendParameters

    True to send workbook parameters when the workbook connects to the server to request metadata or data. When set to True, parameters are sent every time when the metadata is requested and the first time when data is requested, during each user session. False is the default value.

    For more information, see Section 15.2, "Restore Server Data Context Between Sessions."


  4. Click OK.

14.5.4 What Happens at Runtime: How Parameters Are Passed from a Fusion Web Application to the Integrated Excel Workbook

When the end user downloads the integrated Excel workbook from the Fusion web application, the af:goLink tag is evaluated and the current product name is captured and included on the URL. The adfdiExcelDownload filter embeds the names and values of all the parameters from the URL into the downloaded integrated Excel workbook.

After downloading the workbook, when the end user opens it for the first time, the active worksheet of the integrated Excel workbook is initialized. The initialization process includes fetching metadata from the web application. As part of retrieving the worksheet metadata, the stored workbook parameters (if any) are sent to the ADF Desktop Integration remote servlet and are available for application logic such as <invokeAction> executables. Specifically, the parameters are set into BindingContainer DCParameters before the binding container is refreshed. The action set in the worksheet Startup event is also executed during initialization. After initialization, the initialization status for each worksheet is recorded when the integrated Excel workbook is saved to disk.

After the integrated Excel workbook has been saved, closed, and reopened , the first-time initialization is skipped for any worksheets that were previously initialized. If workbook parameters were captured when the integrated Excel workbook was first downloaded, and those parameters are required to set up server context, then the Worksheet.ServerContext.SendParameters property should be set to True. When the SendParameters property is True, workbook parameters are sent on every request for metadata, and also on the first request for data in each user session.

To reset the initialization state for all worksheets in the workbook, invoke the ClearAllData action. For more information about the ClearAllData action, see Table A-17.


Note:

Parameter values passed to the server might reset when a web dialog is invoked in an action set where the ShareFrame property is True. Custom code, which uses the parameters and requires that values be maintained across the invocation of a web dialog, should ensure that those values are saved in the user session data structures.

PK I!PK.[EOEBPS/work_ui_components.htm Working with ADF Desktop Integration Form-Type Components

6 Working with ADF Desktop Integration Form-Type Components

This chapter describes how you can insert and configure components that ADF Desktop Integration provides to allow end users to manage data retrieved from a Fusion web application.

This chapter includes the following sections:

6.1 About ADF Desktop Integration Form-Type Components

The ADF Desktop Integration From-type components allow end users to manage data retrieved from the Fusion web application in the integrated Excel workbook. Rather than expose an ADF Form component in the components palette described in Section 5.5, "Using the Components Palette," ADF Desktop Integration uses the following components to create form-type functionality in an integrated Excel workbook:

  • ADF Input Text

  • ADF Output Text

  • ADF Label

  • ADF List of Values

  • ADF Button

Figure 6-1 shows these components.

Figure 6-1 ADF Desktop Integration Form-Type Components

ADF Desktop Integration Form-type Components

Note:

ADF Desktop Integration does not support components inserted in a merged cell.

6.1.1 ADF Desktop Integration Form-Type Components Use Cases and Examples

The ADF Desktop Integration Form-type components are used to build forms in the integrated Excel workbook for user input, and output from the Fusion web application. As shown in Figure 6-2, the form-type components used in Search area of EditPriceList-DT.xlsx enable end users to search for a product, and display result in a ADF Table component.

Figure 6-2 Search Form Using ADF Desktop Integration Form-Type Components

Search form using form-type components

6.1.2 Additional Functionality for ADF Desktop Integration Form-Type Components

After you have added a component to the worksheet, you may find that you need to add functionality such as responding to events or end user actions. Following are links to other functionality that form components can use:

6.2 Inserting an ADF Button Component

The ADF Button component renders a button in the Excel worksheet at runtime. End users click this button to invoke one or more actions specified by the ClickActionSet group of properties.

The LowerRightCorner and Position properties determine the area that the button occupies on the Excel worksheet at runtime.

Figure 6-3 shows an ADF Button component with its property inspector in the foreground. The property inspector for the button is in the foreground. When an end user clicks the button at runtime, it invokes the array of actions specified by ClickActionSet.

Figure 6-3 ADF Button Component in Design Mode

The ADF Button component

For more information about the properties of the ADF Button component, see Section A.8, "ADF Button Component Properties."

To insert an ADF Button component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet where you want to anchor the component.

  3. In the components palette, select ADF Button and click Insert Component. Alternatively, in the Oracle ADF tab, select ADF Button from the Insert Component dropdown list.

  4. Configure properties in the property inspector to determine the actions the component invokes at runtime in addition to the appearance, design, and layout of the component. Table 6-1 outlines some properties you must specify values for, and provides links to additional information.

    Table 6-1 ADF Button component properties

    For this property...Specify...

    Label

    A string or an EL expression that resolves to a label at runtime to indicate the purpose of the ADF Button component. For example, the Label property for the Advanced Search button in the runtime EditPriceList-DT.xlsx workbook of the Master Price List module has the following value in design mode:

    #{res['excel.advSearchButton.label']}

    This EL expression references a string key in the res resource bundle. For more information about resource bundles, see Section 10.2, "Using Resource Bundles in an Integrated Excel Workbook." For more information about using labels in integrated Excel workbooks, see Section 9.4, "Using Labels in an Integrated Excel Workbook."

    If you want to include the ampersand (&) character in the label, use &&. A single & character acts as a special character and is not displayed in the label.

    ClickActionSet

    Specify one or more actions in the Actions array of the ClickActionSet that the end user invokes when he or she clicks the ADF Button component. For more information about action sets, see Section 8.2, "Using Action Sets."


  5. Click OK.

    Figure 6-4 shows an example of the ADF Button component (in red box) at runtime.

    Figure 6-4 ADF Button Component at Runtime

    ADF Button component at runtime

Notes:

  • If you change the view mode of the Excel worksheet to the Page Layout or Page Break mode, the ADF Button components may be rendered in an unexpected position. You must return back to Normal mode without saving the workbook, and then Run and stop the integrated Excel workbook to render the buttons to their original positions.

  • You can modify the properties of the component at a later time by selecting the cell in the worksheet that anchors the component and then displaying the property inspector.

  • The ADF Button components are active at 100% zoom only, and are disabled when the end user zooms in or out on an integrated Excel worksheet.



Tip:

In design mode, you can click the button, or press the spacebar when the button is in focus, to open the property inspector. The right-click context menu is disabled for a button.

If you want to add navigation buttons in your integrated Excel workbook to navigate to previous or next record, see Section 6.9, "Using Navigation Buttons."

6.3 Inserting an ADF Label Component

The ADF Label component is a component that you can insert into the active worksheet to display a static string value. You specify a value in the input field for Label in the property inspector or alternatively you invoke the expression builder to write an EL expression that resolves to a string at runtime. The retrieved string can be defined in a resource bundle or in an attribute control hint for an entity or view object. For example, the following EL expression resolves to the value of a string key defined in a resource bundle at runtime:

#{bindings.ProductList.label}

The value that you specify for the Label property in an ADF Label component or other Oracle ADF components is evaluated after the worksheet that hosts the Oracle ADF component is initialized (opened for the first time).

You can configure a number of properties for the component, such as style and position, in the worksheet using the property inspector.

Figure 6-5 shows an ADF Label component with its property inspector in the foreground. The ADF Label component references an EL expression that resolves to the value of a string key defined in the res resource bundle at runtime.

Figure 6-5 ADF Label Component in Design Mode

The ADF Label Component

To insert an ADF Label component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet where you want to anchor the component.

  3. In the components palette, select ADF Label and click Insert Component. Alternatively, in the Oracle ADF tab, select ADF Label from the Insert Component dropdown list

  4. Configure properties in the property inspector to determine the appearance, design, and layout of the component.

  5. Click OK.

Figure 6-6 shows an example of the ADF Label component (in red box) at runtime.

Figure 6-6 ADF Label Component at Runtime

ADF Label component at runtime

Note:

You can modify the properties of the component at a later time by selecting the cell in the worksheet that anchors the component and then displaying the property inspector. You can also right-click in the cell and choose Edit ADF Component Properties from the context menu to open the property inspector.

For more information about using labels in an integrated Excel workbook, see Section 9.4, "Using Labels in an Integrated Excel Workbook."

6.4 Inserting an ADF Input Text Component

The ADF Input Text component is a component that you can insert into the active worksheet using the components palette. The active cell in the worksheet when you insert the component displays the current value from the component's binding after the worksheet DownSync action is invoked. End users can edit this value at runtime. You configure the worksheet UpSync action to transfer changes end users make to the value back to the Fusion web application and a Commit action binding to commit the changes in the Fusion web application.

You can configure a number of properties for the component, such as its position, style and behavior when a user double-clicks the cell (DoubleClickActionSet properties), in the worksheet using the property inspector. For more information about DoubleClickActionSet, see Section 8.2, "Using Action Sets."

The ADF Table component can invoke this component as a subcomponent when you set values for the ADF Table component column's InsertComponent or UpdateComponent properties. In this context, the ADF Input Text component enables the end user to input data into the ADF Table component. For more information, see Section 7.5, "Configuring an ADF Table Component to Insert Data."

Figure 6-7 shows an ADF Input Text component with its property inspector in the foreground. The ADF Input Text component binds to the searchTerm attribute binding in the Master Price List module of the Fusion Order Demo application. The end user enters a search term in this component and then uses an ADF Button component to invoke a search.

Figure 6-7 ADF Input Text Component in Design Mode

The Property Inspector for an Input Text component.

To insert an ADF Input Text component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet where you want to anchor the component.

  3. In the components palette, select ADF Input Text and click Insert Component. Alternatively, in the Oracle ADF tab, select ADF InputText from the Insert Component dropdown list

  4. Configure properties in the property inspector to determine the appearance, layout, and behavior of the component. Table 6-2 outlines some properties that you must specify values for. For information about the component's other properties, see Section A.2, "ADF Input Text Component Properties."

    Table 6-2 ADF Input Text component properties

    For this property...Specify...

    InputText.Value

    An EL expression for the Value property to determine what binding the component references.

    InputText.ReadOnly

    An EL expression that resolves to False so that changes the end user makes are uploaded. Write an EL expression that resolves to True if you want the component to ignore changes. False is the default value.


  5. Click OK.


    Note:

    You can modify the properties of the component at a later time by selecting the cell in the worksheet that anchors the component and then displaying the property inspector. You can also right-click in the cell and choose Edit ADF Component Properties from the context menu to open the property inspector.

Figure 6-8 shows an example of the ADF Input Text component (in red box) at runtime.

Figure 6-8 ADF Input Text Component at Runtime

ADF Input Text component at runetime.

6.5 Inserting an ADF Output Text Component

The ADF Output Text component is a component that you can insert into the active worksheet using the components palette. The active cell in the worksheet when you insert the component displays the current value from the component's binding after you invoke the worksheet DownSync action. The value the component displays is read-only. Changes that the end user makes to the value in the cell that anchors the component are ignored when changes are sent to the Fusion web application.

This component can also serve as a subcomponent for the ADF Table and ADF Read-only Table components. Columns in the ADF Table and ADF Read-only Table components can be configured to use the ADF Output Text component.

You can configure a number of properties for the component such as style, behavior when a user double-clicks the cell (DoubleClickActionSet properties), and position, in the worksheet using the property inspector.

Figure 6-9 shows an ADF Output Text component with its property inspector in the foreground. The ADF Output Text component references an ADF Table component in the Master Price List module of the Fusion Order Demo application. At runtime, the cell that anchors the ADF Output Text component displays any errors returned by the ADF Table component.

Figure 6-9 ADF Output Text Component in Design Mode

The ADF Output Text Component

To insert an ADF Output Text component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet where you want to anchor the component.

  3. In the components palette, select ADF Output Text, and click Insert Component. Alternatively, in the Oracle ADF tab, select ADF OutputText from the Insert Component dropdown list

  4. Configure properties in the property inspector to determine the appearance, layout, and behavior of the component.

    For example, you must write or specify an EL expression for the Value property to determine what binding the ADF Output Text component references. For more information about the values that you specify for the properties of the ADF Output Text component, see Section A.3, "ADF Output Text Component Properties."

  5. Click OK.


    Note:

    You can modify the properties of the component at a later time by selecting the cell in the worksheet that anchors the component and then displaying the property inspector. You can also right-click in the cell and choose Edit ADF Component Properties from the context menu to open the property inspector.

Figure 6-10 shows an example of the ADF Output Text component (in red box) at runtime.

Figure 6-10 ADF Output Text Component at Runtime

ADF Output Text component at runtime

6.6 Inserting an ADF List of Values Component

The ADF List of Values component is a component that displays a dropdown menu in the Excel worksheet cell at runtime. It displays a maximum of 250 values at runtime. You can insert the List of Values component into a cell in the Excel worksheet.

You must specify a value for the ListID property. The ListID property references the list binding which populates the dropdown menu with a list of values at runtime after you invoke the worksheet DownSync action.

Figure 6-11 shows an ADF List of Values component with its property inspector in the foreground. The ADF List of Values component references a list binding (ProductList) that populates a dropdown menu in the Excel worksheet at runtime.


Note:

You can display a dropdown menu in an ADF Table component's column by selecting TreeNodeList or ModelDrivenColumnComponent as the subcomponent to create when you specify a value for the TableColumn array's InsertComponent property. For more information, see Section 7.13, "Creating a List of Values in an ADF Table Component Column."

Figure 6-11 ADF List of Values Component

ADF List of Values Component

To insert an ADF List of Values component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet where you want to anchor the component.

  3. In the components palette, select ADF List of Values and click Insert Component. Alternatively, in the Oracle ADF tab, select ADF List of Values from the Insert Component dropdown list

  4. Invoke the binding ID picker by clicking the ellipsis button (...) beside the input field for the ListID property and select a list binding that the page definition file exposes.

  5. Configure other properties in the property inspector to determine the appearance, design, and layout of the component. For information about ADF List of Values component properties, see Section A.5, "ADF List of Values Component Properties."

  6. Click OK.


    Note:

    You can modify the properties of the component at a later time by selecting the cell in the worksheet that anchors the component and then displaying the property inspector. You can also right-click in the cell and choose Edit ADF Component Properties from the context menu to open the property inspector.

6.7 Displaying Output from a Managed Bean in an ADF Component

You can configure an ADF component to display output from a managed bean in your Fusion web application. Information about how to use managed beans in a Fusion web application can be found in the "Using a Managed Bean in a Fusion Web Application" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework. You reference a managed bean in an integrated Excel workbook through an EL expression. Add a method action binding to the page definition file you associate with the Excel worksheet to retrieve the value of the managed bean and assign it to an attribute binding. Use an EL expression to retrieve the value of the attribute binding at runtime.

6.7.1 How to Display Output from a Managed Bean

You write an EL expression for a property that supports EL expressions (for example, the Label property).

Before you begin:

It may be helpful to have an understanding of managed beans. For more information, see Section 6.7, "Displaying Output from a Managed Bean in an ADF Component."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 6.1.2, "Additional Functionality for ADF Desktop Integration Form-Type Components."

To display output from a managed bean:

  1. Open the integrated Excel workbook.

  2. Select the ADF component to display the output from the managed bean, and open its property inspector.

    Figure 6-12 shows an example from the EditPriceList-DT.xlsx workbook in the Master Price List module where an ADF Label component is configured to display the output from an attribute binding that has its value populated by an action binding.

    Figure 6-12 ADF Label Component That Displays Output from a Managed Bean at Runtime

    ADF Label component displaying output from a managed bean
  3. Write an EL expression that gets the output from a managed bean at runtime.

    The example in Figure 6-12 shows an EL expression that retrieves the value of a string key (excel.connectionPrefix) from the res resource bundle and the value of the loggedInUser attribute binding. This attribute binding references the output from the managed bean.

  4. Click OK.

6.7.2 What Happens at Runtime: How an ADF Component Displays Output from a Managed Bean

The method action binding retrieves values from the managed bean and populates the attribute binding. The EL expression that you write retrieves the value from the attribute binding and displays it to the end user through the ADF component that you configured to display output. For example, the ADF Label component shown in design mode in Figure 6-13 displays a string similar to the following at runtime:

Connected as sking

Figure 6-13 Output from a Managed Bean at Runtime

Output from a Managed Bean at Runtime

In Figure 6-13, sking is the user name of the user that is logged on to the Fusion web application through the integrated Excel workbook.

6.8 Displaying Concatenated or Calculated Data in Components

The ADF Desktop Integration module supports EL expressions within components that allow a single component to display data that is based on a calculation or concatenation of multiple binding expressions.

6.8.1 How to Configure a Component to Display Calculated Data

You write an EL expression for the Value property of an Input Text or Output Text component.

Figure 6-14 shows an EL expression example from the EditPriceList-DT.xlsx workbook in the Master Price List module where an ADF Output Text component of a column is configured to display the margin between the List Price and Cost Price columns.

Figure 6-14 ADF Output Text Component That Displays Calculated Data

Dialog showing a EL expression for calculation

Before you begin:

It may be helpful to have an understanding of how to display concatenated or calculated data in ADF components. For more information, see Section 6.8, "Displaying Concatenated or Calculated Data in Components."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 6.1.2, "Additional Functionality for ADF Desktop Integration Form-Type Components."

To create an EL expression to display calculated data

  1. Open the integrated Excel workbook.

  2. Select the ADF Input Text or ADF Output Text component to display calculated data.

  3. Open the property inspector and click the ellipses button (...) of the Value property.

  4. Write an EL expression that gets the output from two, or more, expressions.

    Example 6-1 shows an EL expression that calculates the difference between the values of List Price and Cost Price columns of an item, and then divides it with value of Cost Price column to generate a margin.

    Example 6-1 An EL Expression for Calculated Data

    =(("#{row.bindings.ListPrice.inputValue}"-"#{row.bindings.CostPrice.inputValue}")/"#{row.bindings.CostPrice.inputValue}")
    
  5. Click OK.

For more information about EL expressions, see Appendix B, "ADF Desktop Integration EL Expressions."


Note:

If the Value property of an ADF Input Text component contains a formula, the ADF Input Text component becomes read-only at runtime regardless of the value of the ReadOnly property.

6.9 Using Navigation Buttons

You can create navigation buttons (Next, Previous, First, and Last) to navigate from one record to another as shown in Figure 6-15. If the end user changes a record's data before navigating to another record, you can choose to save those changes or ignore them.

Figure 6-15 Navigation Buttons in an Integrated Excel Workbook

Using navigation buttons in a workbook.

To save changes before navigating to another record, define the action sets of the button in the following order:

  1. Worksheet.UpSync

  2. Commit

  3. Navigation action (for example, Next)

  4. Worksheet.DownSync


Note:

If you omit the Commit action from the action set, any pending changes to multiple records are lost when the end user's web application session ends.

To ignore changes before navigating to another record, define the action sets of the button in the following order:

  1. Navigation action (for example, Next)

  2. Worksheet.DownSync


Note:

If you define button actions to ignore changes, then it is the end user's responsibility to save changes before navigating to another record.

PKcPK.[EOEBPS/add_security.htm Securing Your Integrated Excel Workbook

11 Securing Your Integrated Excel Workbook

This chapter provides information about how to secure your integrated Excel workbook with a Fusion web application by providing authentication and authorization capabilities in an authenticated session. The chapter describes how to access integrated Excel workbooks in an authenticated and non authenticated session. It also describes issues that you should be aware of so that you can secure your Excel workbook.

It is recommended that you configure ADF Security for the Fusion web application before you deploy the integrated Excel workbook; however, it is not required. For information about ADF Security, see the “Enabling ADF Security in a Fusion Web Application” chapter in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

This chapter includes the following sections:

11.1 About Security In Your Integrated Excel Workbook

If you are using a Fusion web application that does not enforce authentication, then the integrated Excel workbook verifies and creates a valid user session before connecting to the Fusion web application and downloading data. The session that is established is used for each and every data transfer between the integrated Excel workbook and Fusion web application. The session is also used for web pages referenced from the integrated Excel workbook.

In a Fusion web application that is enforcing authentication, the integrated Excel workbook ensures that a valid, authenticated user session is established before transferring data to or from the web application.

For both authenticated and non-authenticated Fusion web applications, ADF Desktop Integration relies on the establishment of cookie-based sessions. With no authentication mechanism in place, your Fusion web application is not completely safe. Hence, it is recommended that you enable ADF Security in your Fusion web application before you deploy your web application with integrated Excel workbooks.

If you are using a secure Fusion web application configured with ADF Security, you are not required to configure your integrated Excel workbook for authentication. When you open the integrated Excel workbook, ADF Desktop Integration detects if the Fusion web application, that the workbook runs against, is a secure application and enforces authentication automatically.

11.1.1 Integrated Excel Workbook Security Use Cases and Examples

When you open the integrated Excel workbook of a secure Fusion web application, a Login dialog opens and prompts you to connect to the Fusion web application, as shown in Figure 11-1. Note that the Login dialog also appears when the Fusion web application is not secure.

Figure 11-1 Dialog to verify Connection

Login dialog box

If you click Yes to connect, another dialog prompts you to enter the credentials, as shown by the example in Figure 11-2.

Figure 11-2 Dialog to verify End User's Credentials

Dialog to verify End User’s Credentials

The dialog that is shown in Figure 11-2 might be different as it depends on how the Fusion web application is configured to enforce authentication. For example, if Form-based authentication is being used by the web application, then the end-user will see a browser dialog with a web page with fields for user name and password.

11.1.2 Additional Functionality for Integrated Excel Workbook in a Secure Fusion Web Application

After you have secured your integrated Excel workbook, you may find that you need to add additional functionality for your workbook. Following are links to other functionalities that you can use:

11.2 Authenticating the Excel Workbook User

The integration of an Excel workbook with a secure Fusion web application requires an authenticated web session established between the integrated Excel workbook and the server that hosts the Fusion web application. ADF Security determines the mechanism used to authenticate the user.

If the end user opens an Excel workbook without a valid authenticated session, a login mechanism is invoked to authenticate the end user.

11.2.1 What Happens at Runtime: How the Login Method Is Invoked

After the login method is invoked, a new session between the integrated Excel workbook and the Fusion web application is created, and a modal dialog appears that contains a web browser control. This web browser control displays whatever login mechanism the Fusion web application uses. For example, if the Fusion web application uses HTTP Basic Authentication, the web browser control displays the simple dialog shown in Figure 11-3.

Figure 11-3 Dialog That Appears When a Fusion Web Application Uses Basic Authentication

Basic authentication dialog box

The end user enters user credentials and, assuming these are valid, an authentication session is created and assigned to the client (the web browser control hosted by the Excel workbook).


Note:

If the Login method is invoked when a session has already been established, it first invokes the Logout action internally to free that session.

11.2.2 What Happens at Runtime: How the Logout Method Is Invoked

After the logout method is invoked, a dialog appears informing users that they have logged out of the current session. The user is automatically logged out when the workbook is closed, or when the Clear All Data option is selected from the runtime custom tab in Excel ribbon.

Figure 11-4 Dialog That Appears When a User Logs Out

Logout confirmation dialog box

After logging out, the user must log in again to upload or download data.

If two or more workbooks are open (in test or runtime mode) with same credentials, closing one workbook does not initiate the logout mechanism. The user continues to stay logged in and may continue to work on remaining open workbooks, and can open the closed workbook without being asked for credentials again. The user is logged out when all workbooks, requiring same credentials, are closed.

11.3 Checking the Integrity of an Integrated Excel Workbook's Metadata

ADF Desktop Integration provides a mechanism to verify that the metadata it uses to integrate an Excel workbook with a Fusion web application is not tampered with after you publish the Excel workbook for end users. It generates a hash code value and inserts the value into the ADF Desktop Integration client registry file (adfdi-client-registry.xml) that it also creates when you publish the integrated Excel workbook as described in Section 14.3, "Publishing Your Integrated Excel Workbook." ADF Desktop Integration stores the adfdi-client-registry.xml file in the WEB-INF directory of the Fusion web application.

If you republish the integrated Excel workbook, ADF Desktop Integration generates a new hash code value and replaces the value in the adfdi-client-registry.xml file. ADF Desktop Integration creates the adfdi-client-registry.xml file if it does not exist.

The ApplicationHomeFolder and WebPagesFolder workbook properties allow the integrated Excel workbook to identify the location of the Fusion web application's WEB-INF directory. You must set valid values for these properties before you can publish the integrated Excel workbook and ADF Desktop Integration can generate a hash code value.

ADF Desktop Integration generates the hash code value using most of the elements in the metadata for the workbook and the value of the WorkbookID workbook property. The WorkbookID workbook property is read-only and uniquely identifies the integrated Excel workbook. You must reset the WorkbookID workbook property if you create a new integrated Excel workbook by copying an existing integrated Excel workbook. ADF Desktop Integration excludes the WebAppRoot property from the hash code calculation since its value is expected to change at runtime.

For more information about the workbook properties discussed here, see Table A-18.

11.3.1 How to Reset the Workbook ID

The value of the WorkbookID workbook property is unique to each workbook and cannot be modified by you. You can, however, reset the WorkbookID workbook property. You must do this when you create a new integrated Excel workbook by copying an existing integrated Excel workbook.

Before you begin:

It may be helpful to have an understanding of how to verify the integrity of integrated Excel workbook's metadata. For more information, see Section 11.3, "Checking the Integrity of an Integrated Excel Workbook's Metadata."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 11.1.2, "Additional Functionality for Integrated Excel Workbook in a Secure Fusion Web Application."

To reset a workbook ID:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. In the Edit Workbook Properties dialog, click the Reset WorkbookID link.

  4. Click Yes to confirm and reset the WorkbookID workbook property in the dialog that appears., as shown in Figure 11-5.

    Figure 11-5 Reset Workbook ID Dialog

    Reset Workbook ID Dialog
  5. Click OK.

11.3.2 How to Disable the Metadata Tamper-Check in the Fusion Web Application

By default, ADF Desktop Integration verifies that the metadata it uses to integrate an Excel workbook with a Fusion web application is not tampered with after you publish the Excel workbook for end users. You can disable the metadata tamper-check by configuring a parameter in the deployment descriptor file (web.xml) of the Fusion web application, although this is not recommended.

Before you begin:

It may be helpful to have an understanding of how to verify the integrity of integrated Excel workbook's metadata. For more information, see Section 11.3, "Checking the Integrity of an Integrated Excel Workbook's Metadata."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 11.1.2, "Additional Functionality for Integrated Excel Workbook in a Secure Fusion Web Application."

To disable the metadata tamper-check in the Fusion web application:

  1. Stop your Fusion web application.

  2. Open the web.xml file of your Fusion web application.

  3. Add an initialization parameter to the adfdiRemote servlet to disable the metadata tamper-check, as described in Table 11-1.

    Table 11-1 Disabling Metadata Tamper-Check

    PropertyValue

    Name

    Enter the name of the initialization parameter as follows:

    TamperingCheck.Enabled

    Value

    Set the value of TamperingCheck.Enabled to False.


    Figure 11-6 shows the web.xml editor in JDeveloper.

    Figure 11-6 Disabling the Metadata Tamper Check In JDeveloper

    Shows how to disable the metadata tamper-check in JDev
  4. Save the web.xml file.

    The web.xml file of your Fusion web application has the following entries:

    <servlet>
            <servlet-name>adfdiRemote</servlet-name>
            <servlet-class>...</servlet-class>
            <init-param>
                <param-name>TamperingCheck.Enabled</param-name>
                <param-value>False</param-value>
            </init-param>
    </servlet>
    
  5. Rebuild and restart your Fusion web application.

For more information about the web.xml file, see Appendix E, "ADF Desktop Integration Settings in the Web Application Deployment Descriptor."

11.3.3 How to Allow Missing Entries in the ADF Desktop Integration Client Registry

You can configure the metadata tamper-check so that a missing entry for the WorkbookID workbook property is allowed in the adfdi-client-registry.xml file. To do this, you configure a parameter in the deployment descriptor file (web.xml) of the Fusion web application, although this is not recommended.

Before you begin:

It may be helpful to have an understanding of how to verify the integrity of integrated Excel workbook's metadata. For more information, see Section 11.3, "Checking the Integrity of an Integrated Excel Workbook's Metadata."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 11.1.2, "Additional Functionality for Integrated Excel Workbook in a Secure Fusion Web Application."

To allow missing entries in the metadata of the Fusion web application:

  1. Stop your Fusion web application.

  2. Open the web.xml file of your Fusion web application.

  3. Add an initialization parameter to the adfdiRemote servlet to allow missing entries in the metadata as described in Table 11-2.

    Table 11-2 Allowing Missing Entries in the Metadata

    PropertyValue

    Name

    Enter the name of the initialization parameter as follows:

    TamperingCheck.AllowMissingEntries

    Value

    Set the value of TamperingCheck.AllowMissingEntries to True.


    Figure 11-7 shows the web.xml editor in JDeveloper.

    Figure 11-7 Enabling Missing Metadata Entries In JDeveloper

    Shows how to enable missing metadata entries In JDev
  4. Save the web.xml file.

    The web.xml file of your Fusion web application has the following entries:

    <servlet>
            <servlet-name>adfdiRemote</servlet-name>
            <servlet-class>...</servlet-class>
            <init-param>
                <param-name>TamperingCheck.AllowMissingEntries</param-name>
                <param-value>True</param-value>
            </init-param>
    </servlet>
    
  5. Rebuild and restart your Fusion web application.

For more information about the web.xml file, see Appendix E, "ADF Desktop Integration Settings in the Web Application Deployment Descriptor."

11.3.4 What Happens When the Metadata Tamper-Check Is Performed

At runtime, the integrated Excel workbook regenerates the metadata hash code and provides it to the Fusion web application with the first server request. If the Fusion web application cannot get a match on this hash code, it returns an error to the integrated Excel workbook. On receiving an error from the tamper check process, the integrated Excel workbook reports this failure to the end user and closes the integration framework.

11.4 What You May Need to Know About Securing an Integrated Excel Workbook

Note the following points about securing an integrated Excel workbook with a Fusion web application:

  • Data security

    If you save an Excel workbook containing data downloaded from a Fusion web application to a location, such as a network directory, where other users can access the Excel workbook, the data stored in the Excel workbook is accessible to other users.

  • Security and protection in Microsoft Excel

    Certain security and protection features that Microsoft Excel provides do not work for workbooks or worksheets that are integrated with a Fusion web application. For example, you cannot use the worksheet protection feature for a worksheet that you integrate with a Fusion web application. You can, however, use Excel's functionality to set a password on an integrated Excel workbook to prevent unauthorized users from opening or modifying it. For more information about Excel security features, see Excel's documentation.

  • Integrated Excel workbooks can be configured to cache data, as described in Section 15.2, "Restore Server Data Context Between Sessions." Make sure that you do not cache sensitive data in the integrated Excel workbook.

  • If the Fusion web application is running on the https protocol and you have not installed the security certificate on the client, the integrated Excel workbook gives an error on login and the connection is not established. To establish a connection, you must install the security certificate.

  • For applications running in an environment using Oracle Access Manager, the system administrator should ensure that the URL for the ADF Desktop Integration Remote servlet is configured as a protected resource for Oracle Access Manager. For more information, see the Oracle Access Manager Access System Administration Guide.

  • For applications running in an environment using WebGate, set the user-defined parameter filterOAMAuthnCookie to False. For more information, see the chapter on registering partners (agents and applications) remotely in the Oracle Access Manager Access System Administration Guide.

  • System administrators should ensure that applications using ADF Desktop Integration have a security constraint configured in web.xml that protects the ADF Desktop Integration remote servlet.

    The following code extract from web.xml shows a security constraint protecting the remote servlet:

    <security-constraint>
      <web-resource-collection>
        <web-resource-name>adfdiRemote</web-resource-name>
        <url-pattern>/adfdiRemoteServlet</url-pattern>
      </web-resource-collection>
      <auth-constraint>
        <role-name>valid-users</role-name>
      </auth-constraint>
    </security-constraint>
    
  • End users that download integrated Excel workbooks using Microsoft Internet Explorer may be prompted unexpectedly for credentials before the Excel application is visible, and then prompted again once the workbook opens. This may occur when the web application is configured to use certain authentication methods like Basic or Digest. The extra prompt is due to Internet Explorer making an OPTIONS request on the web folder containing the workbook.

    To avoid the extra login prompt, end users can choose to save the workbook locally instead of opening it directly from the browser.

PKoFAq Getting Started with the Development Tools

5 Getting Started with the Development Tools

This chapter describes how to use the development tools provided by ADF Desktop Integration. It provides an overview of the development environment that Oracle ADF exposes within Excel and goes on to describe how to display and use the different elements of this environment.

This chapter includes the following sections:

5.1 About Development Tools

ADF Desktop Integration provides several tools to configure Excel workbooks so that they can access Oracle ADF functionality. Using these tools you configure the workbook and corresponding worksheets to display, and edit, data from the Fusion web application in the integrated Excel workbook The tools are available in the Oracle ADF tab and in the ADF Desktop Integration Designer task pane.

ADF Desktop Integration development tools include the following tools, also shown in Figure 5-1:

  • Bindings Palette

  • Components Palette

  • Property Inspector

  • Binding ID Picker

  • Expression Builder

  • Web Page Picker

  • File System Folder Picker

  • Page Definition Picker

  • Collection Editors

Figure 5-1 ADF Desktop Integration Development Tools

ADF Desktop Integration Development Tools

ADF Desktop Integration provides two modes, design mode and the test mode, in which you can work while you configure the Excel workbook.

In design mode, you use the tools provided by Oracle ADF in Excel to design and configure the integrated Excel workbook. In test mode, you can view and test the changes you made in the design mode, in the same way that the end user views the published integrated Excel workbook.

5.1.1 ADF Desktop Integration Development Tools Use Cases and Examples

You use the development tools to configure and design the integrated Excel workbook. For example, as shown in Figure 5-2, in EditPriceList-DT.xlsx a binded ADF Table component is inserted in the integrated Excel workbook using the ProductTable binding from the Bindings palette.

Figure 5-2 ADF Desktop Integration Components and Bindings

ADF Desktop Integration Components and Bindings

Other ADF Desktop Integration components, such as ADF Button and ADF Label, are inserted from the Components palette, and configured using the Property Inspector and Expression Builder.

5.1.2 Additional Functionality for ADF Desktop Integration Development Tools

After adding the desired components and configuring your work, you may find that you need additional functionality such as changing the appearance of the workbook, and localizing it. Following are links to other functionality that you can use:

5.2 Oracle ADF Tab

You use the Oracle ADF tab for various tasks such as configuring the integrated workbook and worksheets properties, insert Oracle ADF components and edit their properties, run the workbook in test mode, and publish the workbook. The Oracle ADF tab, also shown in Figure 5-3, provides various buttons in design mode.

Figure 5-3 Oracle ADF Tab in Design Mode

Oracle ADF tab in design Mode

You can use Oracle ADF tab buttons to invoke the actions described in Table 5-1.

Table 5-1 Oracle ADF Tab Options

In this group...Click this button...To...Mode when the button is available...

Workbook

Workbook Properties button

Display the Edit Workbook Properties dialog to view and edit integrated Excel workbook properties.

The button is also used to enable ADF Desktop Integration in a non-integrated Excel workbook.

Design

Workbook

Worksheet Properties button

Display the Edit Worksheet Properties dialog to view and edit the current worksheet properties.

Design

Workbook

About ADF Desktop Integration button

Open the About Oracle ADF 11g Desktop Integration dialog that provides version and property information of integrated Excel workbook.

The button is also available in non-integrated Excel workbooks after ADF Desktop Integration is installed.

Design, Test, Runtime

ADF Components

Insert Component button

Display a dropdown list of Oracle ADF components that you can insert in the selected cell.

Design

ADF Components

Edit Component button

Display the property inspector window to view and edit component properties of the selected component.

Design

ADF Components

Delete Component button

Delete the selected component from the Excel worksheet.

Design

ADF Components

Refresh Bindings button
  • Reload the application workspace file (.jws) and project file (.jpr) referenced by the workbook properties of the integrated Excel workbook.

  • Refresh all information from the page definition files used in the active integrated Excel workbook.

Any modifications that you made to the page definition files in the JDeveloper project now become available in the Excel workbook. For more information, see Section 4.3.3, "How to Reload a Page Definition File in an Excel Workbook."

Design

Test

Switch to Test Mode button

Switch the Excel workbook from design mode to test mode. This button is active only when you are in design mode.

Design

Test

Switch to Design Mode button

Switch the Excel workbook from test mode to design mode. This button is active only when you are in test mode.

For more information about switching between design mode and test mode, see Section 13.4, "Testing Your Integrated Excel Workbook."

Test

Test

Validate button

Validate the Excel workbook configuration against ADF Desktop Integration validation rules.

For more information about validating a workbook, see Section 13.3, "Validating the Integrated Excel Workbook Configuration."

Design

Logging

Show or hide Logging Console button

Display a dialog to review the client-side log entries. For more information, see Section C.3.2, "About Client-Side Logging."

Design, Test

Logging

Reload Config button

Reload the ADF Desktop Integration configuration file. For more information, see Section C.3.2, "About Client-Side Logging."

Design, Test

Logging

Set Output Level button

Display the Set Output Level dialog to choose client-side log output level. For more information, see Section C.3.2, "About Client-Side Logging."

Design, Test

Logging

Button to add a listener

Create a new temporary logging listener to act as a client-side log output file. For more information, see Section C.3.2, "About Client-Side Logging."

Design, Test

Publish

Publish Workbook button

Publish the Excel workbook after you complete the integration between the Excel workbook and the Fusion web application.

For more information about publishing an integrated Excel workbook, see Chapter 14, " Deploying Your Integrated Excel Workbook."

Design



Tip:

For quick and easy access, you can add Oracle ADF tab buttons to the Excel Quick Access toolbar.

5.3 ADF Desktop Integration Designer Task Pane

The development tools in ADF Desktop Integration Designer Task Pane are organized in two palettes, the Bindings palette and the Component palette. You use the Bindings palette of ADF Desktop Integration Designer task pane to insert a predefined binding into the integrated Excel workbook. ADF Desktop Integration inserts an Oracle ADF component that references the binding you selected, and prepopulates the properties of the Oracle ADF component with appropriate values. Similarly, you use the use the Components palette to insert an Oracle ADF component in the integrated Excel workbook. Figure 5-4 displays the ADF Desktop Integration Designer task pane.

Figure 5-4 ADF Desktop Integration Designer Task Pane

ADF Desktop Integration task pane

You invoke the ADF Desktop Integration Designer task pane through launcher buttons available in the bottom-right corner of the Workbook and ADF Components group on the Oracle ADF tab, as illustrated in Figure 5-5.

Figure 5-5 ADF Desktop Integration Designer Task Pane Launcher Buttons

ADF Desktop Integration task pane launcher buttons

Table 5-2 lists the view tabs and links that appear in the task pane, provides a brief description of each item.

Table 5-2 Overview of ADF Desktop Integration Designer Task Pane

Task Pane UI ElementDescription

Workbook Properties

Click to display the Edit Workbook Properties dialog. This dialog enables you to view and edit properties that affect the whole workbook. Examples include properties that reference the directory paths to page definition files, the URL for your Fusion web application, and so on.

Worksheet Properties

Click to display the Edit Worksheet Properties dialog. This dialog enables you to view and edit properties specific to the active worksheet. An example is the file name of the page definition file that you associate with the worksheet.

About

Click to display the About dialog. This dialog provides the version and property information that can be useful when troubleshooting an integrated Excel workbook. For example, it provides information about the underlying Microsoft .NET and Oracle ADF frameworks that support an integrated Excel workbook.


5.4 Using the Bindings Palette

The bindings palette presents the available Oracle ADF bindings that you can insert into the Excel worksheet. The page definition file for the current Excel worksheet determines what Oracle ADF bindings appear in the bindings palette. Figure 5-6 shows a bindings palette populated with Oracle ADF bindings in the ADF Desktop Integration Designer task pane. Note that the bindings palette does not display bindings that an integrated Excel workbook cannot use, so the bindings that appear may differ from those that appear in the page definition file viewed in JDeveloper.

Figure 5-6 Oracle ADF Bindings Palette in the ADF Desktop Integration Designer Task Pane

ADF Bindings Palette in the task pane

You use the bindings palette in design mode to insert a binding. When you attempt to insert a binding, ADF Desktop Integration inserts an Oracle ADF component that references the binding you selected. ADF Desktop Integration also prepopulates the properties of the Oracle ADF component with appropriate values. For example, if you insert a binding, such as the Commit (action) binding illustrated in Figure 5-6, the property inspector for an Oracle ADF Button component appears. This Oracle ADF Button component has values specified for its ClickActionSet that include invoking the Commit action binding.

To insert an Oracle ADF binding, select the cell to anchor the Oracle ADF component that is going to reference the binding in the Excel worksheet, and then insert the binding in one of the following ways:

  • Double-click the Oracle ADF control binding you want to insert.

  • Select the control binding and click Insert Binding in the ADF Desktop Integration Designer task pane.

    A property inspector for the Oracle ADF component that is associated with the binding you attempt to insert appears. In some instances, you may be prompted to select one Oracle ADF component from a list of Oracle ADF components where multiple Oracle ADF components can be associated with the binding. After you select an Oracle ADF component from the list, a property inspector appears.

5.5 Using the Components Palette

The components palette displays the available ADF Desktop Integration components that you can insert into an Excel worksheet. Figure 5-7 shows the components palette as it appears in the ADF Desktop Integration Designer task pane.

Figure 5-7 Oracle ADF Components Palette in the ADF Desktop Integration Designer Task Pane

ADF Components Palette in the task pane

You use the components palette in design mode to insert an Oracle ADF component. First, select the cell to anchor the Oracle ADF component in the Excel worksheet, and then insert the Oracle ADF component in one of the following ways:

  • Double-click the Oracle ADF component you want to insert.

  • Select the component and click Insert Component in the ADF Desktop Integration Designer task pane.

In both cases, the Oracle ADF component's property inspector appears. Use the property inspector to specify values for the component before you complete its insertion into the Excel worksheet.


Note:

The ADF Desktop Integration components are also available in the Insert Component dropdown list of Oracle ADF tab.

5.6 Using the Property Inspector

The property inspector is a dialog that enables you to view and edit the properties of Oracle ADF bindings, Oracle ADF components, Excel worksheets, or the Excel workbook. You can open the property inspector in one of the following ways:

  • Select the component or binding, and click the Edit Properties icon in the Oracle ADF tab.

  • Select the component or binding, right-click and choose Edit ADF Component Properties from the context menu.

    Note that the ADF Button does not support the right-click action, click the button to open the property inspector dialog.

The property inspector also appears automatically after you insert an Oracle ADF binding or component into an Excel worksheet. Figure 5-8 shows a property inspector where you can view and edit the properties of an Oracle ADF Button component.

At design time, you can edit key properties of certain Oracle ADF components by editing the Excel cell where the component appears. For example, you can edit the Value property of ADF Label and ADF Input Text components by editing the value displayed in the cell.


Note:

The property inspector does not validate that values you enter for a property or combinations of properties are valid. Invalid values may cause runtime errors. To avoid runtime errors, make sure you specify valid values for properties in the property inspector.

You can display the properties in an alphabetical list or in a list where the properties are grouped by categories such as Behavior, Data, and so on. Table 5-3 describes the buttons that you can use to change how properties display in the property inspector.

Table 5-3 Buttons to Configure Properties Display in Property Inspector

ButtonDescription
Categorized button to display properties by category

Use this button to display the properties according to category.

Button to display properties alphabetically

Use this button to display the properties in an alphabetical list.


In Figure 5-8, the property inspector displays '5the properties grouped by category.

Figure 5-8 Property Inspector Window for ADF Button Component

Property Inspector Window for an ADF Component

5.7 Using the Binding ID Picker

The binding ID picker is a dialog that enables you to select Oracle ADF bindings at design time to configure the behavior of Oracle ADF components at runtime. You invoke the binding ID picker from the property inspector. The binding ID picker filters the Oracle ADF bindings that appear, based on the type of binding that the Oracle ADF component property accepts. For example, the SuccessActionID property for an ADF Button component supports only action bindings. Therefore, the binding ID picker filters the bindings from the page definition file so that only action bindings appear, as illustrated in Figure 5-9.

Figure 5-9 Binding ID Picker

Binding ID Picker

For more information about ADF Desktop Integration component properties and the bindings they support, see Appendix A, "ADF Desktop Integration Component Properties and Actions."

5.8 Using the Expression Builder

You use the expression builder to write Expression Language, or EL, expressions that configure the behavior of components at runtime in the Excel workbook. You invoke the expression builder from the property inspector of component properties that support EL expressions. For example, the Label property in Figure 5-10 supports EL expressions and, as a result, you can invoke the expression builder to set a value for this property.

You can reference bindings in the EL expressions that you write. Note that the expression builder does not filter bindings. It displays all bindings that the page definition file exposes. See Table 4-1 to identify the types of bindings that each ADF Desktop Integration component supports.

To add an expression in the Expression box, select the item and click Insert Into Expression. You can also double-click the item to add it in the Expression box. Table 5-4 describes the folders available in the expression builder.

Figure 5-10 Expression Builder

Expression Builder

Table 5-4 Expression Builder Folders

Folder NameDescription

Bindings

Lists the bindings supported in ADF Desktop Integration from the current worksheet's page definition.

Components

Lists the ADF components available in the current worksheet.

Resources

Lists the resource bundles registered in Workbook.Resources along with the built-in resource bundle _ADFDIres.

Styles

Lists all Excel styles defined in the current workbook. For more information, see Section 9.2, "Working with Styles.".

Workbook

Lists parameters defined in Workbook.Parameters.

Worksheet

Lists the errors expression.

Excel Functions

Lists sample Excel functions that you can use with ADF Desktop Integration. For more information, see Excel's documentation.


For more information about using the expression builder, see Section 9.3, "Applying Styles Dynamically Using EL Expressions." For information about the syntax of EL expressions in ADF Desktop Integration, and guidelines on how you write these expressions, see Appendix B, "ADF Desktop Integration EL Expressions."

5.9 Using the Web Page Picker

Use the web page picker to select a web page from your Fusion web application. At runtime, an Oracle ADF component, for example an Oracle ADF Button component, can invoke the web page that you associate with the Oracle ADF component.

You can invoke the web page picker when you add a Dialog action to an action set in the Action Collector Editor. You use the web page picker to specify a web page for the Page property of the Dialog action, as illustrated in Figure 5-11.

Figure 5-11 Web Page Picker Dialog

Web Page Picker Dialog Box

For more information about displaying web pages in your integrated Excel workbook, see Section 8.4, "Displaying Web Pages from a Fusion Web Application."

5.10 Using the File System Folder Picker

Use the file system folder picker to navigate over the Windows file system and select folders. You use this picker to specify values for the following workbook properties:

  • ApplicationHomeFolder

  • WebPagesFolder

The first time you open an Excel workbook the picker appears so that you can set values for the previously listed properties. For more information about opening an Excel workbook for the first time and the properties you set, see Section 4.2.2, "How to Configure a New Integrated Excel Workbook."

Figure 5-12 shows the file system folder picker selecting a value for the ApplicationHomeFolder workbook property.

Figure 5-12 File System Folder Picker

File system folder picker

5.11 Using the Page Definition Picker

Use the page definition picker to select the page definition ID of a page definition file and associate the file with a worksheet. The picker appears the first time that you activate a worksheet in an integrated Excel workbook. It can also be invoked when you attempt to set a value for the worksheet property, PageDefinition, as illustrated in Figure 5-13.

Figure 5-13 Page Definition Picker

Page definition picker

For more information about page definition files, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

5.12 Using the Collection Editors

ADF Desktop Integration uses collection editors to manage the properties of elements in a collection. The title that appears in a collection editor's title bar describes what the collection editor enables you to configure. Examples of titles for collection editors include Edit CachedAttributes, Edit Columns, and the Edit Action. These collection editors allow you to configure collections of cached data, table columns in the ADF Table component, and actions in an action set. Figure 5-14 shows the collection editor that configures an action set for the Search button that appears at runtime in the Master Price List module's EditPriceList-DT.xlsx workbook.

Figure 5-14 Collection Editor

Collection Editor

Tip:

Write a description in the Annotation field for each element that you add to the Edit Action dialog. The description you write appears in the Members list view and, depending on the description you write, may be more meaningful than the default entry that ADF Desktop Integration generates.

5.13 Using the Cell Context Menu

When working with ADF components at design-time, you can right-click on a component origin cell to get menu options to edit or delete the component. If you click on a cell other than a component origin, the menu options do not appear. Some keyboards feature a key that invokes the context menu. Using this key, you will see the edit and delete menu options as well. Figure 5-15 shows the context menu options of an ADF Output Text component.

Figure 5-15 Context Menu Options of the ADF Output Text Component

Context Menu Options of the ADF Output Text Component

It is recommended that you use either the keyboard context menu key or the mouse's right-click button during any given session. If you use both the mouse right-click and the context menu key, the menu options may not always appear when expected.

PK[n1'PK.[E$OEBPS/ap_desk_integ_troubleshoot.htm Troubleshooting an Integrated Excel Workbook

C Troubleshooting an Integrated Excel Workbook

This appendix provides guidelines on how you can troubleshoot an integrated Excel workbook when you encounter problems during development. It also describes possible solutions for a number of problems that you may encounter.

This appendix includes the following sections:


Note:

The property inspector does not validate that values you enter for a property or combinations of properties are valid. Invalid values may cause runtime errors. To avoid runtime errors, make sure you specify valid values for properties in the property inspector. For more information about the property inspector, see Section 5.6, "Using the Property Inspector."

C.1 Verifying That Your Fusion Web Application Supports ADF Desktop Integration

Using a specific URL, you can verify that the Fusion web application is running the ADF Desktop Integration remote servlet (adfdiRemote), and the version of ADF Desktop Integration. This information can be useful if you encounter errors with an integrated Excel workbook. For example, you can determine whether the ADF Desktop Integration remote servlet is running when you are troubleshooting an integrated Excel workbook.

To verify that the ADF Desktop Integration remote servlet is running:

  1. Log on to the Fusion web application.

  2. Type the concatenated values of the workbook properties WebAppRoot and RemoteServletPath into the address bar of your web browser. This corresponds to a URL similar to the following:

    http://hostname:7101/FusionApp/adfdiRemoteServlet

    If the ADF Desktop Integration remote servlet is running, a web page returns displaying a message similar to the following:

    ADF Desktop Integration Remote Servlet 11g (11.1.1.48.86) [520]
    Response from oracle.adf.desktopintegration.servlet.DIRemoteServlet: OK.
    

C.2 Verifying End-User Authentication for Integrated Excel Workbooks

If end users of an integrated Excel workbook do not get prompted for user credentials when they invoke an action that interacts with the Fusion web application configured with ADF security, it may mean that security is not configured correctly for either the integrated Excel workbook or the Fusion web application. You can verify that your secure Fusion web application authenticates end users and that it is security-enabled by carrying out the following procedure.

To verify that a secure Fusion web application authenticates end users:

Enter the value of the workbook properties WebAppRoot into the address bar of your web browser. This corresponds to a URL similar to the following:

http://hostname:7101/FusionApp/adfdiRemoteServlet

If the Fusion web application is security-enabled, it will request that you enter user credentials.

For more information about securing your integrated Excel workbook, see Chapter 11, "Securing Your Integrated Excel Workbook."

C.3 Generating Log Files for an Integrated Excel Workbook

ADF Desktop Integration can generate log files that capture information based on events triggered by the following pieces of software within ADF Desktop Integration:

C.3.1 About Server-Side Logging

You configure the generation of server-side log files for ADF Desktop Integration the same way as for other Oracle ADF modules. This involves setting values that specify the verbosity level and output location in a configuration file named j2ee-logging.xml. You can also use Oracle Diagnostic Logging Configuration of JDeveloper to configure the logging levels specified in the logging.xml file. For more information about using the JDeveloper debugging tools and ADF Logger, see the "Using the ADF Logger" section in Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Table C-1 describes the package names that you supply as attribute parameters to the <logger> elements in the j2ee-logging.xml file to configure log file generation in ADF Desktop Integration.

Table C-1 Package Names for Log File Configuration

To generate log file entries for this component...Enter this package name...

All ADF Desktop Integration server logic

oracle.adf.desktopintegration

ADF Desktop Integration remote servlet

oracle.adf.desktopintegration.servlet

ADF Desktop Integration HTTP filter

oracle.adf.desktopintegration.filter


Table C-2 describes the types of information that the log file captures and the corresponding log file entry level.

Table C-2 Server-Side Logging Levels

Log LevelDescription

SEVERE (ERROR)

Captures all exceptions and errors.

WARNING

Captures all irrecoverable problem conditions.

INFO or CONFIG

Captures lifecycle events such as servlet initialization, and so on.

CONFIG

Captures "heartbeat" events that echo status and execution context for each client-server interaction.

FINE

FINER

FINEST

These values generate increasing levels of diagnostic information.


C.3.2 About Client-Side Logging

You can configure ADF Desktop Integration to save logs of triggered events on the client. By default, no log files are generated. For more information about how to configure the Oracle ADF Desktop Integration module to save logs, see Section C.3.2.1, "How to Configure ADF Desktop Integration to Save Logs.".

C.3.2.1 How to Configure ADF Desktop Integration to Save Logs

ADF Desktop Integration provides logging tools to generate event logs and make them easily accessible. The logging tools are located in the Logging group of the Oracle ADF tab, and are available in both the design mode and the test mode.

Figure C-1 shows the logging tools in the Oracle ADF tab.

Figure C-1 Logging Tools in Oracle ADF Tab

Logging group in Oracle ADF tab

The Logging group provides the following buttons:

  • Console

    Displays the Logging Console window, which enables you to review the recent log entries while you are developing and testing the integrated Excel workbook. The console displays entries that are logged while the console is open. The console displays entries that are logged while the console is open. Figure C-2 illustrates the Logging Console window with information and error log entries.

    The console is a resizable, non-modal window with a buffer size of 64,000 characters. When the buffer is full, the old entries are removed. If you want to save log entries, select and copy them to a text file.

    Figure C-2 Logging Console Window

    Logging console window

    The dialog has the following buttons:

    • Set Level: Click to set the log output level. The button opens the Logging Output Level dialog, where you can choose the desired log output level.

    • Clear: Click to clear the log buffer.

    • Close: Click to close the dialog.


    Note:

    A common Logging Console window logs entries for all open integrated Excel workbooks.

  • Set Output Level

    Prompts you to choose the log output level. Table C-3 describes the log levels that client-side logging supports.

    Figure C-3 Logging Output Level Dialog

    Logging Output Level dialog box.

    Table C-3 Client-Side Logging Levels

    LevelDescription

    Critical

    Captures critical information.

    Error

    Captures information about severe errors and exceptions.

    Warning

    Captures irrecoverable conditions.

    Information

    Captures lifecycle and control flow events.

    Verbose

    Captures detailed information about the execution flow of the application.

    Off

    No logs are captured. This is the default value.



    Note:

    The log output level applies to all listeners for a given logger.

  • Add Log Output File

    Creates a new temporary logging listener to direct logging output to the specified file or format. In the Add New Temporary Logging Output File dialog, choose the desired file output type (text or XML), and specify the path and file name of the log output file.

    Figure C-4 Add New Temporary Logging Output File Dialog

    Add New Temporary Logging Output File dialog box

    The temporary listener directs the logging output for the current Excel session only, and is not registered in the ADF Desktop Integration configuration file. After you close the integrated Excel workbook, the temporary listener is removed.


    Note:

    When you click the Add Log Output File button, a new listener is created. The new listener does not replace any existing listener defined in the ADF Desktop Integration configuration file, or any other temporary listener.

  • Refresh Config

    Reloads the ADF Desktop Integration configuration file. The ADF Desktop Integration configuration file determines the type of information logged by ADF Desktop Integration. It also determines the location and the output format of the log file.

    For more information about the creation and configuration of the ADF Desktop Integration configuration file, see Section C.3.2.2, "About the ADF Desktop Integration Configuration File."

C.3.2.2 About the ADF Desktop Integration Configuration File

The ADF Desktop Integration configuration file is saved as adfdi-excel-addin.dll.config in the Designer edition, and as adfdi-excel-addin-runtime.dll.config in the Runtime edition. To determine the correct file name and location, click the About button in the Workbook group of the Oracle ADF tab. In the dialog that opens, click the Properties tab, and consult the Configuration entry for file name and location of configuration file.

For more information about elements of the configuration file, see the "Configuration File Schema for the .NET Framework" section in Microsoft Developer Network documentation. For more information about trace and debug settings, see the "Trace and Debug Settings Schema" section in Microsoft Developer Network documentation.

Example C-1 shows a sample configuration file, one of many valid ways to configure client-side logging, that generates two different log files with different formats (.txt and .xml). The file captures different types of information such as ThreadId, ProcessId, and DateTime at a Verbose logging level.

Example C-1 Sample Configuration File

<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="adfdi-common" switchValue="Verbose">
        <listeners>
          <add type="System.Diagnostics.DelimitedListTraceListener"
            name="adfdi-common-excel.txt"
            initializeData="c:\logs\adfdi-common-excel.txt"
            delimiter="|"
            traceOutputOptions="ThreadId, ProcessId, DateTime"/>
          <add type="System.Diagnostics.XmlWriterTraceListener"
            name="adfdi-common-excel.xml"
            initializeData="c:\logs\adfdi-common-excel.xml"
            traceOutputOptions="None"/>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

C.3.2.3 How to Configure Logging Using User Environment Variables

Users who do not have access to the directory that stores the ADF Desktop Integration configuration file can change the location where log files are saved, and the logging level by setting values for user environment variables. You can add two user environment variables to configure the logging level and location for XML log files.

To add or configure user environment variables on Windows:

  1. Click the Windows Start button and then click Settings > Control Panel.

  2. In the Control Panel, double-click System.

  3. In the System Properties dialog, click the Advanced tab, and then click the Environment Variables button.

  4. In the Environment Variables dialog, click New under the User variables for username input field, and add variables as described in the following table.

    Table C-4 User Environment Variables to Configure Logging

    Enter a variable named...With a value...

    adfdi-common-file

    That defines the directory path and file name for the XML file that captures logging information.

    The directory that you specify here must exist before you add the adfdi-common-file variable. The generated log file will be in XML format.

    adfdi-common-level

    That specifies the level of logging. Table C-3 lists valid values.


  5. Click OK.

C.3.2.4 What You May Need to Know About the adfdi-common Object

The adfdi-common object is an instance of the TraceSource class from the System.Diagnostics namespace in the Microsoft .NET Framework. This object is used to generate log files that capture information about events triggered by the Excel workbook that you integrate with your Fusion web application.

For more information about the TraceSource class, see Microsoft Developer Network documentation.

C.4 Exporting Excel Workbook Configuration

You can export the XML configuration in your Excel workbook to an XML file with a name and location that you specify. This file may be useful if you have to debug or analyze an Excel workbook that is integrated with a Fusion web application. It contains child elements for each worksheet in the workbook, resources such as the relative path to the remote servlet, and so on.

The following procedure describes how you export XML configuration from an Excel workbook.

To export XML configuration from an integrated Excel workbook:

  1. Click About in the Oracle ADF tab.

    The About Oracle ADF 11g Desktop Integration dialog box appears.

  2. Click the Properties view tab and then click the Export Metadata button.

    A dialog box appears that asks you to specify a file name and location for the file that stores the exported metadata.

  3. Specify a file name, a location, and then click Save.

    The integrated Excel workbook exports the XML configuration to the specified file in the specified format.

C.5 Common ADF Desktop Integration Problems

This section describes the most common problems and their solutions.

Error message: [ADFDI-00127] A version mismatch was detected for SyncServletResponse. Version x was found, version y was expected
Cause: The client version of ADF Desktop Integration does not match the ADF Desktop Integration version in the web application.
Action: Uninstall client ADF Desktop Integration, and install the web application specific ADF Desktop Integration version. For more information about installing ADF Desktop Integration client, see Section 3.5, "Installing ADF Desktop Integration."
Error message: 404 Error - servlet not found
Cause: The web.xml deployment descriptor settings are not in sync with Workbook.RemoteServletPath property value.
Action: Open Workbook Properties editor and verify the Workbook.RemoteServletPath property value.
Error message: Uncaught exception thrown by method called through Reflection. (Exception from HRESULT: 0x80131604)
Cause: Microsoft .NET Programmability Support is not enabled.
Action: Enable Microsoft .NET Programmability Support. For more information, see Section 3.3, "Enabling Microsoft .NET Programmability Support."
Problem: Oracle ADF tab is not visible in your integrated Excel Workbook after installing ADF Desktop Integration
Cause: The ADF Desktop Integration add-in is not enabled in Excel.
Action: Enable the ADF Desktop Integration add-in in the Excel Options dialog. In Excel, click the Microsoft Office button, and then click Excel Options to open the Excel Options dialog. In the Add-Ins tab, open the Manage dropdown list, choose COM Add-ins, and click Go. In the COM Add-ins dialog, select the Oracle ADF Desktop Integration Add-in for Excel checkbox and click OK.
Error message: Programmatic access to Visual Basic Project is not trusted
Cause: Macro settings in Excel are not enabled.
Action: Verify that the Trust access to the VBA project object model checkbox in the Trust Center dialog is enabled. For more information, see Section 3.4, "Allowing ADF Desktop Integration to Access Microsoft Excel."
Problem: Edit Options dialog appears prompting for WebAppRoot when downloading an integrated Excel workbook from a Fusion web application
Cause: The adfdiExcelDownload filter is not properly configured in web.xml, and so the filter is not able to set the WebAppRoot property on the downloaded workbook.
Action: Ensure that the adfdiExcelDownload filter is properly configured in web.xml. Verify that the filter is listed in the correct order with respect to the ADF Library Web Application Support, if it is in use. Also verify that the filter mappings for the adfdiExcelDownload filter are correct (see Section E.2, "Configuring the ADF Desktop Integration Excel Download Filter.") You should also clear the directory into which browser downloads files.
PKD!PK.[EOEBPS/interactiv_app.htm Adding Interactivity to Your Integrated Excel Workbook

8 Adding Interactivity to Your Integrated Excel Workbook

This chapter describes how to add interactivity options to your integrated Excel workbook.

This chapter includes the following sections:

8.1 About Adding Interactivity to an Integrated Excel Workbook

You can make your integrated Excel workbook interactive to the end user by using features such as action sets, configuring the runtime ribbon tab, creating dependent list of values, and so on. Figure 8-1 shows some of the interactive features.

Figure 8-1 Interactivity Features in an Integrated Excel Workbook

nteractivity Features in an Integrated Excel Workbook

Adding interactivity to an integrated Excel workbook permits end users to execute action sets that invoke Oracle ADF functionality in the workbook. It also provides status messages, alert messages, and error handling in the integrated Excel workbook while these action sets execute. In addition to end-user gestures (double-click, click, select) on the ADF Desktop Integration components that invoke action sets, you can configure workbook and worksheet ribbon buttons that end users use at runtime to invoke action sets.

8.1.1 Adding Interactivity to Integrated Excel Workbook Use Cases and Examples

To make your integrated Excel workbook interactive, you can use action sets that are invoked by the end user's gestures. For example, as shown in Figure 8-2, the Search button of Search Area in AdvEditPriceList-DT.xlsx uses multiple actions sets to search and download data matching the search criteria.

Figure 8-2 Action Sets of Search Button

Action Sets of Search Button

Figure 8-3 shows an example of custom runtime ribbon tab implemented in EditPriceList.xlsx.

Figure 8-3 Runtime Ribbon Tab of EditPriceList.xlsx

Runtime Ribbon Tab of EditPriceList.xlsx

8.1.2 Additional Functionality for Adding Interactivity to an Integrated Excel Workbook

In addition to action sets and runtime ribbon tab, you can add additional functionality to configure your workbook. Following are links to other functionalities that you can use:

8.2 Using Action Sets

An action set is an ordered list of one or more of the following actions that execute in a specified order:

  • ADFmAction

  • ComponentAction

  • WorksheetMethod

  • Confirmation

  • Dialog

An action set can be invoked by an end-user's gesture (for example, clicking an ADF Button) or an Excel worksheet event. Where an end-user gesture invokes an action set, the name of the action set property in the ADF component's property inspector is prefaced by the name of the gesture required. The following list describes the property names that ADF Desktop Integration displays in property inspectors, and what user gesture can invoke an action set:

  • ClickActionSet for an ADF Button component, as the end user clicks the button to invoke the associated action set

  • DoubleClickActionSet for an ADF InputText or ADF Output Text component, as the end user double-clicks these components to invoke the associated action set

  • SelectActionSet for a worksheet ribbon button, as the end user selects a button to invoke the associated action set

  • ActionSet for a worksheet event, as no explicit end-user gesture is required to invoke the action set

You invoke the Edit Action dialog from an ADF component, worksheet ribbon button, or worksheet event to define or configure an action set. In addition to defining the actions that an action set invokes, you can configure the action set's Alert properties to provide feedback on the result of invocation of an action set. You configure the Status properties for an action set to display a status message to end users while an action set executes the actions you define. For information about opening the Edit Action dialog, see Section 5.12, "Using the Collection Editors."

The Master Price List module provides many examples of action sets in use. One example is the ADF Button component labeled Upload Data at runtime in the EditPriceList-DT.xlsx workbook. An action set has been configured for this ADF Button component that invokes the ADF Table component's Upload action illustrated by Figure 8-4 which shows the Edit Action dialog in design mode.

Figure 8-4 Action Set for Upload Data Button in the EditPriceList-DT.xlsx Workbook

ActionSet for Save Changes Button in EditPriceList.xls

Tip:

Write a description in the Annotation field for each action that you add to the Edit Action dialog. The description you write appears in the Members list view and, depending on how you write it, may be more meaningful than the default entry that ADF Desktop Integration generates.


Note:

ADF Desktop Integration invokes the actions in an action set in the order that you specify in the Members list view.

8.2.1 How to Invoke a Method Action Binding in an Action Set

You can invoke multiple method action bindings in an action set. Page definition files define what action bindings are available to invoke in a worksheet that you integrate with your Fusion web application. For more information about page definition files and action bindings in an integrated Excel workbook, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

You use the Edit Action dialog to specify a method action binding to invoke.

Before you begin:

It may be helpful to have an understanding of action sets. For more information, see Section 8.2, "Using Action Sets."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To invoke a method action binding in an action set:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog and invoke the dropdown list from the Add button illustrated here.

    Add button to invoke Action Collection Editor
  3. Select ADFmAction and configure its properties as described in the following list:

    • ActionID

      Click the ellipsis button (...) beside the input field for ActionID to invoke the Binding ID picker and select the method action binding that the action set invokes.

    • Annotation

      Optionally, enter a comment about the purpose of the action that you are configuring. The value you set for this property has no functional impact.

  4. Click OK.

8.2.2 How to Invoke Component Actions in an Action Set

The ADF Table and the ADF Read-only Table components in ADF Desktop Integration expose actions that can be used to manage the transfer of data between Excel worksheets that you integrate with a Fusion web application. The ADF Read-only Table component exposes one component action, Download, while the ADF Table component exposes many other actions. More information about the actions for both components can be found in Appendix A, "ADF Desktop Integration Component Properties and Actions."

You configure action sets to invoke one or more component actions by referencing the component action in the array of actions. For example, Figure 8-5 shows the Choose Component Action dialog where the actions exposed by the ADF Table and ADF Read-only Table components present in a worksheet can be invoked by a SelectActionSet action set.

Figure 8-5 Choose Component Method Dialog

The Choose Component Method Dialog Box

Note:

An Excel worksheet must include an ADF Table or ADF Read-only Table component before one or more of these components' actions can be invoked by an action set.

Before you begin:

It may be helpful to have an understanding of action sets. For more information, see Section 8.2, "Using Action Sets."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To invoke a component action from an action set:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog and invoke the dropdown list from the Add button illustrated here.

    Add button for ActionSets
  3. Select ComponentAction and configure its properties as described in the following list:

    • ComponentID

      Click the ellipsis button (...) beside the input field for ComponentID to invoke the Choose Component Method dialog and select the component action that the action set invokes at runtime. This populates the ComponentID and Method input fields.

    • Action

      The component's action that the action set invokes at runtime.

    • Annotation

      Optionally, enter a comment about the purpose of the action that you are configuring. The value you set for this property has no functional impact.

  4. Click OK.

8.2.3 What You May Need to Know About an Action Set Invoking a Component Action

Note the following pieces of information about the behavior of action sets in integrated Excel workbooks.

8.2.3.1 Verifying an Action Set Invokes the Correct Component Action

When creating an action set, ensure that you invoke the component action from the correct instance of a component when a worksheet includes multiple instances of an ADF Read-only Table or ADF Table component. Figure 8-6 shows the Choose Component Action dialog displaying two instances of the ADF Read-only Table component. Use the value of the ComponentID property described in Table A-1 to correctly identify the instance of a component on which you want to invoke a component action.

Figure 8-6 Choose Component Method Dialog

Choose Component Method Dialog Box

8.2.3.2 Invoking Action Sets in a Disconnected Workbook

End users can use integrated Excel workbooks while disconnected from a Fusion web application, as described in Chapter 15, "Using an Integrated Excel Workbook Across Multiple Web Sessions and in Disconnected Mode." Some component actions, such as the Download action of the ADF Table component, require a connection to the Fusion web application to complete successfully. If the end user invokes an action set that includes such a component action, the integrated Excel workbook attempts to connect to the Fusion web application and, if necessary, invokes the authentication process described in Section 11.2, "Authenticating the Excel Workbook User."

8.2.4 How to Invoke an Action Set from a Worksheet Event

ADF Desktop Integration provides several worksheet events that, when triggered, can invoke an action set. The following worksheet events can invoke an action set:

  • Startup

  • Shutdown

    Do not invoke a Dialog action from this event if the Dialog action's Target property is set to TaskPane.

  • Activate

  • Deactivate

You add an element to the array of events (WorksheetEvent[] Array) referenced by the Events worksheet property. You specify an event and the action set that it invokes in the element that you add. For more information about the Events worksheet property and the worksheet events that can invoke an action set, see Table A-19. See Table A-14 for more information about action sets.

Use the Edit Events dialog to specify an action set to be invoked by a worksheet event.

Before you begin:

It may be helpful to have an understanding of action sets. For more information, see Section 8.2, "Using Action Sets."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To invoke an action set from a worksheet event:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Worksheet Properties.

  3. In the Edit Worksheet Properties dialog, click the ellipsis button (...) beside the input field for the Events property.

  4. In the Edit Events dialog, click Add to add a new element that specifies an event and a corresponding action set that the event invokes.

    Figure 8-7 shows an example from the EditPriceList-DT.xlsx file in the Master Price List module where the worksheet event, Startup, invokes an action set that invokes the ADF Table component's Download action.

    Figure 8-7 Worksheet Startup Event Invokes an Action Set

    Worksheet Startup event invokes an ActionSet
  5. Click OK.

8.2.5 How to Display a Status Message While an Action Set Executes

You can display a status message to end users while an action set executes by specifying values for the Status properties in an action set.

Some of the default values for properties in the ActionSet.Status group are EL expressions that resolve to strings defined in the reserved resource bundle at runtime. You can replace these default values with EL expressions that refer to your custom resource bundles. For more information, see Section 10.2, "Using Resource Bundles in an Integrated Excel Workbook."

You use the Edit Action dialog to configure values for the ActionSet.Status properties.

Before you begin:

It may be helpful to have an understanding of action sets. For more information, see Section 8.2, "Using Action Sets."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To display a status message:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog of the component.

  3. Set values for the properties in the ActionSet.Status group of properties as described in the following table.

    Table 8-1 ActionSet.Status Group of Properties

    For this property...Enter or select this value...

    Enabled

    True to display a status message. True is the default value.

    Message

    An EL expression or string that resolves to the status message to display at runtime. For example, the Search button in the Master Price List module's EditPriceList-DT.xlsx file has the following value configured for the Message property:

    Searching and downloading...

    Title

    An EL expression or string that resolves to the title of the status message to display at runtime. For example, the Search button in the Master Price List module's EditPriceList-DT.xlsx file has the following value configured for the Title property:

    Query Products

    For this property...

    Enter or select this value...


    Figure 8-8 shows the values configured for the ActionSet.Status group of properties of the Search ADF Button component in the EditPriceList-DT.xlsx workbook of the Master Price List module that is labeled Search at runtime.

    Figure 8-8 Status Message Properties in an Action Set

    Status message properties in an ActionSet

    For more information about the ActionSet.Status group of properties, see the entry for Status in Table A-14.

  4. Click OK.

8.2.6 What Happens at Runtime: How the Action Set Displays a Status Message

Once an action set is invoked, a status message appears if the ActionSet.Status properties are configured to display a status message. Figure 8-9 shows the status message that appears at runtime when the action set configured for the Search button in the EditPriceList-DT.xlsx workbook executes.

Figure 8-9 Runtime View of Status Message

Runtime view of status message

8.2.7 How to Provide an Alert After the Invocation of an Action Set

You can display an alert message to end users that notifies them when an action set operation completes successfully or fails. For example, you can display a message when all actions in an action set succeed or when there was at least one failure. The ActionSet.Alert group of properties configures this behavior.


Note:

An alert message does not appear if the end user cancels the execution of an action set. For example, you configure an alert message to appear after an action set that invokes a web page in a popup dialog completes execution. At runtime, the end user cancels execution of the action set by closing the popup dialog using the close button of the Excel web browser control that hosts the popup dialog. In this scenario, no alert message appears. For more information about displaying web pages, see Section 8.4, "Displaying Web Pages from a Fusion Web Application."

Many of the default values for properties in the ActionSet.Alert group are EL expressions that resolve to strings defined in the reserved resource bundle at runtime. You can replace these default values with EL expressions that refer to your custom resource bundles. For more information, see Section 10.2, "Using Resource Bundles in an Integrated Excel Workbook."

You use the Edit Action dialog to configure values for the ActionSet.Alert group of properties.

Before you begin:

It may be helpful to have an understanding of action sets. For more information, see Section 8.2, "Using Action Sets."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To add an alert to an action set:

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog.

  3. Set values for the properties in the ActionSet.Alert group of properties as described in Table 8-2.

    Table 8-2 ActionSet.Alert Group of Properties

    For this property...Enter or select this value...

    Enabled

    Select True from the dropdown list to display an alert message once the action set completes. The default value is False.

    FailureMessage

    Specify an EL expression or string that evaluates to a message to appear in the dialog if errors occur during execution of the action set. For example, the Upload to Server button in the Master Price List module's EditPriceList-DT.xlsx workbook has the following value configured for the FailureMessage property:

    #{components.TAB442758137.errors}

    The Upload to Server button invokes an action set that, in turn, invokes the ADF Table component's Upload action. The EL expression specified for FailureMessage retrieves error messages if the Upload action encounters errors. For more information about error handling, see Section 12.4, "Error Reporting in an Integrated Excel Workbook."

    OKButtonLabel

    Specify an EL expression that evaluates to a message to appear in the OK button of the dialog. The default EL expression is:

    #{_ADFDIres['DIALOGS_OK_BUTTON_LABEL']}

    SuccessMessage

    Specify an EL expression that evaluates to a message to appear in the dialog if no errors occur during the execution of the action set. For example, the Save Changes button in the Master Price List module's EditPriceList-DT.xlsx workbook has the following value configured for the SuccessMessage property:

    Changes saved successfully


    Figure 8-10 shows the values configured for an ADF Button component's ActionSet.Alert group of properties in the EditPriceList-DT.xlsx workbook of the Master Price List module. This ADF Button component is labeled Upload to Server at runtime.

    Figure 8-10 Alert Message Properties in an Action Set

    Alert Message Properties in an ActionSet
  4. Click OK.

8.2.8 What Happens at Runtime: How the Action Set Provides an Alert

Figure 8-11 shows the alert message that appears at runtime when the action set invoked by the ADF Button component labeled Upload to Server successfully completes execution.

Figure 8-11 Runtime View of an Alert Message

Runtime View of an Alert Message

8.2.9 How to Configure Error Handling for an Action Set

You specify values for an action set's ActionOptions properties to determine what an action set does if one of the following events occurs:

  • An action in the action set fails

  • All actions in the action set complete successfully

For information about how to invoke these editors, or about an ADF component's property inspector, see Chapter 5, "Getting Started with the Development Tools." More information about action set properties can be found in Table A-13.

Before you begin:

It may be helpful to have an understanding of action sets. For more information, see Section 8.2, "Using Action Sets."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To configure error handling for an action set:

  1. Open the integrated Excel workbook.

  2. Open the appropriate editor or property inspector and configure values for the action set's ActionOptions properties as described in the following table.

    Table 8-3 ActionOptions Properties

    Set this property...To...

    AbortOnFailure

    True (default value) so that the action set does not any execute any further actions if the current action fails. When set to False, the action set executes all actions regardless of the success or failure of previous actions.

    FailureActionID

    Specify an ADF Model action to invoke if an action set does not complete successfully. For example, you could specify an ADF Model action that rolls back changes made during the unsuccessful invocation of the action set.

    Note that calling an action set that changes a record set's currency during the execution of FailureActionID methods is not supported. The Rollback method also should not be specified as the FailureActionID in an action set.

    SuccessActionID

    Specify an ADF Model action to invoke if an action set completes successfully. For example, you could specify an action binding that executes a commit action. A value for this property is optional and you can specify a final action, such as an action binding that executes a commit action, in the action set itself.

    Note that calling an action set that changes a record set's currency during the execution of SuccessActionID methods is not supported.


  3. Click OK.

8.2.10 How to Invoke a Confirmation Action in an Action Set

The Confirmation action presents the end user with a simple message dialog that displays the title and prompt message specified in the Confirmation action properties.

The execution of the action set pauses until the end user clicks one of the two buttons provided. If the user clicks OK, the action sets proceed with the remaining actions in the Action Set. If the user clicks Cancel, the action set is aborted at that point and the remaining actions are not invoked. As there is no error or success, the FailureActionID or SuccessActionID action is not invoked.

Before you begin:

It may be helpful to have an understanding of action sets. For more information, see Section 8.2, "Using Action Sets."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To invoke a Confirmation action from a component

  1. Open the integrated Excel workbook.

  2. Open the Edit Action dialog and click the down arrow in the Add button to open a dropdown list, as illustrated here.

    Add button for ActionSets
  3. Select Confirmation and configure its Data properties as described in the following list:

    • CancelButtonLabel

      Specify an EL expression or string that evaluates to a message to appear in the Cancel button of the dialog. The default EL expression is:

      #{_ADFDIres['DIALOGS_CANCEL_BUTTON_LABEL']}
      
    • OKButtonLabel

      Specify an EL expression or string that evaluates to a message to appear in the OK button of the dialog. The default EL expression is:

      #{_ADFDIres['DIALOGS_OK_BUTTON_LABEL']}
      
    • Prompt

      Specify an EL expression or string that evaluates to a message to appear as the prompt of the dialog. The default EL expression is:

      #{_ADFDIres['DIALOGS_ACTION_CONFIRM_PROMPT']}
      
    • Title

      Specify an EL expression or string that evaluates to a title of the confirmation dialog to display at runtime. The default EL expression is:

      #{_ADFDIres['DIALOGS_ACTION_TITLE']}
      
  4. Optionally, enter a comment in the Annotation property about the purpose of the action that you are configuring. The value you set for this property has no functional impact.

  5. Click OK.

Figure 8-12 shows the Edit Action dialog with default attribute values for a Delete button.

Figure 8-12 Confirmation Action Attributes

Confirmation Action dilaog with default attributes

8.2.11 What Happens at Runtime: How the Action Set Provides a Confirmation

Once the action set is invoked, the user is prompted with a confirmation dialog. If the user clicks OK, the next action operation is performed; and if the user clicks Cancel, the Action Set execution terminates without an error.


Note:

If the user cancels a Confirmation action, the FailureActionID binding does not run.

Figure 8-13 shows a default Confirmation dialog with OK and Cancel buttons.

Figure 8-13 Confirmation Dialog

Confirmation action dialog at runtime.

8.3 Configuring the Runtime Ribbon Tab

You can configure the runtime ribbon tab in the Excel Ribbon with items that invoke Oracle ADF functionality in your integrated Excel workbook. In the Runtime Ribbon Tab group, setting the Visible workbook property to True makes this tab appear at runtime. The Title property determines the title of the tab that the end user sees at runtime. By default, the title is MyWorkbook, as illustrated in Figure 8-14.

Figure 8-14 Workbook Properties for Runtime Ribbon Tab

Workbook Properties for Runtime Ribbon tab

At runtime, the tab appears as the last tab in the Ribbon and all your configured commands appear in various groups of the tab, as illustrated by Figure 8-15.

Figure 8-15 Runtime View of the Ribbon Tab

Runtime View of Oracle ADF tab

Figure 8-16 illustrates the runtime ribbon tab in EditPriceList.xlsx with two commands configured for worksheet. At runtime, the commands are divided into four groups: items that invoke commands on the workbook, items that invoke commands on the current worksheet, a command group to clear all data, and a command workgroup to display ADF Desktop Integration version information.

Figure 8-16 Runtime View of Ribbon Tab in EditPriceList.xlsx

Runtime view of EditPriceList.xlsx ADFdi tab

You configure the Workbook Commands property in the properties of the workbook so that the runtime ribbon tab contains commands that allow the end user to invoke workbook actions such as Login and Logout. You configure the Ribbon Commands property in the properties of the worksheet so that the ADF Desktop Integration tab contains items allowing a user to invoke an action set. Worksheet command items appear when the worksheet is active. If you remove a workbook command, it does not appear in the runtime tab for that workbook. If you remove all the commands for a given group, the group does not appear when that workbook is active.

Figure 8-17 shows the Worksheet group at runtime where the worksheet actions, that invoke SelectActionSet action sets, appear.

Figure 8-17 Runtime Worksheet Group

Runtime Worksheet group

8.3.1 How to Define a Workbook Command Button for the Runtime Ribbon Tab

To define a workbook command button for the runtime ribbon tab, you configure some workbook properties. The following procedure shows how to create or remove an item in the Workbook group by using the workbook action, Login, as an example.

Before you begin:

It may be helpful to have an understanding of the runtime ribbon tab in Excel. For more information, see Section 8.3, "Configuring the Runtime Ribbon Tab."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To define a workbook command button:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. In the Edit Workbook Properties dialog, expand Runtime Ribbon Tab, and select Workbook Commands. Click the ellipsis button (...) beside the WorkbookMenuItem[] array to display the dialog as illustrated in Figure 8-18.

    Figure 8-18 Edit Workbook Commands Dialog

    The workbook menu item collection displays menu items.
  4. Click Add and specify values for the properties of the workbook command buttons as follows:

    • Method

      Specify the workbook action that you want the workbook command button to invoke.

    • Label

      Enter a value in the input field that appears as the label at runtime. Alternatively, invoke the expression builder by clicking the ellipsis button (...) and write an EL expression that resolves to a string value in a resource bundle.

      Note that the runtime value that appears in the label cannot exceed 1024 characters. A runtime value that exceeds 1024 characters is truncated so that only 1024 characters appear.

      For more information about using resource bundles, see Section 10.2, "Using Resource Bundles in an Integrated Excel Workbook."

      For more information about labels, see Section 9.4, "Using Labels in an Integrated Excel Workbook."

  5. Click OK.


Note:

The order of workbook commands in the Edit Workbook Commands dialog is ignored at runtime. The order and grouping of the workbook-level commands is always the same.

8.3.2 How to Configure a Worksheet Command for the Runtime Ribbon Tab

To define a worksheet command, you configure properties for the worksheet using the property inspector. By default, no command buttons are defined for the Worksheet group in the worksheet properties. You add members to the list that is referenced by the Ribbon Commands property in the properties of the worksheet.


CAUTION:

Set the Runtime Ribbon Tab.Visible workbook property to TRUE to display command buttons. If the Runtime Ribbon Tab.Visible is set to FALSE, no command buttons appear. For more information about workbook properties, see Table A-18.


Before you begin:

It may be helpful to have an understanding of the runtime ribbon tab in Excel. For more information, see Section 8.3, "Configuring the Runtime Ribbon Tab."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To define a worksheet command button:

  1. Open the integrated Excel workbook.

  2. In the Workbook group of the Oracle ADF tab, click Workbook Properties.

  3. In the Edit Worksheet Properties dialog, click the ellipsis button (...) beside the input field for the Ribbon Commands property to invoke the editor, as illustrated in Figure 8-19. Figure 8-17 displays how the commands appear at runtime.

    Figure 8-19 Edit Ribbon Commands Dialog

    WorksheetMenuItem Collection Editor
  4. Click Add to add a new ribbon button in the Members list of the collection editor.

  5. Configure the properties of SelectActionSet to specify the type of action(s) that the ribbon button invokes.

  6. Click OK.


Note:

At runtime, the worksheet commands appear in the same order as they are defined in the Edit Ribbon Commands dialog.

8.4 Displaying Web Pages from a Fusion Web Application

You configure a Dialog action in an action set to display pages from the Fusion web application with which you integrate your Excel workbook. These pages provide additional functionality for your integrated Excel workbook. Examples of additional functionality that you can provide include search dialogs and display pick dialogs that interact with your Fusion web application. You can also configure upload options.

The Dialog action in an action set can be configured to display in one of the following two types of dialog:

  • Popup dialog

  • Runtime task pane

The value for the Dialog.Target property (Popup or TaskPane) of the component's action set determines where a web page is rendered.

The value for the Dialog.Page property specifies the web page to display when the action is invoked. Valid values include a URL relative to the value of the WebAppRoot property or an absolute URL. For example, the EditPriceList-DT.xlsx workbook in the Master Price List module specifies the following relative URL as a value for the page to invoke when a user clicks the Advanced Search button at runtime:

/faces/secured/excelAdvSearch.jspx

Absolute URLs such as the following are also valid:

http://www.oracle.com/technetwork/middleware/index.html

Note:

The Dialog action does not support ADF task flows.

8.4.1 How to Display a Web Page in a Popup Dialog

You can configure a Dialog action in an action set to invoke a web page from your Fusion web application in a modal popup dialog hosted by Excel's web browser control. This feature provides end users with functionality that allows them to, for example, input values displayed by a page from the Fusion web application into the integrated Excel workbook.

The web page that the action set invokes must contain a reserved HTML Document Object Model (DOM) element (for example, a span element) that has a case-sensitive ID attribute set to ADFdi_CloseWindow. Example 8-1 shows how you can automatically set the value of the span element in the excelAdvSearch.jspx page of the Master Price List module using the rendered property of the f:verbatim tag.

Example 8-1 Use of HTML Document Object Model Span Element

<f:verbatim rendered="#{requestScope.searchAction eq 'search'}">
                <span id="ADFdi_CloseWindow">Continue</span>
        </f:verbatim>
<f:verbatim rendered="#{requestScope.searchAction eq 'cancel'}">
                <span id="ADFdi_CloseWindow">Abort</span>
        </f:verbatim>

Figure 8-20 shows the excelAdvSearch.jspx page hosted by the EditPriceList-DT.xlsx workbook's browser control.

Figure 8-20 Advanced Search Popup Dialog

Advanced Search Popup Dialog

In scenarios where you cannot use the rendered property of the f:verbatim tag as outlined in Example 8-1, you may need to:

  1. Create a backing bean that exposes the Dialog action's result value as a property

  2. Use an action listener to invoke the backing bean, and an EL expression in the span element to set the value ADFdi_CloseWindow to the bean property value.

Whichever approach you take, ADF Desktop Integration monitors the value of ADFdi_CloseWindow to determine when to close the popup dialog. If ADFdi_CloseWindow references:

  • An empty string or is not present, the popup dialog remains open.

  • "Continue", the popup dialog closes and the action set invokes its next action.

    The following example shows ADFdi_CloseWindow assigned a value of "Continue":

    var closeWindowSpan = document.getElementById("ADFdi_CloseWindow");

    closeWindowSpan.innerHTML = "Continue";

  • Some other string value, the popup dialog remains open.

You set the Target property for a Dialog action to Popup to display a web page from the Fusion web application in a modal popup dialog hosted by Excel's web browser control. Displaying a web page in a modal popup dialog differs from displaying a web page in Excel's task pane, because the Dialog action that the action set invokes cannot continue execution until it receives user input. While the popup dialog is open, the end user cannot interact with any other part of the integrated Excel workbook, as the popup dialog retains focus.

End users can navigate between multiple web pages from the Fusion web application within the browser control until they close the browser control, or ADF Desktop Integration closes it.

To immediately synchronize the changes that the end user makes to a data control through a popup dialog, specify the next action in the action set after the Dialog action to download all modified bindings to the worksheet (use the DownSync worksheet action) or ADF Table component (use the Download action). This scenario assumes that you specify "Continue" as the value for ADFdi_CloseWindow.


Notes:

  • If you configure the web page that appears in the popup dialog so that the end user can download an integrated Excel workbook, the Oracle ADF functionality in the integrated Excel workbook is disabled when the end user opens the workbook after download.

  • If you are using the HTML <select> components, such as list box or dropdown list, note that <select> components do not follow z-order configuration when the page is displayed through Dialog actions. In the .NET Web Browser control, on a web page with layered and overlapping components, the <select> components might appear on top of other components.

  • If the Title property is left blank, the web page's title will be used as the dialog's window title.


8.4.2 How to Display a Web Page in ADF Desktop Integration Runtime Task Pane

You set the Dialog.Target property for an action to TaskPane to display a web page specified by the Dialog.Page property in the ADF Desktop Integration task pane. In contrast to displaying a web page in a popup dialog, displaying a web page in the task pane allows an action set to continue executing actions while the web page displays. End users can access and interact with other parts of the integrated Excel workbook while the web page displays.

Note the following if you set the Target property of a Dialog action to TaskPane, ADF Desktop Integration ignores the value of ADFdi_CloseWindow (and other elements.

8.4.3 What You May Need to Know About Displaying Pages from a Fusion Web Application

You can keep the data an integrated Excel workbook contains synchronized with a Fusion web application by specifying additional actions in the action set that invokes the Dialog action. You can ensure that the Fusion web application page and the integrated Excel worksheet both use the same data control frame by setting the ShareFrame property of the Dialog action.


Notes:


8.4.3.1 Keeping an Integrated Excel Workbook and a Fusion Web Application Synchronized

To ensure that data in the integrated Excel workbook and the Fusion web application remains synchronized while end users use pages from the Fusion web application, configure the action set that invokes the Dialog action to:

  • Send changes from the integrated Excel workbook to the Fusion web application before invoking the Dialog action.

    Invoke the RowUpSync worksheet action to synchronize changes from the current row in the ADF Table component.

  • Send changes from the Fusion web application to the integrated Excel workbook after invoking the Dialog action.

    Invoke the RowDownSync worksheet action to send changes from the Fusion web application to the current row in the ADF Table component.

For DoubleClickActionSet, you must ensure that the server-side model is in the same state after executing the action set as it was before executing the action set. In most cases, it is sufficient to roll back any and all uncommitted changes at the end of each DoubleClickActionSet, as there are no pending uncommitted changes when the action set execution begins.

For more information about synchronizing data between an integrated Excel workbook and a Fusion web application, see Chapter 15, "Using an Integrated Excel Workbook Across Multiple Web Sessions and in Disconnected Mode." For information about worksheet actions and ADF Table component actions, see Chapter A, "ADF Desktop Integration Component Properties and Actions."

8.4.3.2 Sharing Data Control Frames Between Integrated Excel Worksheets and Fusion Web Application Pages

Fusion web applications and integrated Excel workbooks both use data control frames to manage the transactions and state of view objects and, by extension, the bindings exposed in a page definition file. When you invoke a Fusion web application's page from an integrated Excel worksheet, you can ensure that the page and the integrated Excel worksheet both use the same data control frame by setting the ShareFrame property of the Dialog action that invokes the page to True.

The Page property in the Dialog action specifies the page that the Dialog action invokes. If the Dialog action invokes an absolute URL or a page that is not part of your Fusion web application, ADF Desktop Integration ignores the value of ShareFrame if ShareFrame is set to True.

Set ShareFrame to False in the following scenarios:

  • The Dialog.Page property in the action set references an absolute URL or a page that is not part of your Fusion web application.

  • The Dialog.Page property in the action set references a page that is part of your Fusion web application, but that does not need to share information with the integrated Excel worksheet. For example, a page that displays online help information.

For more information about data control frames in a Fusion web application, see the "Sharing Data Control Instances" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

8.4.3.3 Configuring a Fusion Web Application for ADF Desktop Integration Frame Sharing

When you add the ADF Desktop Integration feature to your Fusion web application, the application is automatically configured to support ADF Desktop Integration frame sharing. Frame sharing allows each worksheet of an integrated Excel workbook to use a dedicated DataControl frame. Web pages displayed in dialogs invoked from each worksheet can then share the same DataControl frame as the integrated Excel worksheet.

To verify that your Fusion web application is configured to support frame sharing:

  1. Open your Fusion web application project in JDeveloper.

  2. In the Application Navigator, expand the Application Resources panel.

  3. Open the adf-config.xml file available in Descriptors > ADF META-INF folder.

  4. Click the Source tab to open the source editor.

  5. Confirm that the following adf-desktopintegration-servlet-config element is present in the file before the </adf-config> tag:

    <adf-desktopintegration-servlet-config xmlns="http://xmlns.oracle.com/adf/desktopintegration/servlet/config"> 
        <controller-state-manager-class>
           oracle.adf.desktopintegration.controller.impl.ADFcControllerStateManager
        </controller-state-manager-class>
    </adf-desktopintegration-servlet-config>
    
  6. Save the adf-config.xml file and close JDeveloper.

8.5 Inserting Values in ADF Table Columns from a Web Page Pick Dialog

You can configure the DoubleClickActionSet of an ADF Table component's column subcomponent (UpdateComponent or InsertComponent) to invoke a Fusion web application page that renders a pick dialog where the end user selects a value to insert in the ADF Table component column.

This functionality is useful when you want to constrain the values that end users can enter in an ADF Table component. For example, you may want a runtime ADF Table component column to be read-only in the Excel worksheet so that end users cannot manually modify values to prevent them from introducing errors. Invoking a pick dialog rendered by a Fusion web application page allows the end user to change values in the ADF Table component without entering incorrect data.

In addition to configuring the DoubleClickActionSet, you may configure the ADF Table component's RowData.CachedAttributes property to reference attribute binding values if you want:

  • End users to modify values in the Fusion web application's page that you do not want to appear in the ADF Table component of the integrated Excel workbook

  • An ADF Table component's column to be read-only in the integrated Excel workbook

  • Cache data in an ADF Table component over one or more user sessions that is not visible to end users but is modified by a pick dialog

    For example, an ADF Table component displays a list of product names to end users. A pick dialog is invoked that refreshes the list of product names in the ADF Table component and, as part of the process, sets the value of product IDs. In this scenario, you specify the attribute binding value for the product ID in the ADF Table component's RowData.CachedAttributes property. After the action set executes, the ADF Table component displays the refreshed list of product names in the rows of the Excel worksheet and references the associated product IDs in its RowData.CachedAttributes property.

For information about populating values in the pick dialog, see the "Creating Databound Selection Lists and Shuttles" chapter in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

To invoke a pick dialog from an ADF Table component:

  1. Open the integrated Excel workbook.

  2. Select the cell in the Excel worksheet that anchors the ADF Table component and click the Edit Properties button in the Oracle ADF tab to display the property inspector.

  3. Configure the ADF Table component's RowData.CachedAttributes property to reference attribute binding values.

  4. Click the ellipsis button (...) beside the input field for Columns to display the Edit Columns dialog.

  5. In the Members list, select the column from which the end user invokes the pick dialog at runtime.

  6. Configure the Actions attribute of DoubleClickActionSet of the column subcomponent (UpdateComponent or InsertComponent), as described in Table 8-4.

    Table 8-4 DoubleClickActionSet Properties

    Add this action...To...

    ADFmAction

    (InsertComponent only) Invoke the CreateInsert action binding if the end user invokes the DoubleClickActionSet from a newly created row in the Excel worksheet's ADF Table component. In this scenario, the ADF Table component's RowUpSync action (invoked in the next action) fails if the Fusion web application does not contain a placeholder row.

    ComponentAction

    Invoke the ADF Table component's Table.RowUpSync action to synchronize any pending changes in the current row of the ADF Table component to the Fusion web application.

    Dialog

    Configure the Dialog action to invoke the pick dialog page from the Fusion web application. Set the Dialog action's ShareFrame property to True. For more information, see Section 8.4, "Displaying Web Pages from a Fusion Web Application."

    ComponentAction

    Invoke the ADF Table component's Table.RowDownSync action to synchronize data from the row in the ADF Table component's iterator in the Fusion web application that corresponds to the current ADF Table component row in the worksheet.

    ADFmAction

    (InsertComponent only) If you added a CreateInsert action binding, you should also invoke the Delete action binding to remove the placeholder row.


    Figure 8-21 shows the Edit Action dialog of DoubleClickActionSet properties.

    Figure 8-21 DoubleClickActionSet Properties

    The figure illustrates properties of DoubleClickActionSet.
  7. Click OK.

8.6 Creating ADF Databound Search Forms in an Integrated Excel Workbook

You can create forms in your integrated Excel workbooks using ADF Input Text and ADF Button components. End users can use the forms you create to insert data or query for information. This section uses the latter example to demonstrate how you create forms.

End users can enter a search term in the ADF Input Text component and retrieve matching results by clicking an ADF Button component. To present a more sophisticated user interface to end users for a search operation, you can invoke search forms from your Fusion web application. Results from these search operations can be downloaded to the ADF Table or ADF Read-only Table components in your integrated Excel workbook.

Figure 8-22 shows a design time view of the Oracle ADF components that the EditPriceList-DT.xlsx workbook in the Master Price List module uses to configure search options where:

  1. ADF Label component is used in a simple search form

  2. ADF Input Text component is used in a simple search form

  3. ADF Button component is used in a simple search form

  4. ADF Button component is used to invoke an advanced search form

Figure 8-22 Oracle ADF Components Used for Search in the EditPriceList-DT.xlsx Workbook

ADF components used for search in EditPriceList.xlsx

Note:

ADF Desktop Integration does not support usage of the FindMode attribute in page definition files. For more information about the FindMode attribute, see the "pageNamePageDef.xml" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

8.6.1 How to Create a Simple Search Form in an Integrated Excel Workbook

You insert an ADF Input Text component and configure it so that the end user can enter a search term. Insert an ADF Button component and configure its action set to:

  1. Take the value the end user enters in the ADF Input Text component.

  2. Query for the value.

  3. Download the results to an ADF Table or ADF Read-only Table component in the integrated Excel workbook.

Before you begin:

It may be helpful to have an understanding of ADF databound search forms. For more information, see Section 8.6, "Creating ADF Databound Search Forms in an Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To create a simple search form in an integrated Excel workbook:

  1. Open the integrated Excel workbook.

  2. Insert an ADF Input Text component in the Excel worksheet cell where you want the end user to enter the search criteria.

  3. Configure the ADF Input Text component so that it assigns the search term, that a user enters, to an attribute binding.

    Figure 8-23 shows an example from the EditPriceList-DT.xlsx workbook in the Master Price List module where an ADF Input Text component assigns the user-entered value to the searchTerm attribute binding. The searchTerm, which is a part of variable iterator, is then passed as a NamedData argument to the executeSimpleProductQuery method.

    Figure 8-23 ADF Input Text Component for a Simple Search Form

    ADF Input Text component for quick query search form
  4. Optionally, apply a style to the ADF Input Text component to indicate to end users that they can enter a search term in the cell.

  5. Optionally, create an ADF Label component in an adjoining cell to indicate to end users that they can enter a search term in the ADF Input Text component you created in Step 2.

  6. Create an ADF Button component in the Excel worksheet.

  7. Set the Label property of the ADF Button component so that it displays a string at runtime to indicate to end users that they can start a search operation by clicking the button.

  8. Open the Edit Action dialog to configure the array of actions (Action[]Array) in the ClickActionSet properties of the ADF Button component. Table 8-5 describes the actions to invoke in sequence.

    Table 8-5 ClickActionSet Properties of the ADF Button Component

    Add this action...To...

    Worksheet

    Invoke the UpSync worksheet action to copy the value entered in the cell that hosts an ADF Input Text or ADF List of Values component to the Fusion web application. For more information about worksheet actions, see Section A.13, "Worksheet Actions and Properties."

    ADFmAction

    Invoke an ADF Model action that is bound to the attribute binding you specified in Step 3. The ADF Model action queries for the end user's search term value referenced by the attribute binding.

    The corresponding example in the EditPriceList-DT.xlsx workbook is the executeSimpleProductQuery action binding, which is bound to the searchTerm attribute binding.

    Worksheet

    Invoke the DownSync worksheet action to synchronize any pending changes from the ­Fusion web application to the ADF Input Text, ADF Output Text, and ADF List of Values components in the worksheet. For more information about worksheet actions, see Section A.13, "Worksheet Actions and Properties."

    Component

    Invoke a Download action from the ADF Table or ADF Read-only Table components to download the results that the ADF Model action retrieved.


  9. Click OK.

    Figure 8-24 shows an example from the EditPriceList-DT.xlsx workbook in the Master Price List module where an ADF Button component invokes the executeSimpleProductQuery action binding using the search term the end user entered in the ADF Input Text component.

    Figure 8-24 ADF Button Component for Simple Search Form

    ADF Button component for quick query search form

8.6.2 How to Create an Advanced Search Form in an Integrated Excel Workbook

You use the ADF Button component to invoke a page from the Fusion web application that displays a search form to the end user. Configure the action set for the ADF Button component to invoke the Download action for the ADF Table or ADF Read-only Table component so that the search results from the search operation are downloaded to the integrated Excel workbook.

For information about creating a search form in a Fusion web application, see the "Creating ADF Databound Search Forms" chapter in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Before you begin:

It may be helpful to have an understanding of ADF databound search forms. For more information, see Section 8.6, "Creating ADF Databound Search Forms in an Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To invoke an advanced search form in an integrated Excel workbook:

  1. Open the integrated Excel workbook.

  2. Create an ADF Button component in the Excel worksheet.

  3. Set the Label property of the ADF Button component so that it displays a string at runtime to indicate to end users that they can start a search operation by clicking the button.

  4. Use the Edit Action dialog to configure the array of actions (Action[]Array) in the ClickActionSet properties of the ADF Button component. Table 8-6 describes the actions to invoke in sequence.

    Table 8-6 Actions to Invoke an Advanced Search Form

    Add this action...To...

    Dialog

    Display the page from your Fusion web application that contains the search form. For more information about displaying pages from a Fusion web application, see Section 8.4, "Displaying Web Pages from a Fusion Web Application."

    Component

    Invoke a Download action from the ADF Table or ADF Read-only Table components to download the results that the ADF Model action retrieved.


  5. Click OK.

    Figure 8-25 shows an example from the EditPriceList-DT.xlsx workbook in the Master Price List module where an ADF Button component invokes the Execute action binding to retrieve the values specified by the end user in the Master Price List's module Search page (excelAdvSearch.jspx). The ADF Table component's Download action downloads the returned values to the integrated Excel workbook.

    Figure 8-25 ADF Button Component for an Advanced Search Form

    ADF Button component for query search form

8.7 Adding a Form to an Integrated Excel Workbook

You can use the ADF Desktop Integration components described in Chapter 6, "Working with ADF Desktop Integration Form-Type Components," to create forms in your integrated Excel workbook. These components can be useful when you want to provide end users with functionality that allows them to view and edit individual fields rather than use the functionality provided by the table-type components to download rows of data from the Fusion web application. Use one or more of the following components to create a form:

  • ADF Button

    Use this component to provide end users with a button that can invoke a ClickActionSet. Figure 8-26 shows an ADF Button labeled Search that invokes a search operation using the search term entered by the end user in the ADF Input Text component.

  • ADF Input Text

    Use this component to provide end users with a read/write field where the current value of a binding appears. This component can also be used to input a value, as in the example illustrated in Figure 8-26, where users enter a search term in the ADF Input Text component.

  • ADF Output Text

    Use this component to provide end users with a read-only field where the current value of a binding appears.

  • ADF List of Values

    Use this component to provide end users with a dropdown menu from which a user can select a value from a list binding.

  • ADF Label

    Use this component to provide end users with instructions or other information on how to use the form you create. For example, the Master Price List module's EditPriceList-DT.xlsx workbook uses ADF Label components to display an instruction to end users and the number of matches for a search term. Figure 8-26 shows the runtime values of these components. The text Search For: is a label instructing end uses to enter the search string, and 8 records found label displays the number of records found matching the search string.

Figure 8-26 Runtime View of a Form in an Integrated Excel Workbook

Runtime view of a form in an integrated Excel workbook

You use the ADF Desktop Integration task pane to insert the components you require into a worksheet.

To create a form in an integrated Excel workbook:

  1. Decide which ADF form components you require for the finalized form and insert them in the Excel worksheet.

    For more information about these components, see Chapter 6, "Working with ADF Desktop Integration Form-Type Components."

  2. Configure the layout and appearance of the components you insert.

    For more information about configuring the appearance of components, see Chapter 9, "Configuring the Appearance of an Integrated Excel Workbook."

  3. Test your form.

    For more information about testing an integrated Excel workbook, see Chapter 13, "Testing Your Integrated Excel Workbook."

8.8 Creating Dependent Lists of Values in an Integrated Excel Workbook

ADF Desktop Integration provides the following components that you use to create lists of values in an integrated Excel workbook:

  • ADF List of Values

    You configure properties for this component when you want to create a list of values in the Excel worksheet.

  • TreeNodeList subcomponent

    You configure properties for this component when you want to create a list of values in an ADF Table component column.

Using these two components, you can create a dependent list of values in your integrated Excel workbook. A dependent list of values is a list of values component (referred to as a child list of values) whose values are determined by another list of values component (referred to as a parent list of values).

The server-side list bindings must be defined such that when the selected item of the parent list of values is changed, the available child list of values items are updated properly. Figure 8-27 shows an example with two illustrations from the AdvEditPriceList-DT.xlsx file of Master Price List module, where the Sub-Category column (child list of values) changes when the value in the Category column (parent list of values) changes.

Figure 8-27 List of Values and Dependent List of Values in Master Price List Module

The figure illustrates LOV and DLOV columns.

Table 8-7 describes the dependent list of values implementations you can create using the previously listed components and the requirements to achieve each implementation.

Some of the implementations described in Table 8-7 require model-driven lists. For information about creating a model-driven list, see the "How to Create a Model-Driven List" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Table 8-7 Dependent List of Values Configuration Options

ConfigurationRequirements

Render both the parent and child list of values in the Excel worksheet using ADF List of Values components.

Both instances of the ADF List of Values component must reference a list binding. One or both of the list bindings that you reference can be model-driven lists.

Both list bindings can reference model-driven lists only if the underlying iterator has at least one row of data. At runtime, if the underlying iterator has zero rows of data and the end user selects a value from the parent list of values (list binding referenced by the ADF List of Values component's DependsOnListID property), the child list of values (list binding referenced by the ADF List of Values component's ListID property) does not get filtered based on the value the end user selects.

To work around this scenario, choose one of the following options:

  • Ensure that the underlying iterator has at least one row of data

  • Use an alternative list binding configuration where you expose multiple iterators and all necessary iterators get refreshed

For more information, see Section 8.8.1, "How to Create a Dependent List of Values in an Excel Worksheet."

Render both the parent and child list of values in ADF Table component columns using TreeNodeList subcomponents.

Both the parent and child list of values (TreeNodeList subcomponents) must reference tree binding attributes associated with model-driven lists.

For more information, see Section 8.8.3, "How to Create a Dependent List of Values in an ADF Table Component's Columns."

Render the parent list of values in an ADF List of Values component and the child list of values in an ADF Table component column using the TreeNodeList subcomponent.

The child list of values (TreeNodeList subcomponent) must reference a tree binding attribute associated with a model-driven list. The parent list of values (ADF List of Values component) must reference a list binding.

For more information, see Section 8.8.5, "Creating a Dependent List of Values in an Excel Worksheet and an ADF Table Component Column."


Note the following points if you plan to create a dependent list of values:

  • When the cell value referenced by DependsOnList or DependsOnListID is changed, ADF Desktop Integration overrides any previous changes to the child component list of values without warning the end user.

  • The dependent list of values does not work unless the list specified in the DependsOnList (or DependsOnListID) property is referenced by a component in the Excel worksheet.

  • If a circular dependency is defined (List A depends on List B, and List B depends on List A), the first dependency (List A depends on List B) triggers the expected behavior. ADF Desktop Integration considers other dependencies to be misconfigurations.

  • You can create a chain of dependencies as follows:

    • List A depends on List B

    • List B depends on List C

    In this scenario, a change in List C (grandparent list of values) updates both Lists A (grandchild list of values) and B (child list of values). If you create a similar scenario, you must ensure that both the grandchild list of values and the child list of values, get refreshed whenever the parent list of values selection is changed. You can do this by specifying the two bind variables on the grandchild list of values to set up an implicit dependency between the view attributes. Another way is to declare explicit attribute dependencies between each of the view attributes that have model-driven lists configured. For example, specify that attribute A depends on attribute B and attribute C, and attribute B depends on attribute C.

  • Caching in a dependent list of values is discussed in Section 15.4, "Caching Lists of Values for Use in Disconnected Mode."

  • ADF Desktop Integration caches the values that appear in a dependent list of values. Hence, the dependent list item values for a given parent list selection must remain constant across all rows of an ADF Table component.

8.8.1 How to Create a Dependent List of Values in an Excel Worksheet

Use two instances of the ADF List of Values component to create a dependent list of values in an Excel worksheet.

Specify the list binding referenced by the parent ADF List of Values component as a value for the child ADF List of Values component's ListOfValues.DependsOnListID property.

For more information about ADF List of Values, see Section A.5, "ADF List of Values Component Properties."

Before you begin:

It may be helpful to have an understanding of dependent list of values. For more information, see Section 8.8, "Creating Dependent Lists of Values in an Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To create a dependent list of values in an Excel worksheet:

  1. If not present, add the required list bindings to your page definition file.

    For more information about adding bindings to page definition files, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

  2. Open the integrated Excel workbook.

  3. Insert two ADF List of Values components into your integrated Excel workbook, as described in Section 6.6, "Inserting an ADF List of Values Component."

  4. Display the property inspector for the ADF List of Values component that is to serve as the parent in the dependent list of values and set the value of the ListOfValues.ListID property to the list binding that is the parent.

  5. Display the property inspector for the ADF List of Values component that is to serve as the child in the dependent list of values and set its values as follows:

    • ListOfValues.ListID

      Specify the list binding that is the child in the dependent list of values.

    • ListOfValues.DependsOnListID

      Select the list binding that you specified for the ADF List of Values component that serves as a parent in Step 4.

      Figure 8-28 shows the property inspector for the child ADF List of Values where the CountryId list binding is specified as the parent list of values and StateId list is the dependent list of values.

      Figure 8-28 Design Time Dependent List of Values in an Excel Worksheet

      Design Time Dependent List of Values in an Excel Worksheet
  6. Click OK.

8.8.2 What Happens at Runtime: How the Excel Worksheet Renders a Dependent List of Values

At runtime, ADF Desktop Integration renders both instances of the ADF List of Values component. When the end user selects a value from the parent list of values, the selected value determines the list of values in the child list.

Figure 8-29 shows an example where StateID, a dependent list value, displays only the states from the selected CountryId list value.

Figure 8-29 Runtime Dependent List of Values in an Excel Worksheet

Runtime Dependent List of Values in an Excel Worksheet

8.8.3 How to Create a Dependent List of Values in an ADF Table Component's Columns

Use instances of the TreeNodeList subcomponent to render both lists of values in a dependent list of values in ADF Table component columns at runtime.

Specify a tree binding attribute as a value for the parent TreeNodeList subcomponent's List property. You also specify a tree binding attribute as a value for the child TreeNodeList subcomponent's List property and the same tree binding attribute referenced by the parent TreeNodeList subcomponent as a value for its DependsOnList property.

Ensure that both tree binding attributes are associated with model-driven lists before you add the tree binding to your page definition file. For information about creating a model-driven list, see the "How to Create a Model-Driven List" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework. For information about adding a tree binding to your page definition file, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

For information about the TreeNodeList subcomponent, see Section A.6, "TreeNodeList Subcomponent Properties."

Before you begin:

It may be helpful to have an understanding of dependent list of values. For more information, see Section 8.8, "Creating Dependent Lists of Values in an Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To create a dependent list of values in an ADF Table component:

  1. Open the integrated Excel workbook.

  2. If not present, insert an ADF Table component.

    For more information, see Section 7.3, "Inserting ADF Table Component into Excel Worksheet."

  3. Display the property inspector for the ADF Table component and invoke the Edit Columns dialog by clicking the ellipsis button (...) beside the input field for TableColumn[] Array.

  4. If not created, click Add to add a new column to serve as the parent list of values. For more information about creating a list of values, see Section 7.13, "Creating a List of Values in an ADF Table Component Column."

  5. Add a new column to the ADF Table component to serve as the child list of values in the runtime-dependent list of values. For more information about creating a list of values, see Section 7.13, "Creating a List of Values in an ADF Table Component Column."

  6. Specify the tree binding attribute of the parent list of values as a value for the DependsOnList property.

    Figure 8-30 shows the property inspector for a child ADF Desktop Integration Tree Node component, where the ParentCategoryId tree binding attribute is specified as the parent list of values.

    Figure 8-30 Design Time Dependent List of Values in an ADF Table Component's Columns

    Design Time Dependent List of Values in Table Component
  7. Click OK.

8.8.4 What Happens at Runtime: How the ADF Table Component Column Renders a Dependent List of Values

At runtime, the ADF Table component renders both instances of the TreeNodeList subcomponent in the columns that you configured to display these instances. When the end user selects a value from the parent list of values, the selected value determines the list of values in the child list.

Figure 8-31 shows an example where the value that the end user selects in the Category column list of values results in the corresponding values for sub-category appearing in the Sub-Category column list of values.

Figure 8-31 Runtime Dependent List of Values in an ADF Table Component's Columns

Runtime Dependent List of Values in Table Component Columns

Note:

If the child list and the parent list are bound to columns in the same ADF Table component, the child list items are changed for the current row only, when the end user changes the parent list selection.

8.8.5 Creating a Dependent List of Values in an Excel Worksheet and an ADF Table Component Column

Use an instance of the ADF List of Values component and an instance of the TreeNodeList subcomponent to create a dependent list of values where you render the parent and the child list of values.

  • Parent list of values in the Excel worksheet

    An instance of the ADF List of Values component renders the parent list of values in the Excel worksheet.

  • Child list of values in an ADF Table component column

    An instance of the TreeNodeList subcomponent renders the child list of values in the ADF Table component column.

Specify a list binding as a value for the parent ADF List of Values component's ListID property. You specify a tree binding attribute as a value for the child TreeNodeList subcomponent's List property, and the same list binding referenced by the parent ADF List of Values component as a value for its DependsOnList property.

Ensure that the tree binding attribute is associated with a model-driven list before you add the tree binding to your page definition file. For information about creating a model-driven list, see the "How to Create a Model-Driven List" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework. For information about adding a list and tree binding to your page definition file, see Section 4.3, "Working with Page Definition Files for an Integrated Excel Workbook."

For more information about the ADF List of Values component, see Section A.5, "ADF List of Values Component Properties." For information about the TreeNodeList subcomponent, see Section A.6, "TreeNodeList Subcomponent Properties."

Before you begin:

It may be helpful to have an understanding of dependent list of values. For more information, see Section 8.8, "Creating Dependent Lists of Values in an Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To create a dependent list of values in an Excel worksheet and an ADF Table component column:

  1. Open the integrated Excel workbook.

  2. Insert an ADF List of Values component into your integrated Excel workbook, as described in Section 6.6, "Inserting an ADF List of Values Component."

  3. Display the property inspector for the ADF List of Values component and set the value of the ListID property to the list binding that is to serve as the parent list of values in the dependent list of values.

  4. Click OK.

  5. Display the property inspector for the ADF Table component and invoke the Edit Columns dialog by clicking the ellipsis button (...) beside the input field for TableColumn[] Array.

  6. Click Add to add a new column to the ADF Table component to serve as the child list of values in the runtime-dependent list of values.

  7. Choose the appropriate option for the newly created column:

    • Click the ellipsis button (...) beside the input field for InsertComponent to configure the runtime list of values for insert operations.

    • Click the ellipsis button (...) beside the input field for UpdateComponent to configure the runtime list of values for update and download operations.

    In both options, the Select subcomponent to create dialog appears.

  8. Select TreeNodeList and click OK.

  9. Expand the property that you selected in Step 7 and configure values as follows:

    • Select the same list binding that you specified as a value for the ADF List of Values component's ListID property in Step 3 as a value for the DependsOnList property.

    • Select a tree binding attribute associated with a model-driven list for the List property.

    • Configure the ReadOnly property as desired.

  10. Click OK.

    Figure 8-32 shows the property inspector for a child ADF Desktop Integration Tree Node component where the countryList list binding is specified as the parent list of values.

    Figure 8-32 Design Time Dependent List of Values in an Excel Worksheet and an ADF Table Component's Column

    Design Time Dependent List of Values in Table and Worksheet

8.8.6 What Happens at Runtime: How the Excel Worksheet and the ADF Table Component Column Render a Dependent List of Values

At runtime, the ADF List of Values component renders the parent list of values and the ADF Table component renders the child list of values in the column that you configured to display the TreeNodeList subcomponent. When the end user selects a value from the parent list of values, the selected value determines the list of values in the child list.

Figure 8-33 shows an example where the value that the end user selects in the CountryId list of values determines the list of values that appears in the StateId column of the ADF Table component.

Figure 8-33 Runtime-Dependent List of Values in an Excel Worksheet and an ADF Table Component's Column

Runtime Dependent List of Values in Table and Worksheet

Note:

When the parent list is bound to a cell in the worksheet and the child list is bound to an ADF Table Component column, the child list items are updated for all rows in the table when the end user changes the parent list selection.

8.9 Using EL Expression to Generate an Excel Formula

You can use an EL expression to generate an Excel formula as the value of an ADF component. For example, you can use an Excel HYPERLINK function in an EL expression. If you use the Excel HYPERLINK function in an EL expression, you must enclose the HYPERLINK function within an Excel T function if you want an Oracle ADF component, such as an ADF Output Text component, to display a hyperlink at runtime.

You enclose the HYPERLINK function because ADF Desktop Integration interprets the Excel formula. To work around this, you wrap the T function around the HYERLINK function so that the value of the HYPERLINK function is evaluated by the T function. The resulting value is inserted into the Excel cell that the ADF component references. Use the following syntax when writing an EL expression that invokes the HYPERLINK Excel function:

=T("=HYPERLINK(""link_location"",""friendly_name"")")

For example, the following EL expression uses HYPERLINK function to navigate to http://www.oracle.com when end user clicks the component.

=T("=HYPERLINK(""http://www.oracle.com"", ""#{bindings.ProductId.inputValue}"")")

If you write an EL expression using the HYPERLINK function, it is recommended that you select the Locked checkbox in the Protection tab of the Format Cells dialog for the custom style that you apply to prevent error messages appearing.

8.9.1 How to Configure a Cell to Display a Hyperlink Using EL Expression

You write an EL expression that uses the Excel T function to evaluate the output of the Excel HYERLINK function. The following task illustrates how you configure an ADF Output Text component to display a hyperlink that, when clicked, invokes a search operation on the Oracle OTN Discussion Forum for Developer Tools using the value of the ProductName binding as the search term.

Before you begin:

It may be helpful to have an understanding of dynamic hyperlink. For more information, see Section 8.9, "Using EL Expression to Generate an Excel Formula."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To configure a cell to display a hyperlink using EL expression:

  1. Open the integrated Excel workbook.

  2. Insert an ADF Output Text component into the Excel worksheet.

  3. Write an EL expression for the Value property of the ADF Output Text component.

    The EL expression that you write invokes the Excel HYPERLINK function and uses the Excel T function to evaluate the output. In our example, we entered the following EL expression for the Value property:

    =T("=HYPERLINK(""http://forums.oracle.com/forums/search.jspa?objID=c19&q=#{bindings.ProductName}"", ""#{bindings.ProductName}"")")
    

    Note:

    Excel requires that you write double quotes (for example, ""#{bindings.ProductName}"") in the EL expression so that it can evaluate the expression correctly.

  4. Click OK.

8.9.2 What Happens at Runtime: How a Cell Displays a Hyperlink using an EL Expression

ADF Desktop Integration evaluates the EL expression that you write at runtime. In the following example, ADF Desktop Integration:

  • Retrieves the value of the ProductName binding

  • Inserts the value of the ProductName binding into a URL

  • Inserts the result into a hyerlinked cell that a user can click to invoke a search

Figure 8-34 shows the runtime view of the example configured in Section 8.9.1, "How to Configure a Cell to Display a Hyperlink Using EL Expression," where Zune 30GB is the retrieve[,d value of the ProductName binding. When the end user clicks the cell that hosts the ADF Output Text component, he or she invokes a search operation for Zune 30GB on the Oracle OTN Discussion Forum for Developer Tools.

Figure 8-34 ADF Output Text Component Configured to Display a Hyperlink

Output Text Component Configured to Display a Hyperlink

8.10 Using Calculated Cells in an Integrated Excel Workbook

You can write Excel formulas that perform calculations on values in an integrated Excel workbook. Before you write an Excel formula that calculates values in an integrated Excel workbook, note the following points:

  • Formulas can be entered in cells that reference Oracle ADF bindings and cells that do not reference Oracle ADF bindings

  • End users of an integrated Excel workbook can enter formulas at runtime

  • You (developer of the integrated Excel workbook) can enter formulas at design time

  • During invocation, the ADF Table component actions Upload and RowUpSync send the results of a formula calculation to the Fusion web application and not the formula itself

  • Excel recalculates formulas in cells that reference Oracle ADF bindings when these cells are modified by:

    • Invocation of the ADF Table component RowDownSync and Download actions

    • Rendering of Oracle ADF components

  • The ADF Table and ADF Read-only Table components insert or remove rows as they expand or contract to accommodate data downloaded from the Fusion web application. Formulas are replicated according to Excel's own rules.

  • You can enter formulas above or below a cell that references an ADF Table or ADF Read-only Table component. A formula that you enter below one of these components maintains its position relative to the component as the component expands or contracts to accommodate the number of rows displayed.

For more information about Excel functions, see the Function reference section in Excel's online help documentation.

8.10.1 How to Create a Column That Displays Values Generated by an Excel Formula

You insert a column that displays values calculated by an Excel formula directly into a worksheet using the menu options on Excel's Ribbon. You cannot add a column that displays calculated values using the collection editor that manages columns for an ADF Table or ADF Read-only Table component.

Before you begin:

It may be helpful to have an understanding of how to use calculated cells in an integrated Excel workbook. For more information, see Section 8.10, "Using Calculated Cells in an Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To create a column that displays values generated by an Excel formula:

  1. In design mode in the Excel worksheet, select the cell in which you want the column that displays the values generated by the Excel formula to appear at runtime.

    For example, the H15 cell of EditPriceList-DT.xlsx contains a formula:

    =G15-F15

    Cell G15 is the design time reference for the ADF Table component column labeled List Price at runtime, and F15 is the design time cell reference for the ADF Table component column labeled Cost Price at runtime.

    The H14 cell marks the header for the formula. It contains an ADF Label component with its Label property set to the following EL expression:

    #{res['excel.difference.label']}

    The EL expression retrieves the value of the excel.difference.label string key at runtime.

    Figure 8-35 shows the design time view of the manually inserted column, with the Excel formula appearing in the formula bar, and the ADF Label component that retrieves the string key value from the resource bundle at runtime.

    Figure 8-35 Design Time View of Column That Displays Values Generated by an Excel Formula

    Design-time View of Column Displaying Excel Formula Output
  2. Save your changes using Excel's Save button.

8.10.2 What Happens at Runtime: How Values of an Excel Formula Are Displayed in a Column

At runtime, Excel replicates and adjusts its formula as the ADF Table and ADF Read-only components expand or contract so that the correct value appears in each row of a manually inserted column. Figure 8-36 shows an extract of the runtime view of the example that appears in Figure 8-35 where Excel adjusted the formula so that it evaluates each corresponding row.

Figure 8-36 Runtime View of Column That Displays Values Generated by an Excel Formula

Design-time View of Column Displaying Excel Formula Output

8.10.3 How to Calculate the Sum of a Table-Type Component Column

The following task illustrates how you use the Excel functions SUM and OFFSET to calculate the total of the column labeled Difference in the EditPriceList-DT.xlsx of the Master Price List module at runtime. You use the OFFSET function in an Excel formula that you write where you want to reference a range of cells that expands or contracts based on the number of rows that an ADF Table or ADF Read-only Table component downloads. The SUM function calculates the total in a range of Excel cells.

Before you begin:

It may be helpful to have an understanding of how to use calculated cells in an integrated Excel workbook. For more information, see Section 8.10, "Using Calculated Cells in an Integrated Excel Workbook."

You may also find it helpful to understand functionality that can be added using other ADF Desktop Integration features. For more information, see Section 8.1.2, "Additional Functionality for Adding Interactivity to an Integrated Excel Workbook."

To calculate the sum of a column in an ADF Table component:

  1. In design mode in the Excel worksheet, select the cell in which you want to write the Excel formula. In EditPriceList-DT.xlsx, this is the cell with the reference, H16.

  2. Write the Excel formula that performs a calculation on a range of cells at runtime. For example:

    =SUM(OFFSET(G14,1,0):OFFSET(G15,-1,0))

    where SUM calculates the total of values in the range of cells currently referenced by G14 and G15.

    Figure 8-37 shows the design time view of the Excel formula in the integrated Excel workbook.

    Figure 8-37 Design Time View of Excel Formula in an Integrated Excel Workbook

    Design-time View of Excel Formula in an Integrated Workbook
  3. Save your changes and switch to runtime mode to test that the Excel formula you entered evaluates correctly.

8.10.4 What Happens at Runtime: How Excel Calculates the Sum of a Table-Type Component Column

Figure 8-38 shows the runtime view in the integrated Excel workbook when the Excel formula shown in Figure 8-37 is evaluated. The Excel formula calculates the total of the values in the range of cells that you specified in design mode. The cell references that appear in Excel's formula bar at runtime (H14 and H61) differ from those that appear in the formula bar at design time (G14 and G15) because the ADF Table component has moved and expanded to include the rows of data that it downloads.

Figure 8-38 Runtime View of Excel Formula in an Integrated Excel Workbook

Runtime View of Excel Formula in Integrated Excel Workbook

8.11 Using Macros in an Integrated Excel Workbook

You can define and execute macros based on Excel events in an integrated Excel workbook.

Note the following points:

  • Macros triggered by an Excel event do not get triggered if the Excel event is invoked by ADF Desktop Integration.

  • ADF Desktop Integration code invoked by an Excel event is executed when the Excel event is triggered by a macro.

PK 3]t,[,PK.[E"OEBPS/img/metadata_tampercheck.pngs쌉PNG  IHDREYP pHYs+ IDATxy|Uss@,jPdUٔ*Pu]^EV[hb_[[[QրREAd,ݗ3?&&3g{s3g3̜93gVeۑ(A݂\?|fS'P*G#*Z}Uw/stl_s:TI(syf# !E%Jq߼+x-#>pUU*@Q-q5Pt^*wV'>tpڞLjK"oFo|{P׬YӿJͻA[&*--`xo4ͽtZL$+ǁ`f,+d7O9rvIn OQs]%OWiZjV|/+_ʤ%eNxu+'k?Zd" ^-kf\{w5X GϦ O7E)7_{њۓۚEhZz2O&Җ=|w)Ǐej(j%vd]|wc잗\x}՞W_}Wޓ+w2K ^-2«D{I^$VdCdҊjO~N ReѮB8 5ԱY`~_ ^,:ڲeIuu-{MA@}}Aѻ%uL-Dġ'/]y.yK{ZIfX={Owބ).YPսrߤa4Qvɑ#G \ZḫnEQM>x}o^~Ʌ]RVf['m9y@8˖-0a_}AvhZ?A_KBCkmnnmon=v %xlFmL,z)+دEʟ} =YWWgE\q &pcv>NM.nJ_j()ߢ,Zے$v:w጑ /-|Kg_n:BH`&#?x\pyޓC ;w%X`z`^B *** i6JȉLO8&@An|EڃGE$8i`:r[*!J(bq>VݻwABp8L%v kfo$ۜ͢s(Ԥ=N&:,L⥗`qro{b:ZsI2Z.L;P(DIMgP8`q|3űfG {ߓؚ˻^5 ythCh }&C.u"ϼŋӉ.IJZ5Cm3y9V|BF6VFag%x}b{Ry|r:P63%Awޓz+So=hc~ZXeq2JBͯ6Vy˷ }3VKZގ&6Əi@XKƤG^SEvqkI'ր/;M ,blKr5mO~b-\ZlkGEe4f: kկc)o|bSe0v@ћk~ LQ؄^65Wax}{8dfIgԆ_UU5Lvͭ ׯ?}Wly9oiy( Y^o{Z6:-*fUTjYpp8E@SSwϤjwڵknחZZZnAII :֖/=/z.l^+U{2'B۴\oNȷ#G*LWwe\;\6m gHoCu1M}ٽ?9DP>oltg*΍)ںGt_qA]m:_~??{3+[Ggv=v<vFh NM mOmdT>;ϸnC\gt3r=}Rz쩪C o' !RܲˇѯЗY"&ua_7K 477ˑc1uno?+T!fʽr'7JzwyQU:`DV%%%C 9[N&M6ګk[}.alj KsדZwΝ;@l BuvbkwcV@nbc$ ]vǼ|Uc ̣E֭[u)..N&tV[NE ˖ޒrL[AG"OD"d۩)/ Y"?[U^<2%;Bƕr2-B@yK>żzt67֧mjqg2|=R*>Pش0zg襼XG>);3,Wni;3L@hXS76; \6Td&Wz 2k5d.z:14n۱}#.3Y?y*Y`s۳$khXCi {&mE48:(mV| tKÙ|$n =ׇo+^0 CJ5Q=-mRHj;ޖ9X~_jժQ:ze[omփE(o]VIr2m~h k۶m kB%s~1;jE},d*XQ aizg08pq7V~ܸ\۷oyݷUem].Ѐ3H{M5ԼYV4Ge@˖-[zXw|@E֙/V嬳Ϊ%sO/fIݞ9sc;.nokdڴ_Xw\Zzbf+Dį_sK!Ę` @# ZܻaAE'ݎwxAtzFVRSS7A5aۓ_ 80jn2}'oΝK g/bz67K>i-g=z_nĉ<ӻQvy]xD]lwK,>}zBr˚5kFiͭwacFc1iS7?+Q0ygɤ:JKKG8.GAc,6Ueevy&gRYyH#sƛ]Ǚpً GS,i2 rmI@(D"Qh7͐NJ-P(0v ~6,QLo밑9+[Mgۻ?^N7$&ÀL~Q$Z: 6e|>ѫLN<@[AhnӚnʔViY9}BJ WKOl>0ÌԌ5eswsŴ礲~6E5i6^9<҆ ݭFmi9Tv}RaB-#:\\{n} Ѵ4V+#p 2 ԙ4i.aχ+ q NgřWyfh%wM]=O>1Ƈ6 )/?@ezZsŔ}w3z/u&3Oxԝ<$9rŋ^Cgu)Ē>qU5˗/rjjj^x_^TlvZ ¯Yia~OKMi-tv߿Ё SD RkEA@vYy^S=MvP w̳ yu#ѣ0;nj|k.m(zҜ97KҴ+rA•&xg8ymL4UE?`'&.^ظJA?~l->e>&P^xK.1vbSЮd .Uc|X~Bf(B,Wʍ#Ld!ef b^X/L0wMG(B~6xz7j@0ff{V1@,ܠ2[5 X߶l`+&|s<7K`vm8Е[7:z:Gbǩ3tIm!LϷDW?z,tW4+zLR?o#3-^:Cf2mCڊisPk(SdxTf̘lN}`xRb1)_jE]Jd7D}N4KSVZJONt5y]v 6 n6`;e6ޥ M0ӻ݉Jf8 Aaji%ML=A=N 6[7dذd2q=O?[aߓ5۷ogfmۘZR;wׯ*G"ߟR$UmGsBSYYip׫Z⊚w5w3 !$ِF5W?U`|{)}מ{4঱UFj<v6$n[Eͼ3ᗺd~v,IҡFB9솲p6f[po8{wdc*vdȐL#Ættv2EoQnQ`*#@'ڕEwY:]黤pW6sݹC H.ʹX?`C5d!Ik1a7/ٳaA1iAŷqbޣ -܎ ھH 4(k5AP q CHNLBuZ6gΜ<.*dJaDIxAuӾ_GQp@0XJy rՌ[JKK \!DANI+ihFYUUr766Zq ĕ***ֆTU7 h4u|([GNTј׊Di(;YCoXP3HPU‚X)xv0CPU-pDUU˄Sjp7D/˴"9w#, L#13MWN&@yyY6sP(Q9#G-w]v?Su*-L1!uw2<[r!:2bq$Ry&v[9KGVݕsأPlv,v~]E֔|DHK ||fZ1A*qd˟͎Gh_Nu-Y=͈G$m?.*hl kGl1;G]z# BzXvо鱎~7FMMcNzs ߈Xy+/2kQs}n /e1&wKO󴦦FGS IDATMg.'@}D ȇiͰ˖,@cs;-fвbzьY(O[ 㰥Qe˚-TKPJO,E dySljhj&KILלbRST挘90 gѦnH항yx_g|Q3*&H0m\`bJVdx4Y ӻ-}| ?wyYC>"ybfWqLG6r1 +{?4H&qGM<*ARyU ksz,4SRHR^3]f`Rc`!3,xПcj``.5n&YnZxyl1"9{~ ⻝UMˌG]5H~sxi&[J3Rzhe^DNn﬊ Õ ׷&e_2鿕i5]!cA --ac3@(\{_e+ȟ.z&S 揻8Y^3Db'G{Ap .'+9E-XxqoP֣Jn zGOp=s 8c}e^dfҾ'@S+V8]TAs@A/,,}2Xww;;^pV(Hck6YIcҔi#Kͻƿ֙^OZQ0FxhѶyw=I҈N*!rBn6+Bﮦ5=;?:C0k𫯾̠ǻĻU̾% ?Br)A^YfnpE=SGDPRp+~p/{8å* |)[ꙍoe4Ӏ4?< +dpi*܊wCy#A|f S78h# u/ I퉅Kmz@;Z Q7,!~%w{YK.syКB驉AT6Q%Af˗˖}~#U{rfgu㿾G@;70gyd׋lcQO"RnMbO|9 G~SڀYGN:!#L z_B3$W/F&*!>NB>mYbk6?@7.1gi3g̵ {ZL)(7pCvg̘k!~1ʗsqZ 1.εpSO=P;E)IUPBJKJBH'gǏ 6dQBee%ulף25+p%_Y!bK+ޣ~=p+IW٘uNrúuC P8uLjSTk+h4iPlO*زe 0K*Z644P{zɜ^-ce dr_>PYY)[j != bR{_740Ǘ{`X_2nxg<} 9֌87jva:n(I%P׷W *䤤PۿmY3{H|gyGO;ݻw7bHIhI'dt9PT>L"UOC}6Y3)wiepf0p#ӣKGe;v, hhܵ[bfϾFk75SzvP:wl2aˏ \Xp͂~uZzdɒ[^:7A2ޥV̪U2yy+}^ۼy(֭['|rgW"mq0L<B10ܾwҳgT*b={f,i oB~8+z鞗K۷O>oSN9% K|w.BYĉ.̝u!|nBNKǏNuJ͚q`0Jq=:r\  V9v9;[~OoJZ<yNKKK%Kf.G'i˔x@ѡZѼ,)  XUUwZ:ɰl$©.= ڣP彎[by=HFHV3,cN+1 3ሿk}ZB_ /U& 6f2I- )0wAbGVM҄}ф[:¦KBE}Y2}mަK 5~N+ l4B# .saUU !T8AKGrSh,VpŅՠ&|9 yįTG"EQ`KK d#%cTNCl@H,Z HRY/j ߾Oˡ*ow@ֹS㱰yC`cdJH:RUnlj3RsGj_Κۼ+j{D1d:IBX,ڲwF_ );Arȅgu\ 1]ӷO@$Nk!$m ֙|eW6%0䲑mxQi @ A9餒ֽ/?K4[~{iG-}qW߸plޙ̍GRĮ-5:Pӫ Xuy'$$ 5rٗ?1EX!eg7`]ɕ(@?A UݺuPÉRQ^z1XuNZ7) :. ;u*ق&El."lO#G*tqp8lEF#xNTTTd=ttkP(d02VAv1c,EQSk̂J'O߽cNy莛B!Z(UzE<9Xx`d+iseD%MC/$,^0z @DۨvSy\Q~4LX : ! +o̒4@!VPU L>L; < '2GQ]i-c555"ȣrQQBIkh体!H@e ȑ#Gq,:z-Rj*Ec4 2c"ܼ~p<$@=w`n@*(o8@+Nk_U5557+ʳfEy3&f} ph=媶g.`C|y^*.gEw܌n4m?J s + AxgBzI"+.K0tr<̅ Cvivi "~mٲ%G H"tŵ+ݻ: !Hitpb 7$C% A2A6hAcf/DKXҲNGX]]]6C:2 `{fH_|ǽ-f|31 p!>%R]6T*/2y)hd2I]erXy+9+hӒ!AUfq*RK\ZZJmUUڐ-xqq1 K^2e"K9z.yq TUUQCccxۣCOE52FzfGVe 3qhJ + e ;fhS4c9ʂhL#L_V Xb J2VTPT3@y'Jf޸0P6d(zڎD"HYU^k@'KMdgfv)+ .~ɖLVՋwCz#šp`c#.ԋq21v߬I}^ïDFm?Bn>;<1XVO[ͅ:82Q[Eۡ% 1un ej3Y 'lte &bdQl~TCK(7ԷbzQg/YrA@Ek'hVD޹!CFۡW_V*-FwpFa%dSW% yjT_>}3t(ץr!YwG!z@?-M ̱IA" Gbpcj3_%H$ /zf.M|3?",Ibk=D:(+ki""]q3 /H n+3-2 `tVt`e4Chj/`Qޠ2z(nnd|1>݅^y^1ͽ 6k bPdM ^9ߤ@oEP%*w7P Y S`A 7v!wUϿu6`/̜22w|6n& GjjhL Xϯ<]}ՠ^CU6yK {24KlC\(cY z*Co"+^< pncF94DanlRp$s`(O#H;I`>aFF3Y1dfZ`hߍ+J1˘*ef/_oh,} elF_z$4 8(b6|xil煷7WvlmNPFG/me/B +;9ߝo&'=i]~X|3|p+'bXQ=+!j'53f> @,3xyMRm!4Gf kcR^_]4KocKCM4Kbp[}0[W[C|S4wL ܵwO8k}!q=wi(X̐ +c=ixz̙V){=hhhx'S|m6rȑ#3=iAh6F#xN MqϞ=zjh ρz'ZKkl:, dI45nggRfd-ׯ_opM}{ro V'k7 5&BA SP+[gϞ={65k֬Y2k3Ag!ChI5kg T`1C:**fU+*nW֭;s|>{ƍ73bt 64o&旿姟~:xM6]}ø!4d&C 01 0|pk׮=_yWY q=  /tW0]7o>3_d.6Hkߤelذag޼y3!d]52m }ɔ7|q\nk(Ξ=tf [ EPldɒ%KZ xUJ0cƌ\>uuu,q}hTBض hf/|`0?hm 5/|V`<bǓ/t=\OT;'i\0%s}) o4bx<^ZZRhES*_jȢHKZe |7nS4Fc| X9L[M<.rFD1ȕΙ0E"QB 1 # ~Oncssar!رc|hsq,| LF#xϖu*me ͺGA*@$?_(c̚w[̋pW0ȡ zS)w|6<-`p6H~yF LC,i +M-+ /|hei`pk%>H6}~!wcx3< A<k3A A$>q!$Nu"HsXBnY'9 ɔPN6M}NÑ}8Ǐ~_ Fo\t&QKsCA<x6s jY''X!(_ZAɔֽv6D潶-T++JrGDiS7G4h@, dNi0p%  l|oiH=_mCs Hůr F*%^:o{{eUY2G>djNTU%'R4I'ɓaYDrIYIQU@LYso1LMI$ұh+V|{MO?FHÑ0Ee. ɂLA/ɍT2m35kwdR_%\zdH2E7VTdꬳNY/38{k[`Q@z|53^h`c*GSyfG$뮤d  Z{ZmfE  Z%SH$JƸX,\NP!x bi XlLo}ot%Sᅶo)f)D}ot%4uv4@W R*k drl7qWF,-pso }Y'tkePi|wlȱ_s+9wwv|c=+R>+v.U;T*3j$Kv9Yka Ɔ]o=W;PNEPe}՗_p#gۄoGA-Yԩo50%U=*ztY HCqS}+wlo],6:LQ>]3Fvd뭱:CA| d6n:EP % .^'wl>⋙  k$Sj4UKABWznEgxdBIH# l„ x]3Eh K\=o\u$L۹K( *$Sa*O>ՠ"R)jV惰Z_O Vh ;LԵ5=?~匡#A/R!D| VRAd^ϊ h*A$׌k԰^|m|dP[һgр/W}z}_UBb{u_=S $P@Q{T\I[cQ3AeN{;َm?X^VֳGhRUt*JWe!!A#i{TuRQ\R EQT5>~,t nRx>ۻ9':# /tֵsEy%V@@) JX"ƼxЮAAD(UpjP(P\UF RtVA4hP&;b}#G̵  H+uuuVf߈  >!ث******ݵ~-: IgBճhg Wϋ^ H3fن!ȷ X Ah؛Pȕ@*4A"}J , ]ʦML_RXtSs=GQV-XֺgB#@z6فu|FA'O6R}vSM_VթS:GQ9bDg^l8;멭j#5vd;ܩܫ?H )$w;5%)?L n~r\{iWZb)43uu Y"řӺx|Z]sU?h]9@,\xi쯧pq@#!x ٴiSa^9w7ݻ{UdfϞ4{ڵk}HsMgS(t Y#A] ,1$HÕg" O(ͻ$# JJJۗE}A6 8rȆ Dvt򚒒ݻgy 5&G=zȎ6١3ABqa?bA9X! gHOeA 'όk,ZQ7c|'EALp3V9_rw_aM yjm-A̱7~&=Ԇ]w uuuK,ɵ +}zF!֟!Θ1cFUd 9o^prbUUs`. !g&AHR쒙 hFG>)3ll !R d!,j/_kXإ5SG,N4Ox?>ىoShPURV)ѻee [\= $͔h4&'>0)ԋT2%ÕKdKєo 9m\y WiV˴X,1A`*D/\{ &p#@eoW|e0M @ES0)?J3sfY_EwƔ= f]ebŸ9HDhfjk[0Nt:LU*v@44DNA$$(!C]\DXv- KM6b1|i&& n4w^+Тjb Jn3M"$Ԩŋ\gO{uNB8ybҝ;w>qݭX-e|j/M†#^p;^ ١GMM Ip8 dŭws !.}o]ST9˗/ϵ B^P0xKj`)@j5NFދ^J<i.մѳ4k\4Z&8)^ftP yp'y"|WRq]eXz.G/,etwAX049-Mz742mdB|W6jOnJZOv1~(<9>8zS+ ![^y";ZoVhk^if&1K{Ώ@Ɣm ۛW\%G%KXg ʣץƏo̙3JjwA" 4yl&4gc+YWW7h ަSNy瓭',++K$VE @ `Q 566pҤ9~7!x߿ZrTU#HWvLJ!HIxlN-TH\kvay" ~<=u QZXN55WVCGX @_3ܸ?r,7nVD+٘-70]X N?Pg5< Ԉ-lw@)nr%Vd%#,77 A*nb+㠭<6օ}M.ͫ:s_q@Lbb 44 /H"J)nP%AڮْngѤ0iժePfVh4j/L<#K~{=??Gusss{y{?)k 9GkRL3Y@E0~c> q^H<eiҤӔ1\2&6OW:/nk|$P!g7n_{}uk@(d2&MhxS7۵-jF ]M-#]T$a]JlBӨbJ_Sh곸f!hX܀b.íe[L=G}іK&M]{omW\{Yc=Hx{D}OڝgFcTqfdU+QH6o 0(gl~ߏZg)F2c&đ1'-Ɵ""""~WOZȲء?VOo/rI]`FHmh\{k;}> ,=o߾hL1!A (d5bҪSF%8}jv2S+|u){z/_vjNOөi:ϳO]}L&? Mg(%?E[d_Tia>~Ghi>g*6ΖEIU<@+?1Ҙk|y]E*VZC4 }no&W}CO<{qBdQG? Ï.-bhQ4A֢^Śc 0WN\:Dz>Dmthr֫"Jաgngv ѣGG]d WLFD 7d@_nx2]T=bAQƓVmI:X!5RzKI241Fos2RyѭjKR%9EӢG7"nĉ'NpD{1,84JO%\UڿJ2cL}>ݝHJ=2\PF.J חqv>ivF57~c> q^,(/D9~0 OTVTv[,៵Ř'Tn@tf?{TĚ˸wsa&Ĭ5HU9i=TxN W|` 2H 1dhl.25Gũ2s車JC Unx`PM$.r!^8rTDI%& ynMx%IB[ 琘6D4#bI5,q1<ga?4">^RO+RMT5?w~ܧnA2H]-KS)vͨN7`x> U24-}Sun&~S*se]1꨾ȗSQzk.:5Y?Y޹$g7yF/Vʍ3VH]TQ|,>Fzj:3Gs%ň1CX} 'WL$ ~Q}&>D髭u6%5tIhd|Ǣ]Ej7!,L17b$~0پs]*fQ@_zqӪzJD4DbO*׫:FegS6ݤ7JU####QkQKb P~v4YӲ4©TqΜ9DdYV.'{lVucmmmQk;FFF`p,ߋZp?ԍ'&'-* E%-2/i66/˶6Ωa,l99Ī -SS۶檰p~rA 40+kO麯Xtݴ,˴,떼޿y?mgg,Lط:u*MjTQyYo5lmm%"L<3t^I^TAJ)^aU%U- $E7shtQov&顣Re8WݙΜXs-ziR-- 0U۶Ϝ9:bŊaN!"1dK[v.ټBS*r˄"+~Rb.)"Z=ss೟F=h&3"2MK>UW|iU+K >eT0Dz@]]O31'-G*T,FjxRQ2!kXWW'/jI}NQIrg!)e5ٲ %?_rkC5#.5Gi$<5G=u+3XEDwcOJ{~ΜwYʹ,䪛޹ic>peB! ԁ`YּyTGGGGhҥ5:ŋ6C*5x[R2kT)e:C.,6&˲*֭\th 5͹ 餛9qt:"B'SFG Q z%C*EDvcONH]ȝJ 7t)j"ig>F.4 #37O??>̆#dxx8А#G,^8kZL[[ۧ~w88zMI@dOEލK*~}knj&2T*ej瞺:hܹщOOkOtoQ6g^v3>>뷎.lijjlfZAJu).fƿrew>q5ϪeYNP,}a,<̀h,"Wҩ8_]w} J*xͲ/Vza}c9{loZ!W-Lnvw@Wƈl 6` D3؏ϣmQs󏚛+)bY`oo/ROOPU5-c!l}l/O-{_.ZdΝMMM\^ޞN}ݞ /cx>&u֓'OQGGG*ݿOO;37nܨ_ HsOsǽOty;/#oi˗/NGZbŦM,YhѢpNJ {d$*^ǏK3۶W\988L\l^F$|$#{xϯwӳ -[&7=ȴmn~:[rz:ڕP+q;=ȁE̯Q8Dlj?Jg"\SgQ ,#ilAR_lLMMq=Nځ1I\,\˧Tu;~qSm!ZEKzUuxԏQFBO",@&5q&ޙJyFT̾ ÈZ 3(^L7 Vd2&;%tvvFoP`>@/y^HO‹/jb*=_CQ0EsIVO}WJ嫟v6IrADl. Lfj31嶵fgcudyۙ ScBKRqY>9u byK/XuNC}*9Oh10em'aTF5Hx>P0$7HxaDzPfU5IENDB`PKAssPK.[E)OEBPS/img/worksheet_properties_button.pngVPNG  IHDRw\sPLTE  LBBBoop!"QU X!W$[(_,b,c--70f0g1?F2232345j68;6z7v8;G9n<>@GK@u@ARUAuDJQDxDyEG{H{KK~KLMMNw}NOUXPQVz}XYY\B\B\o\o\p\p\p\p\\\\abfkqwnx}qsu|B|B|B|}B}B}B}p}}}}}~BґҕopppppߩӪҺҺҺһҼҼӼӼ˸˹̺ͺ{Uc pHYs+IDATx͗ wEGiiE_ @A PѬ@ ;X$@yh),XZ-j 2h2 b'qgi=~gvfg=wウ~eeF:?:ް9? Ggj:/pV]@4zk%Sh-J|lb>R45o Hg>2myTLܪ'1LTZKaQ;V )aB0: t๚{LZym aJK_xѫ?`,`5FI3'2ݶ{vfxaLyFZM풷1bI5{HB z==7o~[#2=ғפO{٥ӋۓytS3I=v0VɁ>n/ T ZOJϚP5|b>0w`jbb755`ET-0+`ӞXG15v1"<öD `A})ne~hoO{ $!qyC*ΡP@r' B&| 'ǢsW^BgDdF4)mqj!ZaŻM_ve@s) 4{zzn\ `rJ:%_5q=Vx .oroH4_fWpڭ_vIJPzj |smZC}]Kΰu:Um AU]c5DDLW+> %og]GG%J%xÃ1>}bkk @+,wtr8l=uz~Dp/D+!spsnuBx!;rR6Q{ll6!];ea1=>kk;#%nnHHa<$(ͦ{=߷e~i>eEr"s{C]QXvI=V̦)Jl۷̙x;)___;=KH ˃67!n:=L%$Lزjώ΋ >V|d$,޼ 4?\@"a.rbs"*<{#>2NH񶶯v+@s8WT| ol VB}trj||&mrRknnp>rHXCz=@jO PL@J0yWf%FMs&z~fy4L`}Dfq2=0~ʧig'`X,$b$kx$&J""|pX9rU*^ȷ? -f3`atN0(鳦>#tMcfL͒"8d}ZyfH8r?_,AD3PeǿkGω$#=CD-3}FHdhq`วtGgL #XD,QX%r/bŠ 4 VN^W$l?GOlgT#w?4s6xJ7QZy9< mDwR m7RfrevnI{;#X,y-Tz_9&%,&䄫V9W&*^-ǏolMW#-[U]G2oD߾Z@Wut>\bw?07JRg}m,;Yhɾ;ee'qzSQuKհί⛿ǫy@鯿FI NDͶ&o$4+V.>pٖDPTWUmﵶQὟDFF66wopbMhRu뎽}>q~iK7qv^6/׺Zluj^hq`e45fpm]6lEYO8#sSBn&. ĞQeZ=w"VDpE%b   iv$G_h^c,Zhzxa9S"^R7.X\m A`/{0dn%h~ NsJ6t™fauHi7N2J !?Q5dV/M*eɵS$gl2g'#X1  >5h MQQ1dZbEGGs||"zT=˗3LHbY@ ΝKԕŅ=i V_.j9~N\]5%kOZvSמOeH^vQ_:tH(l_pE+K"2_6%$$ؘ˦71[g_%pGaƭpd~<3MeXǘ4e|ޜݗno:GR~"5}t%h1h,l"]2\طWEع)`U&mp/X5ki{ pE" T̙ |^#w&CA|~ȑ*Ubh$wŚK$X'6"b]8Ck482d.UX}ll-EFW"X1Ɗ"ѣmmV[ Ͷ[Lّ)r~}7&rݑuF /wA~MCR(bET)LQOV^tErOr۳dsr{^zqmi}kkQ4;7;aNwKC"4 㹩xxHJE,v!A0*Dێ;Z&pVKhu}!CC!CO쟞jaڨLT<<$" ǛolPnhm-nn<ɉn $NNnؘ|y7c mqRcs5qe2O]:u|_.RƆICR(b{Cpط-Ӗ$GJrӣU> ^ځN/T<<$O~ĉ--RacϬw}Ts:ׇ;J1hLWB8F /z}}Lu*RImBoɓϞ=F$9ѭgx{gNgв.IOwJps5~#"*RDo3L?tt+ƫbY7L_9*$*$"oWE>!!)E"y &ZbV3it^^_^w`g'4n1<"?wfUog :Z?s)I&GߎNM~nkQ ۡ!ɊFp.Np^Y,"W [_[֐3Qux;T<<$YQb)B0Ÿ?fy3KKt J7ng:m16C@CkyGT<<$)#.YC=l-/mdZqx׈I;1JK4y!Eۯuf'Cc>9C=C&8ٯ#!EX*Abb&E#HN8xK`Ÿ`$"IE'u'Uof˛rQ8CJWcItoߗ󬑺E,v 8W̏iO2;`!Kݽ.nǒ2޾/Y#u)X.r6K?}]o>u+ n?lZݽ,plӻ%Ip^!E, WC3L.xdUv,tD i@U%vL)a,c?W$H!n }rI:}nћXa1Z8Vky汄Hp 1'kx/o]}(XxP"X"XvNc!??ʩ+P'i]%\qDc؆^yN8}1p3d^]7E ?srFpApA9Lࢃ;Ÿgz]U U;0Ām&d^<e N@WWgԕwT`=/(bb1F0ĭ'k܈7,`^y+}ďIEdNzbDe+\RUX] 9#F8p]|*܉d(I! /~ErשyL jE\J+y -$<|>եp΂Rb8Z/ AT .X, 8W5*K0j%:H/(b y/(!K/yϯAXI#N0'5x'˕Hj~5ApϚ2 Z(W: Aqeie#c⸁ g+;p\Aↁ gMmbτV ڰ!Mz]y>FRcsIENDB`PK.PKPK.[E"OEBPS/img/dlov_tablecolumns_dt.pngPNG  IHDRz7aIDATx Ž{XnĠxQAWUɣFY )cT,(ځ.Xs2]H\+eGbE;T;t{[FLjhjաχBpjP[)жغg(ap^[tCӧH,]pWs&]jD_='8'L4auJ*Qr  :juzDB -Zu:Rvu,DVD"Pl}3[t1"RrAS;QZj_b\٪U@q|jEaRƵ2qoQ̧yOU,/ 9˂Sn}w- Jb  A\U4%jk_Q2Ȉk(2/nW < QEdTeN58%2pTje DRThkLD~v԰P*̅8qMhi'o^8Vc4(.T-zG ="2ؘbSe{u}%u4ʲDDED֟ V CUDX\nוh(Pl N h~eգ[I)uQG(~YHQ$HJ$ipEeYEY9Rek"ڻtCTp Kt$&Ƹ&Tnm g]I@D1sE 's$@v]%daU)%*ZcL媹V[DEx<qg{vZih߰6Tײc#̵ꭢCu-ҍ4 }˞Cr 7!})ЭU* Qx$k/8y1?_hXDΘTxuH;IׅSn x.o|S蝐+fOomTdsk|ي-[5Z[^mzf-<Қ6ǎ΃϶zIe3yjʜzW:D^--ZT=faFK?+'$_;@>vLS ra-Q\Hk.}dv|Vnu(9vƱ#[į >պNf|i߇k{OݔEz'KӬ{' hUS&^[DמVb=tf/ǩ0vzCkYg2 dEԟ~Oĕw1xWk)WXg[?3@$D*8>`6Tj9u]C!ekoӁ1-; 4.EbGgX?yʎnQq [@u^??v/kjٓ?pQx-iY3r`R8^ṄDnԭ"b4 r Q\(U\p-[ͦ,a\#+snloDWJ'TW~O+AۖVmNiJ4/Z!3[Ԙ/{yJ}eU^a}З4Cj-9K2a;۶ 8Ѥ㢍'uaݏghOʢ"˧?hd6삐An}Ƞn#AJ+*aCZo0RNXe|ٻ]ZЖHw 굘('F [cL_AL;{ă/]*j hΰ-ML x*BMϚo6G2l5 .=nFazƠ}b[ջNqTӝKZ}L;ZrOxҀLؘTԸy6u݁,~eڊ tzWĔ mڭ:i,IB_=vi(t[nwWE|'jtˆc? Ay?{0xG0dy;П}وS9'4 R_WMی=.k+ږbJ]`9+W5UcKڭW5I_mfwi/mMQyaHӜ!;Ieu:["sp}qU5\0u$*i n[4hYt+3%wpX ЭoQu[]  ,@Զl9fЇY7㜣-e3-.ǖ\̤r e#ߘ3,m42Ewg&WQ?#X]o E bȚzenִ6̦АW9kO^{ש]Nhl5d׸GŽ/f雝 {JHVbn}ȀnJmpkiD{1p+:~Z ^mȉ3j'^ט~FM}]]zxIڊ9hl]o"Ɣu[+>3~AFZw K[zl͙Ǝro;(\-rԁ:dzlO]Y-e7Pʢ%?YqI%hu{#(tnwH„`S+5%̦+k؊il)qG6b޳gWE'WI2Y-SfE+kknlMܸP[BK.w^>ZbgTӊ\;1!3,Grlm_e{W;M-=qz}CM{gW3aTX^~+NHq+rj`}tx]7DM;_z.c2ߝvD]촜՛cod65 _7#hYWFnQ~N(;{eøw9x.{fJڮ Ϯ9UǨzm6uzоG__r\FO=f!=}=Õ2.RݲiN/^Em[Lݥ=)'~~j \0ra ([aRy}yE6&*yQ;!xΌK\Ms9t_LCr}^eS޲f:%  'X:eFpTǃD;U !-vGWxB7 Avt=W:[b nks֏@P @>R9-Эρnn}t Q\?-Эρnn}t ts[(ů;5Cn0?٭CHM1lk]m@g3O~kt7ݞݶjp9ֻGV7r9m ) ֩> |DnLOv8)B6n,ǺS 2]ZdWI#0ngt3:SU* 9S HiSܷ@n}Nm:tz_SZS7x~dPt@>'':yg,l|˴-y<ēTn"NIE:x2/ $ݐKi9Mu:sL? tsoTpEq4,J[Y+\n}t[x9j85NЭ)>J@P @>R9-Эρnn}NFMnt]nyP"@>'}~%->c{iJu;:zz\S$]nդ=g߀n}Nҍp6L7}̄l3ЭI_w=֋NӖ/Zb|y^J} /?,n]|K5{s(J5v՚-xt~C۸qkG'Rjї7n0at (j[;Snih:e 7,\cIg2-hDc1qĝ;wB9mz>D&ɚn,Y2gui:P@>'M톅߭cƌݶFO4;ѭP@>G\laD"--g>NEKkԭb*Kt{QG}gD}V0sLi?)Э0F4]`y)*כniڴis}饗-Z4|]fˤID-n}NHZU]:47yhzMw,6ie[@Q sAX7rҲG45j-yȑo]tԆ2 H$xnŋQO>v#9"A7,\޲`AyRnk!u֙L[Z7M(6%PCѭ0t~ !5ZZL]4ۮTLғD>/\xdw (gu.>cv}ueze?al3ЭI_nogLc1MnuGGϒwV7MVK[@9dn)-n+խ6W5=zq,3n}N:ݾK6Yan}N:>rBWDu[n_Z2b죓n}Ng ]s(>Ǝ_0CwܺgAu8liGIĥDBe"DVdIf2OEYОc6}m @t$!Ȓ),'JWt!~ׯ{En h}{M.D\hi\+JH@ߒqKY۱nt[d۩p7mM8e3fvϓ h}XCmƵZ%Wlծ\+[_nKLuk+3t2TIu_J Mޏ ʄE[^0J?ݖ-MKc-QX72߮{WQ󄍿PbT,un Dekm9 oh]N6E>ߘ^)̸?=QMt[ dAV)&խ11֗NSif5&&1MϿX&j~Wej\@%_[]WN$v y[Ot[,ˁ>kZ"D{W1~>amm /:$; t (4>fF\yp Qb ˮRDSnK?ֻ&mZ_BWYt p n+<%J m@= mn=E]&c}@W#T^vnWVؘ0A11w&t[:`T)n][[| 2K4%DكT$:J -Mm)8Y WPqS&ڭ@%t mW%m5`Au떼sGW_$!!r"jqn(sX^ؙn1W|X趂!\xXʋ :[:vn 9B t էuzy6ü O/}ז?n -3nMu>Y}7P`UKRcpn+BΟ5+6T58늩k[( [g4̳e@SLN[ևd[[iQV_y)eJIXP2@hLpp$i)DfF,g2f2tC[G[P([g4VVV]B'ID-[7XK^/)n=ZҭxN ֢LLm[@@eK!%^,mlKtK.۾ml)J ̮n [@@e_LNT:-3mRn=*ERѭڶ܀nn*J lnA?ݖ--(5[g۲@滅nD@t ۲t t[@Ԁnn˖[Ai?ݖ-~U*g0g_w'-3m1S1t \nn|.&NG0:cy?ݖ-=߭nlKt|-{[g4>V6AI"jm\$L?i:t[:@Ԁnnܙq[ t 4[g۲%vW=^qlRԀnn-3m݂R~-[ԭ >X ݖ'^6[u-mXW?Ly=nUf`[+^tT`cЭEt B>w&'խq[E[AIPInt뒒j۲/*E,M3V$dc q!ntotĵBo) s9.^?i:t[:`T)PɨR)=m1閦X۽'%HYxU*[[)tKDe t J2-(F.B7n hu+@!uc2bY‰Nf's)"YP9ITālԻq ʶn|p =p]vHUrxɲ" V8Ke*WL&!6]G&C/WQMK(Dg >Wv\`-+*lѭ^b̩U$S8E۰<=<DWOn;,Ҋ//)3=:OL@'X?HGEXAYtb-ՠeU+}" E*fU\uFӽ J_L%_Bdw '~XZ$&(2 #|Ű{.X7;ri}]+w}J<"$X)" ^:Po$9c޺nO.xdKXtWybB]WFAKTqH(sBkB,Io)~kk_3 ٱxD 3vl^di4Ԕ:qi PidM!"TQJխxg7V>\1H] hXOqn s][l#6-\ (=_ Pu+4%Ɲ:3ȁ[忽(DL#DBڹmErs7Ym𔃹 nn%Yti!%a)t3!L?mx3>t =ObQؽql e~x٧`|AxO׎_<=G7J+󈐐q8_Y7z_|c%YOۺx k_OR_E*Cu-cmkS _UW͔G٦Yy}#!nGWn^J*+5l4;BƗY[]-o0PQ;=ި: wO qAnf}o6NINt2vAOwZ[/ "%[!1᷵Mg W?m־3vTR!\? }ۮ\oXyvSb{c_=kb;ZS:#e"RcO-ҮUz5|֦}w _0 i*?N&|ii7a&9U۸ESeУ O9"fߏ⭝rH)^Y^> yN;lz][mGNM+%̵}h,s|(}뛸װo{d9Gn#lz۠k_Ȏ-:%9cS٥h5gKY?蛎>crx[O***+c;SҲE&JZUL-roVtTS}t;v8sKzgrB1JTd#Bם~3;c4 r1)TFeSeٜ&6񚶼id6ɧݧ7A aRd-^;-:b- uL_z)vQv?Ӕx]m͵? #1w68=>F+;BߚhQ7/4w54m;K=.Ӆ ~&gDvo⻣ʝO~-ۤ M|$ܿ$d^+RؠUVף5A_v٢{L2opmh"͠u`Z#gtƏ_MԕD⢒_cBߜY$iWmugfn}dhxpR"%Q{ϓmm9c֩+IT2n{O{sn95嶑ͯ[t{Oݠ*Eu"k!".ЭxR胗>ƫg}ّRRp-ۿG~ieټ ʿ߼{cǺ 9x}0!\獛fL>o4Oz%f,Ŷ˚9ys7^/]ك|/'4}{;݊?ml_)Zc{ϗƭgV]r}1Vu?:kKtϻU Z%/_E&y4sr~բ۾~N;u ? F:* gH Gp9v 2&$pן:t23ߖw<% 1ӷmus3苏|ތ`X.*Uh,7$Kx^sgC^H:K'q<횶VrGc pHJκ5%M2χDn)o__h>28UWG'TYK?PHܑ4޸]w~q}$igƞOH 'DL22rv,)ĆOKӶb]Hcji^GwuYtA>9CiʶJcJ(2]r'rEq/i[)aNM0JV;.'m2MW =c( P#R}cqa[Na+̞9ַ7?!(c4I2vo[Ӿh[<޴́cH%--EQ$j1}ʸg=DQ{4?v:)FE'W Rϑ@Gag};?|s_\K?5Vdtct =:?mŹ~ZC.h&}!˲k2m{><Ϻ9SƗ6q.e:6!eK Cee^(L*WT8j{'2q$ضgOܲ%Jr_O|ꦹ8mji _QlbEǵMlw/muA)BzbڎJ8n{D"%_UvТHuԇIgƥ iڲn{ٌn<i,Xk\޹zo.'0G2k%Рj؄ۜJ6.~ٴo+2m{D(jX \ʴmB}Y$2/P(T߽ .RSBndp_ƣ-S38!Im^tz6W`hZO'_2IQ3ycQ7&ٙA-%`nMUu&Ehf֍ Rݲ1.naL_.} 8v!'}Td|Ӻzםr v΃}׮֎O/)W7~~{.\<@<ɿyzm@QxЌ=9*=VlWFK}m}G}(]%ҲeR+.*%XZ>B%O}VK^6X1}͡s^X{҃ 1VƩNCHt[SEB$duac$ \L&1Mb\{zkK%޼e{Lq$_]Å+/qQ'mw:-'h;bLtIn)8w=i]aۙ@*ImDR\(6ÿy^b~*'" { KaUv2NOs'Ի3ya_n?{l1M(1RM3}mkV 5Lۑ͟p+X,/<+1zPWkiivcg[7e#*Y{YUw-Kh[+-zig}EuVBLIZ ,nvP#mt&css 7WVE5n9&bӭX-<:}?o*kHYlbNte7' bÆ7b\RgiseΏuBCDYhb v q+*Ѯ [6v[ۍ+,tKKBnz[rAm`tCku-Ʌ.pli 'kd6 qԲi*+,ILd0\Xx!R`E5\etmeäȞ  WdRNHtK ˦ caUo&Gޜb[$ 9aAiie2 +m%o1&sՐ_ǜ|%sZ˶vig 1FfZ˴]k6=oZmݙ.G<lw8}[gt&C)Mv[++[t 9-s[ >O`JdI%YTi-17 #sPE$ 8`J?n(~XuygV?ڵ[R*pdcGLr0.tt{. @m_[=38I)ɆVZ^#15[mr˧ۿhMMG7.(62i붻s{/z퍷rIs}~Zenߞ(r5xK|K[|=Ӕ;:zz\S$]nդ=d4@~WI_nt+$wm2K˖{-q+ynzT)oũ.M.Ilu=G՝x/1!O@WtK7#k[o| nɟnm-PK唊ʧn]Rϒ)'"%Ѫ(B"!$b s|RQe^ûXuEi-h1u߼f/%侅n 7.ƚyȽϽ}lujSJ{qhn?>vX/͡~2+=Ni6d'y{T<6k~U7ZztjPzt;B74wʔ)V[.>۶DVo޼ Zenж,hi7=~z{I֮]'N=1趥}[jP67vٿ۝)E4miiy{O2ka1ͤ3Fz1՘8qΝ;[OoM톅߭cƌݶFO4;ѭB֊U˴$Z^KpmgunFN1a.6ܰ|{ ws3{@K5VK1%=ꨣ>3>be9s&4Cuu~gr>K)iu{Ct{6{nu4Eѭq,Xpޯ~5uh-n6mܹsi-Z4|]fˤID-!?c~趜qġ>>x1ݠ?m%XuzHs\nL&Ǐ-oڴxDznV 3 qm׳אE0u#/'- }!,5suS(,$ԷwS?hJےtTqܰpy˂iwHmᮉW p׭[g2ni4ŊH M -'߷J%}'/5q/.eϸUE3 n/kS Bҵa.;BkniaYi{m]{'Y u m!0JZ ,slumߧ=GȊ̱A no[;su8μ 7$`[ns=#Pں0m<79='5z,Š{}:i;/91מy xg̮Lo_n(F[յ̝lu+Ib Zf햮 Xu{Ϳّy %ΘcR]wGGϒwV7Mn(FCϔ̘;/x> +0]gtƗߡh$&H6MntT_ռEǠ[mV[n}m(UFi9n+FWCƗmagn{ rK/ѿ>m&#趜 ~-~ 2k3nT'ޙ1ŘX>sev}̼;~|}y߱snM|eeag, $.;\Lč/ۑ8 *">Iݠ[acuH;H".%(Y9~.=DŽ7l[~[yՏ6N?bMߜFpJ뚀n(4ݾAj"IpD-ˉҕ$5]?fG| )N8aѺ?8㈣Rlhe5:rS5Uk\`reIH@ߒqKY۱n_t t;\}nUQ\?ي".tN=hSVR{@tDZkEA,=HJ?Uߘ^)̸?=QM_uk|V_nsVrRd796Nʦ+&›>}tLB<o[\tkFN=vN]֦ mDo7ְn-˯]ԸhcR}f}䁭֟%ϊROWUVxw֬YK/4}4-n[6[5]Nt[,ˁ>kZ"D{W1~>am)붯M37%Ɏswmj"vӗ:濳KNS%2tiSlwuӦ̦Tbwc2Ӯ w퍶I{Fzƪj{[#Db=@74 ;oʫeSSHLP^v"*$rXUqث]I'r"Z2q50sWS/%(fԩo ;4C2RUQgRViхyst, ؔ +qԛD_{X1DLhY\fpZŚ^NjMot]r}zbۖmn>иM]vu'=ݚVOV&AgZP&h}mW$E Bx%A++lLGu;5{(tKZVI*5Z֊6 彵a G7/ѸYfRp4oʏn%9nI*˝nte{i{iuki@mU?!Cۖl2$=t 6?,Q+(mƸ){VUW[c or'*JY2fTskcTӭRNմ]M8mT/E=#wd\i׷v9SBu6׶ΚBҙ/w&:|k跆9R{Cۃ_Ks[Wn`ݒv+$$Dze5#PV9瘱uOR8WuTcAȳn;v={ q>Yϔ(($nǝwt[D@P}Zh3̫ *۷o~ms-&E\ɲ,$ԷwS?h&unt [DOVgߣ%}z7>XuՒu%*o|Ujg=(v׾D8 eПt-2ԭ w}W%z C떳9aTa.{1EUMc^\ǃKc!nL|2HLLB39ns[Lbh_o>u9FV%g=Y VX;w/_ϋLꖉn=j+ڦL溵N<K~/u}ݔcխSRhyV39]!i QgQ//˙Kb>S9Ɨ)sdeo8=wEoz;z=rI TG>sO'v%'F3au\`ЭuNNJT;U#XnsREӭ> neIne5Х%$OnI/k%-'bg}5~pѭ$@ ?xh隵[R*|dcYG5|gG&̅nM^tK\v)X~AK[<K@N&zy^?iSխS K퐭bԋ-=j˶8@0L/d>6m7-?. Y׭w݇jI:ƙUKviE.[=N?ֽk^ݗWOcW e[aT) ƴv*GpNMխOȅn/]Zou[ $tI~:Ɯy9m[Y.N5}wyR?e?S.b>m0%N{6trb{tk݄ӱݨˇ7ֈt4T%&fWX#ymoڵՌ[#(iۤ9磭xOqQ trB@F^T^)I'7$3MIub8mQ^T6z,ө+On]aHPU(ݒlym x|z3S~ q*к>9%sZw5qխ^*c[SoiT Y3hҽiI{%OI6w&{|$^tfQ_g=IooX\º:y5F'z;|ߞ=aw/턐^$zKl]b/i{̣]Nm7z䏏FZv?!*d閍{Z|G{-(4mqPW;l)[n1HJY& [L݂Brz9- -(4E[LR vSҲU۴)nS#$lv/gJA[aF 31o2뿁޴'<Э;IWLҬ):gTQi_攠n3L[+i9mst$[[[wRmҵ]Ou[_&խMt#e[&+ciЭwr[LoBh'qEG/2{HZmAGjtukʓ]3eyT)*;m@."9]˱hҦmdLU _6*cd,ڤ$9mnl#qmCd{Oq g*%[S+ ۰swcw:ɥdkS,zW;qV ]r+2J|鶍l|>͢nuf%uӉ|U$KoϺJ$5&n]<|lwJֶ$GyXd[)s/x-DuV@%Rwf^8nnT|nPowQ͚F&x/ hnwm2-q=Gvu뤴L޶U8|\n]noImSJ,6r8T8Iq(nlԜ64].NzBgTڔTgMfOnh}+Im4^r*2׺!:&6~. yF\ӣ4[#ϷxiHV ":b,'mqP2]48t [Ph^$M(R`m/\^r@^Xu13Kw Aaxw3[@)zzϻny^rt mʺGz nuZ R'[З|`[Sbm]Qz <|6ݴS6ȗnfʦnmuܭ^ty[[_:Aj#TOê޴ns9/f]IRx)t @)5LJji2(ٶbחkɌ%[3{i]:kze[M;3Mkhm~3eڮ5[cW1$p0t[V_['ZIukI-H5'{lु)m=i xocJ[RD^<ӓf())j%Z*rWXwmmJ'ctmSlIJ YnnqLumQ5݃cb+:u>nmf())fؙL閤"cgri4d[Ib^n^ٷ*u y.0n"ejI[b[*[IRֵ$R+n8dlmqS_-d<=wkղI [+Nu"F'5l'GzJ|t[ǁo]'2.t (U LWi@q|m@qcfjew[Δn;B׷Aعuq>8NQ} @@Дn<dխU_Zk!^d^TN5LI+&xt t MIe6wk]mXL*:aT)Gu_t~bduc[/ ؠ[?x>n{__ʪ[}N8(T$ّ]qXb,}٘AK Ҧs*immK7vmSvvٜvmc[_7zV[PXJMz4:JH[ULD9cm~4lu FL˥dR-qJYNq8ѱl#3Njn]έsM\(5fmR:bMO/'qP-uYŶLK[zvw1tK5~s)U5C\z1a ,I a vٺUi:]O>d߿dOY<&؅=몠3[Vm'nr6wu [',ݲH'%L[s[sY:#lqηIq;Lnk5LݺӨR='*%/ah)JE[,֭|m+R,[,֭`dLFbwab>IntYлɒ-kG]4$-絜0?@H=Y- -H\vb>?يL|@[ŗn4足Ȧ[ex)L+U uKOZMQm,τgljnoWû2f"4+H"rj[q r¾CܮyfP"ݺ6Sq3<@׭,k]xlq "-*k)X_-L[k &&쩻F\HMÇ^uk r1 'ϖnE.,[$s\+&r=֑__TZյdzݱ}K+ꖄ?‹OCGu˷$ֵ;g8gcݺ6LٶfRy3Ln%U뫘tYـY5g|?@c VDЭPmж=$cHLz_ gDtY\Yd]ļu+x ;D%lY!ŕ𺍪1;׭LNYVm ΐ5njo9,*$Q5gb:y)ɮ}L4Q)5s\JvuZw#}|%qm@ua]Xw–`$a{Xs"j+&o^ܤZxW_deTW "Ǻ5O&~C~[@=f2kkkfw+&kq[@ҭ[ dwKb]n3ܻud,xNQ+ xH8F蜅[,F .go/ʪJSOn/'K V[@[46ѻ}KIuKF9IӺ[x>Z/n+-HniİnY%nmkጭ-.JkQɒ+w-g$^n9ān9pFjL --[ӻnLuz;CuuuMH#Yce'4-H?[˜~J|S)' -H\D-b2+6崂n{ k%[$ѭ\] F[/['1f-4=B 7@>k9ub߄u+`@ Y2[LMxw]v Stk!C[mvufrnYd[ضyV6^=q$nWbXY" duѭ# Z\}[3$ ;'끆F=HknmH| boP~' VZ<ɛn4[քtЯ848 Y]BJ؆n5TVI]@ jR6E [φD!-a;Y#ҭ3 w @2[LT1e`Ou^Oz_d%a7>uY@_0mv[2[gtk;Iw }Z{$u+(mmx!*ػe 8~ "Cл: n9[{-akU$\$20YmT-H6n]&CTW2zD$Qm7|ڇial[[VnSQ!t,HQ<-8 [~;xuxj̚*@•+gE4jC5kqͶY[Э"5FJ _ionAn%%i1Y=4y)%"anAi5WZA @ Fbw ݂<}J0z *^-)JvZ;%Y ;B @@ RJÃJ}to}p [vM13_pRW'OV"JTUiLQ6f+ HBdIjú[=[@|6=׀t2<~߂=d7r/znAnC/z6uB ԭ{Q!2ĄH+fIp-#pp׶S*+6"\sikr7jC @VcEe/u9e,^ZPMK.su]c;%in{vKu-or5V-Oskt;+L ݊.{F3m`ho|jwϟ ݂݊f,#@}9D^J~2ikL^S:['- [f .NplC/ |aAgnAFbw ݂<ݢsW= -?- -Ht;^&A t Oݶc $[U[|t bpj.qVۨ5'y|e3IÎk ę!HFǾq 5Nn\z @']՛?ݻ͇n@.TmҬ6y)mnA@Lb~du19d94o6a?qS$=4i R'J[9pdW-q]Ԙ5U$+3V2[U~]׎p/kgnAr@ިRWW+m`bn7[NE*bYNA^VPUUSYg;5sZtKKtCo3ՓKsl=s=@򕃤x,-U՚,m߄|%&|b7w;$X^[[fH+vT5ڐe@ǝ}T#E TjEVպڸU_c]>7}73Q){*Dr ?+ MrSv7;nIxnt .SMk+veY 䂬_T.B>ƈktvfKI*)􀫟5Ѓ/=ҿV9ygfIߦL>ut#V>f dǎx'}Ltu-:ga@$ 6[k_b~wq[C׫zQRӏCu~EhQ ߪZ]+^pa6Td5910Οڨ Mc`{˿n;&8M ^ nnA$h{k^)OizM7]5\rckare9k_Dʸqݶ-N͍~[Uۺ-^QXEMϣ d^+uy.3AYnX^nc5skHinqt [ЭM{-:'VMTdukqӢٝU9HǯxSI}mCe=\e= , b?EڟOfUl$nݞ)M)-nƬ{c}\ø-BIyݎ U8>IZ$Ä-U"<]v{wQCɖM2Z=i-)b15P!dmc6.X?݃w[ pBȞ@r3eL,c9GfNunгqH?Fn _nYx{ ʵiuMVji|[ۙZ&RvW5.l|-r化{,ѦY6E @/2C&:łn Ms6;:ߛޘψ| jec}^۱[0VӶ̋bVM/,H{䣐JBڶ Ҹ-_&Aҭk4߻%^N wJ][5c`z[kiLuf^sJ}5M"M9cK0$#?듽,m-;]2:=18t+"Hg۬V|8h_2ۇWt2OJx?*"iN;ǸwgGzƷWuhEFN/Jc~gaVIFGGO;_qN[[+HҠd99L{<|F|~u;U"dwpJe=DTYȇ&LGޜ|LPmGkmb2R?W>ASnKŠ!@B_[Ī[Wɞ8H9-In @nHtk t_@$M [eg|g@[$ޭ+["Ža"!UTV(j=XJXl0ƶThסDnnY1BDHVu[.dY^kyÆ-I7cgCr#8i#'#  n?L{ܴE}!3nf~S:.9`gi{Q=* W,oIm7_swiy8I)U f ۑr!ѧ$ݒMaR<Ɲ^wI8I)- n[ځUWj.iժZ{Fx¬wX5mCK|cƴ/9^4qt4[,nAu[5Ek );;{>^Qi t] gSC~p#G7GUZ,@nkjyt3n mWMmggo4\/87su{=zhUޭۻ#ӭ}z}:@@ <*MGp~4lFut'\^9J8sS$nKпnS@= M"(vwOH_WB5lF5wWSCn,դ RrCτn 76J t~ hxEj krt;jHz"Xi EB|U픳n .$#ġΏƂxyݰ۫H@ݺ˶ lMLʻus҈{9aν;?:j.y1GCO^Iֵ@c*X-=K.)a.& lw~Dtᢅqt;D@ݺY!lv\R;|)=h 3p<0 4C5T$n9Ze.qZâ{[H#{nt>=f縈uhD?vIPݦ ZzJus~@1ܳ?=>USҏu^\Vyc 3֪}kEn F ,j;_\De!_ܷsI'2V/M[|WGGU~wcϞџtIâ5mCK|cƴUQzP/= [ L<ؙ /8 G"Xu[p>t Q"I\h+tY"R1BOcJ\$WYGKەz,Uw.c?̆n|czyLbbb^ D=oդVRO:W[ .&Mb(1ܻb¼_}w ąq-4p1Z{@ޯŽ[ bkݻ]2WZqґtt@]m_n&KHZ|\WEH>k?-+ĝ_i<@6SKLUaa!~T62>1ϓqiLnIbzw?+ݘ1>?&~ˍZ!*Q=;֮_@yR(B|Lqop߮~> JlȺh4_zĀ/,|2G*я_z-LRH8[Ɇ"ģ>|IêB@IB,F̧W R B񑂰rXn\鴵R+E6ԩEl|g29V 4N%Pw~Yԩv>!Dwp…M6 x;e#:'J }žtlr&lUbC nD$cFnJ遅ueWY) BxJ^_ɤ*,b*d_}ӓv+?W~o{XF)h^!>Uk/ ŏÃзgvԳfwz'M0@P49&lx<_=%+ˇ̌2ɒ344bdƁɍ Tqհ"#'#_ c$CgUQ.j * >+нuYOLLS3h!*]AqwwwFVO6pMrĉcǎXalذ!UyL@WZ;/7+onSA( ###0 (tt۳!\_辯?t_C0|0]4aƢ%eȩ[#e |m?<(Tc䒒{QVw|m_Ur;zpW%۶u۟o~m7.;U6(XM!gт ug?H! /*R6BH]6K]S` N,)&ln24KD$. q#4Fhlr^z}j=0VjT}%4fVe&)7 ݈Г=C޸guR0φ7f|[e~e5U0@xZa(^tl6mQR:66X>m6[agffa Fb4ߕc,0@\Vm7 H T,=BxLH@-84n:<ߧI%1<\!+6ny߼WGxw 3ѹjK<_]*2iCUr> 0FŹzU)T,zN6?˶6N&& **ղq>gl.4R1Wuóp Rz_qH!G1Vr\64]`R8FJO_(?E9q'n)r2(9WK?DzA2 [*!10#M^sg7{ٿ &Da2=/U P Dg3nܴk{ߔKR%r(K-}`\[aZ'[~kduaW,CYy#/l&!S',_dtڶ7?\*R%e<VNQNq 20L  e^,m"".;KǏ7ۿ2 )5gώu]:vM!Wyߓsrq#@Sև NKi7;Fn:w .;o>#`,7f֬~{,2[R1=O#/~\ݵxNO_RJ.a >C}`3ʩr^qYA`(PT_y?\6– g~Ex7^$7y lfOfP7[e 3^mCo"^As* 릺<[eRl|ʉ\q5ׯr tj B,UV_#p|\ٞ CEU"+VDz-X 0gJs H~T:2V`p! f }gX"?ċD"oH/ƋDjDeU`S'MݞHy? s"%---]]]ou>700ٲ%dDDzuGݦ7էɷL2g!U)=is\W-'O<~c=o޽P+sFc:nhh#BSFFF-NbO`UV!BL(]g\.~ƻ&AX<_uAn]_ ,z:aIu]UY(wATeCUu$NGpDm$sn$="all &''{{{-*pQjo|t exG҆;ѕ"BqS nɕ.!d!dvfV8~oW? =[Tah愴o<ŰG-7fCRpʧ H)v텥dyh@fsB?fs{· -Kd&l{şӫ{dJ_IaRJd]$eG/Sϲ?he9zF"XтDŽdIe4\e(A4Jrq[rݒ;=5=zjT>};И]4зҳh|_8Q䘇O*iXJd&O<ch@&(*_5j7?Ced,:szK%kL3,\FTc%5kM1441&@#RB_K|G+*|kww=g'-E}l8{booPccuxڦ篺hJ/l,0g%gϾ5!܅_#[[[=zJh8&+jD]======Ֆ",oe+ET^~eBKL$OI9J9μ B[.|>UaGuoVho_HTa=A=X,|-F3 ^|`+| _]*f̳K-'1' =:v쳛7@2+ k@$hP_uF1@s_ =(_DomHJࣔYW \/O&! .j.YK/dC6g)21 V3emsoeD' $zO6eO,u|y*4ϛ r 7>Hzİbew=o<}[|}%<3dbt@ ܩ6.T<$d΋ƍiJ1ڍq| 3ylIk؀ఎ$ otk&:!Dg IVBE߬/Pp`†7 gIO8xV`7]!~%ӈ}~{B t` #eCI~|#6Gc`J) ]bcPF@oNc~jOL?ww4.l=7LFSTZ!:PRkOJqY5LCޞ~j`95X{^Q,ڼSJ 0{G!!!]/]00H:oOc駼~͍0T:wXwfh^S;ӈ ]{y|Eh׏ ygdaҔ_&3%y,d'B3ig};ͼLgX$}A aQ'|aǮ[ cnlJ+zEwjoRnݾ{kTu6vw*)f1ޕ[|~)j( T5>`zF-5a.]fW!*&棕zB* 틮7? z8UDFذna]qbƑx)vxCbw I^abq$ʪwxyaݷPj00z@{ l /mtZFgh9SkOZGm/3=S7<ѯjGJꢂ`T nn;U%"'.\[T-9ۀEz"A=ۦVYAfc}O3ZٓhIAvHD}]YGi9~}$.- < ֝yO89FE)v1Ȕn=vL)ZcpU.dɃ<4vў{ؕ4o{ LA!MW_} RJł`4tҿ:Q. Z ٜe4yՑHd J5}}-H0۲CK$疖斗/ 9kT)7xAxE.}7gM':dD;'Ui|Osʾ߿C_`!ɽ (.l@xGlĮ[Z\n>cqVtKO&+DpJn6Ѯ} =;FyMǹЋ3 j1j0 mD䂶R,WwOJ{^)Ԗe6n8itJǒ/ƵXk=pdp񾞸PcB xzeBCnCB卋^A )5e<0 Hɶ:'~u iulC 5mW#5XBHCXce ߽ఎ~ @~@藕ZPFξ卪Cj̓뭙Wn[HD֌'%^֋0竚0q>9;_" 8p)}֬j@fT~db'^%յ4pظj( M_F35mf UVצI4˂t^]g&?`l]J026uf~T,&^i `zyh#'5׳\&}S^aaûa/R+^><ة{ ԀjsM9CE^wnPf͜7mD,R+27|wL fFsj#=1NAPc8NG573eVߓZnӸopz+)i?E#dg#(N@ki7z||$NA@?F+Y+Sǽ)57k}נW>D7gP`w!E77d$V4a:=tgР1e)g5[& ,n|#ql~\ [KN!,JNѴ5s~v䯉;Fwatbo~{zo{ԕe24cfqrc~76>jdWZ n7rR5Yzo/4/{>UnR#кUfHu^zFWϥ-u`T\Z󦵿ԵCĵ]qa\ PRT+ZMޝkfS63h0D`yE@ѓ /x$S#<$3aCFCno?iks6w;s.FDOAiY@r]c VAm>1nFj1}uR|֧Yy!@^1zg.3u, k U*dY~ c3 Il~ 6_/Cn-YA{_X YƫٴU@qNsNkkGn3֌ܨsZ]FQ֎ڨ)8fF8+g,Fz4#`Ԓ|bg69Fi+śVW60.B-4+=dy8`)HjZ\z}ZmR |:z|ۍN\=ᵟ؆FwKs؆׶it? vK칸'/zitB!_'ht mO7tP7ݺ4[vlk۪nN\4u:NXmB IUxt`L]96?(('eϥ:{%ӗN$]LirE%o{kR:U(b)E^Ǔ7 )7d>FR!ޜNbv .0ذm}Q"aȌ!kD/@[s'(ORlZ @f2/k/q6}bʾi9$~8 N-D*G?䦑@@ z甸QF;j$Ԭ<Zo7ci>Z„z'oܟIbQ$0 '=HSDhm|5Hsl\5&Xe6B-0or1vcqeˮW[ (Vص`4I?ymh4VDoޮ TKG\8 zsAG7+T^{1WmuOZ'CȺl} t>d+'jS?y ! %"H*P#!N\nv1z-UzkK.f-o<jt7_E57zO}8%#0;-={ގuOh&.Rٟ*xEgjotpI£ DܕڣG+i?Yyo{I B9wpI9LjOVE=?o&n΂6Ci :u6FoQ]tG>3m%SoCr*ǘ`s<roC<ʰ 儻::'RTpNKB ʂ!K=ܦ*$ĭ\)xרtnpv<л_widFrFHkFH{۟>yZ_WJ z)f|jVSڷH$Pp#,[σ]`y<)d%7/2jCBx2#D1X>ZS&D"0T/޹G:RùmQ 4jP tX ՝ؒM;.w#.XDȀ6x ఎ Q'N`Zµ zNK ?fAP:jI̾8Ƞwɠ<`8R6MDc沯As dkt4a"0(,m*xyճPVmj_',~~?/ PW`}VӤTcfոW|Nl֨gշY4ЅioKsR$ ;;lw P*~PP ,9HuSO>~1ړG<z\LM U>y q´<ݩ{9""rN89o9#,ǺMl[DW,A/52)h.`شfHWk,k3bxxL")*PXX ˠco~ǞY5Q*KV*ezEu6ڇ32ptx¹`/a;˖u{$"B;`@hi)-zF vQJ0< ܪMdb?d1dC,d` r`$Yӊq6ܥA\7RaBq-xn{f{': мνl6 ؽE9q]zOYl5˗?ϭ1NWnJ5*T7= g Z s;|meugFtARXkC`T0o|Evy@(U~h!)%-p8J`2DV>0JZ$Ǒ0= W'];sڐ {צi#KΪ;#Z[q5JS~~@Ho8v]%8^YeMO &`3}e^nNneve:~1:C0}1ߖ m"!!R㵺X&Wnv`u~Η6JUaQ_@ Ec44u+91jꋢhF-}gtnsX}ɫT(ըa{enu4E_JӖJMo&mbn,J<7җ+(?1XbڶT $;ujCYVyauSOCt9Ȋ#!UVHPpYxNnw{0,Cu 1KO;2i/ 9yx^!'&1mCLoYkMCP!wJ;_)6v"TȡX̺@p@*ܯUi'Mijg~* M`C J++]]Š;`/ ΖRT2aiZ 1΃i"wBhkۙ)Ͻ㳋OnuWl܍xƮx*^ۺrF7OyvBOm{F<5:Gfom~4jMA 3fY3gΚ5k_R*BQMcc!W<=xljRūNR-|Ζ;x(7[R(s9j~qoPց+)"[,)/P*PfƷWntpRBЌJ ?|Mo?Gܽ+5[x{R QJ _ݲRpmĀAZsAZ~o[4zyFT* b=otzhry-"K{R0%6JxSyaa.j]H}wG2.84z~Šjcb{9aG:=I}c;=Y3>7{ocͲV7Ϧgi~_V:NA)$Z\V]7 W%@1m$&$T(*JUPP:uC_6,dGZFVW ZV{?yCo:)WoMBddxTDOo֯˯X̊Q_ r+ #^ssSܽ~~OU=-?>ר{}~_j]2<" uz' Pb@ۙgJwsG~q~-Ǚ-bţk[_{-QpP58ߗ˿6mqd= <0Iq{3H~_a+VON2 0;͝>7BTw7uzNTY[_887T[m@IQ"ar6PMj;٘ӖƼj5m#}FqQ 0[A$[%@PD-~CN{jFh9ޟ/}|;}mQPr-V](T YT\`UsS2q)rj{ SJSQ$V׷o'W9^xOiڅ%gnNTP 3UB(':7ёD6p&ӱ_(^XĔ?DS$@ vN9+ o޴Bfuhe1*H Ҝ!@Nn .`Ɋ_}wTYaNPWX+F^̯fuC!I2"#wn#6IF!CwBd)CB!ȒvZ[dRg H^cIDJo}_-F8aH& ٖ3wHR9:w{䍕G=5R9:s!G"+hYJNʦ%9B"[68.Ѿ)=9;[nܞQJ$NEa@x5E))[(kꕲ9'{*Uj~DMD"KH$c(R4c>jp.w0!R}_lXQ6 ʃK}Rfw??eBCi@h֓ل\zҡL%W\9ypɪR/ sp)âK/OR +( (f; X~UQP|Ur}/ kB :cI<7-kZye] O>J w$-@\UKwYP~X?P_YP !\Uc1EC"wQ1a?Mk)( pBotV֛{zrN,s2ְvUiI]3ԍX;9__igR؋ٹ` 3u$FTzIHK=Yw7wOOGg]q_CfwV~uc:{4Czܗ0o'ɆbgN L\ܾ0J 3%ϜlOֽa+^ݩuD1ma|Ɍعb0'FS8[]cpv3>0pl\ E,0`z%wZ~RF_C~hm>:,0ribeDXTy&IZdȀz ל(QbMD'X0ٴܢ6:%zƠ'2sjRӪWgB+jڲ(~@Ǥ,w6\lSt.K[AzF|8z30-{#Ltb=Bm0 ^u{J|% s'2%cVig?@]h 89yy۰/]y{Ԩ{?{Im8]z/MBÁg77s;\p"՜8*s@3*OQ\ ML&zssKs.5W4\\s󂩳'L~|NM] ^Gu@>8Sg:=-=. [6ئwhzSgTW.W6/dCɮNu_ vؚ![#9KŸE8Qw@c53g47&01[{ޜ%9ϩ)%#g2f֙ʅF _ya랃Jux`h.fl/& a+,]&Ŧ3fcs֬\hzF+\kpi¥ +\kNqz^C`شfHk?of[u@e.>!iFB`쐡Ckl)FzW"W+ۿ?aFnt)] a=;Z1ni 䇇*瀵ԷQ^[NB7wJ:Be\ayIIydHD⚢sR6H+Ν9/yŊa# \5[Tѣ =TnnIϞQڵ*LOp,:~mLXőDO sd KqKQiqZՅ; ߹JwH=e 0ݑ2ZcaƭM'f])`<4ZB`ʹtshuPJcp` Ņ; pG%v8;wF6=Eمm\rMil"q͎ob{Eǧ/Nyh'[{4W>F U;`f©Cr9Y(C{Hshs7y*̣zu7rvyI[Jٓ2 mT˲B2ˑk+}ַZfyzΌw>?IY!۳/Wd_.…|\)c*XHxNǡ!Ө:g~e|gm2j;ooooS;֌;qU7CCle;CbIu!c+7Mo:wj6j6MJ846&k!f Nl>f};_+^YQ(yN*nǰF̪=sb+)f-.zJiTY Z'{~E &[G@xS(6&K_@323Ĭ15&=gRYTT`1oQVҺU JZ7wy=O#Yu QJ纩/o٦D9oh^s= "4)?Rv0u59},MVc_h`Ph"\# ŀG(^#Z^NQ8%aw Ȗs-;:iԥzUܶe3+\h(1 zYU(OJ~5amq<~C܆Q;o[dz-i]CHiW\6u:Btk:B$H Rn !Ng򑒴ExK<wKrB !rC*\VۥbR\..P“҉e\`vebKK:M,n Ԍcf8m0D*A )SI!C&ߛ!bX0 o@;Ȋ0c=oE9vڠTLR 0LxbPZ{ y?0OaxIێaUʽ0&L5j l v5\h,ڳU }9k4];)fZ#Y\h:\pIT8[\>,]+A!$ch>miсo#}VH.tm@Vy3Viqn2kWs^'0*mյh'U+qZׄ5Se{2^縼+3~Iěya{9oƋN=~=4l]sWc gr3uᘩ #3n!1/Y+N늩 ! lLdI2=S VpȄ /\ٰN<\"\ٸ /p0cc卋3p]{fqgyL70lyּY¹cɎ2X$ՌTފS۝WԦ@L]" 2o~g|N/KapZ!ƠU8:bTɑTׂ/@Մt Рv[%6iZ 3AN @6Q$|o'*uBE(yNg{;Fjm;mܭrg:Aִ!!QjylY,FuiUVׂ⢈0ogoX=/Mk7||-+x{‡a ^QՇH6:CDOH] |mSGnmP0j͢U,)ږƴnW ~[k~J!Bee5p  vVTQYY9~6~*<9X嶎Z'=嗟^q{RKmܚur[ ,;vvqI(o10-v8b[(xA `ٷ5Rᅧt-22x=/Y?ln=(|փEY޽j`Hȅ uR * .+Wۭ(!)/Pj \+VLfN,x^}w?}h&Q#+d]B.wpS+:ƤZnbyRvP YqhTbĝϮe&Q|Njyx5nX_J)ySie;FIsyJ+/ϼ♲2i<`8nsPy܎4V8ZszsJKeW*2w60ofq" yl&]Kby!DYU*B@ygx\FAΉ2*@LYu52#=dwKX̨G^F^y}vyMH!=#ditZĠSK˂=2@)IVj[n,tv#O͹>Uvp^*#[t 2x ~Zw݂ Z'ndGsKf1Se{8Nq:Z:^qL/>S{|.|DЪnXU}@)-+:wjY-FTG^V|Ɨ˟,L63GFM (u[ĽkT1x?" "g>3|vt4_H}؉yYtݮJc|1\ mwѮEN:vq؝qq }1:o|m_98NԮlZ^q%ba|M0?-ͳB]*ZrgY(^՞${fBmVA(ۜNF/p5B:nذ^^XU3%!k C)!Xv'?>Pg{=߶^on~pϻr9-)ڕ-cyR}IPώTU/L q<]٪I!zN6_zfh C6i}6!D< uܰ/KLgCOߗ|!;}q&B*j%nHx'4m( vU6LM-8ٮlƯ\Da=}/Nx=@ Bī1PV' tzAZ1eeo%b PMj)qVܙ=qhhn 1\UJ|<swL8e'ەMK3'waRZZ^alXaZe+SC~l3.ۙw?UDDRVKV/qeDaܑvmGN|bJU#?x?ҩ=U/){)8ad@<%=K[PLr\ɖ-bq?98<.wCOY= ϛ d5F 7r)?Q$xyD;|*4~!U|g~zߪpyط ̣_iU#ꜷ{h)Vh| .ڮd>S)+;!T\t#pBV:[C#0 o=ԛ m8|sL̼1Y_FVH};>U&#n5!qI' O1;&"Y|JIO&W~1gĭ&Dd1'٩]*vx\>I?QxGB3JR!kalOP_5FEfǤՄ0O:)˯2.TpD+sk 0|Փ1N~uRDxYA% Rg! =3yĝ&L-U "vfWȢE?‚d!AQ/.&Ɗf?M:)): Nݿ0MtDvxO<`O^acM% ڮcطA PJLK{acg*\Paa}Hr@)cj'a;3a&^GdDgd+ r1KfCx7#׽XΖHgo=܊TB[n@n,z@iu||v\z͡Z󠵬m[;tW7s{;0:}HsL C!]P:a~rg*+$u=lgHBnf"=ab`޷cMؼ$)+@G80A J)S !ǭR/^-K 5פiG?:e]=|6J :o͡[$]߱aKiBS Y|/DW`<ֲUKo?1%a  +{yPJْ5t+arKǚ,TÀ+a~"C(ϏP\P*sLn̢݃HX Oiej&6^1PMZrb1WL(UV\JX S!R b 4- dzpir`Ux5dQq%!=>Uÿ9=~b0VBxEIف+f3ǞE&"a%3׵֯8Y!t˵)2tRrz=& J+Bz4uKѣ#w>CwB*.'.R~* E@k H\.WKK7Zfffvv ܥ;>|vu6!_Kܽծ7ZDE捬[hB?N2;gp͈R^'/.v-b}?o aHj+ Y5قɱ !ހ/o/8PB)37ma{CxB`D3P# &m^Y{ed""a>F3((&4E knA_nTidZ=<3Xq ˼SxfdxZ}tnʼEKԠ' zA]K+}f<"y(d^0)@9uԈcSߋ*n+guSezo$yrAiβ`xZ[[7|Me3ٴ'*5KIddC>+p e|zŨE?)L)A!S)2)2ͮ8} iuo:O=ۿ<`6)Lgb|bHazdeGx=#lC;t-{80Nˣ? <1G4="Ev`t9,YwtS5i&{@ t+.Gzͽz ?FP#c 6rhdF-|h-Jv{| r_%UdJ;oig[Rigd󺱖5}mş$$8@yn Otrްyd 8tVDYgaI>f>vMO|p4{-j[ =S *iYǧɤw=/kdr8/Ā@ЅvNlqYh@|ȈL  7o9˶gBNQFx3~>ǣ g\d/esDN2$L/6V*nm4[^ХX`TV_,o2+%$1Cu Hʵz9[loiL^ q%m*LPwz!w?+!Y;j i0 gT#vkX<8dY% L|'twFNψ~2Oyw}v'w淔8}SilruYXU3WX;VaN0Xm4b0Af diko{;D< 'C['Դ3zecoZM8aqp8$9M@* (CYa7s]YAO Q5,--'Q[NR7_ύ|Qy?{ՌZUeܫEcGj۷}&a]RɷC6FCGwf^,%8¬.~L5\7}};dj Q1jX??i,DE LxX}V{~2\O͛ڿvj{__$#W.Ԩ!261/ŭ}wꢅ=_ O-թ*e!*G\{oGKctŸ;;}wނSjJZbY!8n]Ϟ_ॵG5jVOH!#ooy>^GXtY| p]9䖠{6@ӎ @5^ϦڒEeKVk!ߜSZ=B-;w]ڕݕ#N=IImڴqőDS;Ld8a_+NR\\܄ PO'$KHk*[᫺9 hxx MKn/'!! 4 E29 E29 E29 E29 3 Yg;`C=`h.h }"ЬLI}M{PX7gzh[9$~t&mGgvGFEe?ܼsGGiɒ=ܮDjyu^:[ ~^s %F[STsGkŤ8@TRk !QWWk.E"?o9^GILq ,,du#WmisOZ>]ۯk.z!.…3<ޑDcN*z Z1N}fhCRST͛ʫ4y>> }׮/]LN1ay,aI@Ya緭yzT:Ԥ ػDo:`X-=PEB> 8YZ$;j"f-׮} "g@)s:%oc^2BB rG,ڊ6n˄<~]V|eʜc!i,7OEvM&Ӌ%+"'wj*8v3Q~}D#vҾB,uŊ[#Zd{ 2[!fBfjtdpKX1槽_B +282w%!!F!Dzabl\r=xեZCB!oSVҁ!!QWK<|)RY@jdQpiv!* 4?>#EsSYu4>rxq m& OrGH• =b3ꊦVr;}^Cw;6S9q#$H^%#ՙ\Wib-GȑyJq$OY*.8]z9x}91g[䠾ABDŽSECteȂ=R ̢#6{b#uI LОmA#WPM>ȑ܀}I)֥˾buYrږz,:XdОm% S$W[Naps$LNzJQ.傐miD4SZ(;xd3+Qi3xmegYEn3d^}D5cQ}Z@2m۲Db^Iw_) $"6),ЖjuX*ɉI:-:XFĠ}?d[@ysFƱ8,ٍ[227nDI]f,;ղN,Fl$$jJvޑp/|9 EjdS)$$jն@!GZDŒFghMr|NgUMc@oi|ץ9Icڭm} Xyş]w֎gm|R?gizY~3Nj>e1ģT|>eO/lHUJ҇FHud.O)1vkڭEŷV'aT uϰlOũ?+~x骎xt6ӈ!cWDoYSSάő)4nBY܃JJ@{)e&0Fl'?m/? /W_'>h)v{G+io+Y%ŌTBBzKyU+`Yp}㐐X,;N91ՉFkω{Cھ?^lYU^6vř ڍxi݆EIg 0 {rйjŸmw씸c3/@ +.zifްj@(`NYi$'fi+6ߪLN(mCL<6gc9NƝUa-Fm1*e\CnmjK;5du_Ih Dqs4p9Z@Sӳ=MݤYtɸ oKV7=yyI"PTjn## q82 yȻנq;;'6**3']˘b`45;yZ4zۊ@@_/ D7 . ԅLJ [. \Ix*P*MF6U1ASx|tLkQIMV~fC(3QŠHx$pOTxU{?9U3CY{i*SƏkso3?\k1f2 Fi΂ݘGaq唎8nf2-JRGrnK$ƅtf%˵O>]Gs"@ڶ7yy3s^W?ߚ=Vh*K޾e8] Vۛ[K`9L&f0Ngv h m.=:ݛ~ EE((8yċl~UȀb%/]U>MFr+PNrUrI\6K ':u_pޱ(?ޒ X҄:[Xl([єC(R"~ɰ T) (E (""#B|hiȒw-~_ю6+c9RlL6JX ̸fNkToªQ_?HiJ 48a7L#VGPfv+/_|K|ŋ/^p…-\dg-oyw2,8&A0 mõK~[Ơ~Rt2&×9ju,cxÇ?o'? h ztX쌌Fy _ifR1It!ejGPU/z2xn`-,sLzP eer6[ n dT%E4+J<n(a2[= وkj&@Ns YȄQ3)7o, Ei`@+")c x݊C t́Q:eY+8ŧ;2>ZBa(ˈ1ueޭ攞XY鑻׌:lUa1،ޭcih<-2?gŊ2[*0J(.(xy7LbJ#rO &7S+}/y{RSWƒT₽?eL& 3]k6ұDw #d#ɂ{ /-2ad@`z@yޖio, aEeQ@'kfthlϩ#uh]F[RF&PF d ^^_8n eM>5 8a Lk>FϞZkDw#5un)J}.}(F5i ~=7gL[=h_yioY۴\鹃&6}^LoҁimJoȴj516AxA9d4`2L@-8&^0 &ӵ4+t.l2kgo+؛>W`9ڨI)fW7#f77c݌f7l[i̙]8^tBY֋&}5dOOL O]\lੁo!Zt96f42+7;+Om2dQ2+_ tϝǗeă967Tr8^l@3gj v7VtmY,l35$J+'\HI{8<_>,\Gyb۸ys>~h윬Q1V#;d4IJ:y`4 &h*1L̮C,7Zo恐V=6..x5_O u'+&:F~>*3܇QDأv*`(A88ݙ 8Ú xyDxj:S֐%, # ޜ2* }|ߺxy3'^ٟٛ.Zj\zjשyPg&LYsnil"4cpZJӧ|ikx;N 11^M C}YW\5"7@M1tc7Ms׭sbuu8jc'Toco}N^8ncHDL7U{\(hKQkofk} 6bo] &2ϷHTuݺ-ؿCZCFHE5\*9IBģMT(p?>ȧ{OoL3ZOty&bi;)t|` pG~do/kJ4q-CƳ-+D!<Qyn!c)j9sQ&4JWC~5P[` 3ZlxdƍI^4S|C*f{~:pͽ b.ۛ[I~Tgi-XfVssw?:ƍ?x+il=2jd_eM[lrEǷ#c$;?*\gSVlD1+9Ģj՜d/ kMȱNjgwgĚQ%WV<|u=^ ~c/V>ia;5n=ՙXP*: ZDl:XP14$,T5ف#GR|Ԝ"s\ѥѣzoIŨ|v\Fx mMȉ+e۪W&.ܺ&aG&ocHք@z(GhX-׌Z5GXg%5X5T4ݾǫ#-%vޞZ7ٷ츺%5,H#V¥#3׼;J g-wI+ BPo|+m|xm]܆ 7ՓC[\j2ɕ9DUͩ<>X4 'm ]Z59}0*; -(Q+${s+qq}33" Bx0 $Y}Ms=]M)zH윷V~k9 _EIb缵LTމMkl6 'nێgGF@sm۞MpPI)[?zqck%HZ;Z&*2i*պ&uPOm >]*m44h@f%iv荕UtK`_洶Su_9`JBer8.K[]v]>uq+q، 's\z\Gcm6dBʎni-Eb"y1nG8p PwO Wi sdJEU(Ԝr=aEG8kHor !u!$! )eG}ND7{ynq6YԸ3<3l%/sRܳjOX`{ 2rMQJ)z*uq3,sw&@w`7[wQnٟPJ'ؽO^v.jyAU>pw&nJɛ}0KLw/P[߾{ B8x:hϪOX⣂ugե˒AΪm1MiH!ǜUXLΪ!j,ؽ,$/ݜ*X 8sřMM3}ASeg/3@1BA5ש/E,:],PeK3^s<ڿD зS̱F 堌(uj!,첗{l45h Qu|!9\jjrˮ[tA%Y3͹[Jz@X~vK/hYvҝUsCy̰ / !pO?k:gtҲo\C9DƵ;gȷzTϮ9@`.cSzYԄb.6o(S`[_GUf# 6@T;jjYztW:ō[:qULԑB]!W]8xt ryMȁNqjdt{Ċ4K\XZRܣB^ %<`׉뵭h{zŜN-# \IMuA@HF 0lܓ'ɟ7ZB7t\0">FAHV ّ0 _A~̥RqOǰW ozA&MuUah'K7rC]J qD"6J@K'ȼ} _9&a pjllmD'pH"/Cj29AvaG;1Lt; >s|#ٓOX*8!0" K0<h~ i73 䕢Dp"q"bN P= FP˚Xb=z(ԦmseNW>#y|mQ3odz(2+QFo~J_*^G1ER7 ʂnPz#)F[.J2 R(k)P^CKaB P7WNA@Ǭl1WqHcm?i/P۹')2Yx00p G! ߹ ymS3]Iv%r90o@ D'PD.raF2gqgm(ZI~f-:3 #jJx<  !⮊ "!Q-JtPxe~m? b3ZPђ6 k0 6/%zDϣ 3K{_ " d(0&x&ޫ 1ܥ/N>u/!HkEx%XR~fa䏯7)UCrsZL^Z2L` ?L~c udN$L J^,P^+̘?2/y O б|}yt7J LӦy[1I\)p4ٳ2޽+z<D M+,}#G7p/kA@xD$$\CkS-Hiz^A|p 2j"bsF CLҒN3d@N̖򞏄G_@ >AGB_||H)zBP%JԂ⻖zw S()T?ozijoKNi 7/Śsg3kg{ZGKG D0BAh T"2Y[ܙ'z_ћRsFDq#(|C}qPg}Mx S8c&2BQ(k/y tꃦC^gje͞}욞vܜ\G>tulڒn Ks7tX-PL>W̫)He-P ;oHu:Q Z# &U}w g:( M*&/.Y~_~.H'sV&@ Dc|nhdń}%DAGH@J Д13]\yy 3p& ї0mIA3(A7^Kk#0(2-^1'!ѐ9Pga/%d&&3_e ٞ Х8 c\02 &}D\F\B AѢLR58/84r 2LidM' uS!s3 :SUGJr @_D N;άk`+WDž7`M8ZW6\YáTdNAߍr)2ڵ&HHroj[ LW*?{mҨZm4 %rFAۿ WZ8;tUskj[_!0 r0*Yt׻g9Ks$Ĕ_~)bI 2]Q Q5FV JϹd]ɫşQ%$$8KLy J⍵JM `Ӛ8TCZ*^8օǞ}h}ؽK>Zy(MV>gpqcer /鴫v("U-2tѐ,sWϱyȑ#ȗE FjG*~4Iz襘{Dcڥ. 7| _HZX䁐3 xOy_(2:/-nMzZ0+Q$ =2^>lܸQlkM8{~%ȼ ^tŊT򧪫2ݳ|/G^|wwQ]hX\`r°q!:F^ܿ#dCd\agpx65-6q1ajg.U;'8 wΝ~1 Rx&͚6s xs3/Xh*,uł!״,ӕYP غ|Dxz-[L HƖӽp@4x|8#p(}?reo9sX%)6Z\9crjqe3l>,!Ϊ5JhA桵ӧTX'of`|nD(}qʥ; 4/123[g#Ga8m1*'dΈB\uɆ\q*IW7 era]C*HfUCgNL،T51cHKNx Zymݷ{ B~QOl ˾}`Va]>smb.l@P8YpL`gyݦ6U(В:?<ϯݻw޽Jf &R@ D(cx9K<0n/}#1|5]0J;犎wt,DlczހZu +Mz}OS{MĺbQ y ֫˭9E4AWSH&'!QpHgɷl"HgkC |לg55pp}{9<҈5ԿEXdZDBbzM~b\6K9<  %T2 ,&'!QOOrB'!amW8Cƨ՘t:&P n2n$KHw[&ا:P|)6!mIH48K~g׷bJi%D{3 HMż~OK%$/cI)JgZ$@~42"->+HS$ciH{ȃF2j(K4<2ƒROabW{V)}qipiEFG: ({] H q ;ydFw0Bg_Wyhx[ j "θȀ})dPZ8%~㕨(O !Q7 T\-py> T@1Pr;ܹ{ܿuXxS\- ())P={_A9L^ȑd $$&29VF-P~11zkH^^zhLNASo3&'- uVr(R# _{ģCJ8t2I& ES%$ j>}`0s Al0@o^P [S{\59+\1T[I40?Mr3ʿ~XA%r9r%gH+)mԺm[?~]_VYBa 0&ėLfzR9Vrp#+>hxZرèQ#ܞD].Er*} IH ̙s]OY F'Pݍ\6({,H)Ѱ6U2^,aDmXj %eg&䖺K {n=2Rz9p{LκDBBbiЫ%^ ,C$h~RU)q緜)6!nQFB.)653@Sa#W3%zK] 9WLNBPj9 dr5 G80w`nm&!0(XYwdhN ]E7oux7}@.:)S19.a"ݴ7kÞ뷫q =}yN1mK Jl_ ΨTcJ_< Pp\zr CCpp`SW<Zֱ|p;_fB [i;h(8.'St![u:Qspϵ,ܨGrGW9Ԩjr8ӌ:Hqߒ#2q##q]=@5)۔eNh#Σ!S37ѣCqIѲpFB H+U8ZJuYUjPE*-4'~]]pE`4LL)5Jo MHXE{ݻ\îΞEkgKWhQ->F)a/"[VUTiIuKZSgl FS-V.OOÇH\+!h"g܃E +9.Hj.ts-KHhظETZa@veC&[)tFV[Rr+! BԠu]{r(Z6h(x٤d'"Uo|s!1@.5 {+"/*rL+kG* ee(+ޮ7}燥$`ȸj~F> Q W9wHTMU<3\ЎEz [ddǦ=\ F#E[oYSETȻ/ APY^w,sbD۶mhk— hssNpB1P@VׄU(֯\:~X7 `4Lr*h!ɨ>H- g4 'zM;/98Z )dYyyѲpF@Ѯ]=9ըBuG|\<< Bqq r!˰?ࣀ2$JPl(Pp+8wP,pu{ }>2\&ʶm{WUeۺ~}|=8o`C&PVq@h}q&31y/]ܾa3W@6i6q qEWɀau8;R:䲎[wZ"#~}#,EFm~r*Ppym͏+kO~0G#-`0, ̨Ra{vZh`L_LMoea'"%) IDATuҫc01Xtњ*vH5 3?2E* w9Gr! g4d11-R_ C܅Wve4m95jMl$e/q+=21n`4A>Ia?0`4QܵD`XUc0w}`0,>,zPxDv(ʿt%a0l̘.5&+džM֖c0܌P80`1rG<+>~M=z=mDP0 q᮶eܧZmx߾=S8{^"7$$ªMkT66:B#m!7QUW/vsHRf#=snr{G'ǎkռSșmOWM$6RG71oGJ_M@L&j4 Tsq"*Ba\Q8\A?}T>T\  Z@BDu'Vs١0/]4wyx' qԸYdgl2ht /?>'yY`T75juoEERXQQdTЫcǎ|um-s:I-Ou(HA(P]| &\7P?(-2]1}6tɉOJ'bC @9 }EE(*J""O@@oO*-+'V?=|Ï;)L9+:R.'7oV?I*[̫*T/g^˹sgBXdswqRk&zZS6C`sXB 8NNM!ء6cS B EG@@(6:?,,ȅ ӏ<#sϦ^BjmPa!Jh+?!L,.<>^<ǹT E&t j5m1pظ^~_'uww}>PB4cy|i zwmkN|(2mv:ΠYrS%:;OTJv5Zl22B:pT8,UwK=xCˉ?iJqbҦGǎ<3'3vwlAo~"+8o<+ #OOTxUύ*'"W%}6ݻ*+++)) D.=YݪMp7?b3rbsw*]OjjjT*UYYJhxS'rJV{d`0nr&v*i&_ϴo߾_sƝħ5!?꯷^Y١s[Ue[73܉V'N$ T/ONqHRIuZ9>JYs&OZ& W9絮{@ځi͍wOb]\59Ei@)jTFiIqsp;77>3I;oZFFa%%T q{BilSTMg^2w$G։^ְ6/u8$5L@ZX oϼ0hkcCC%|Z8|b2]V^pC JeHGNjDm1~0EW ,)0CH.7ژfcQ14(/ߟx)(%:6Y";N~-g8?UT\ztR.A<thL|PLuuڣ!6Hd͞qN!s_TO3ߥee⊁0aj1P*p8q m Da~FH^87utfs폪Cx(8ʝ]J}blcBs3)! P9'˸|Zx+%|}}:bR5"#hu:SO8sqq%̂:ښcG$*P##Ѫc {zt ̅z<4ZU>rgj-pѧ"& "} M73^,fG:2gG Tp%ǎՆM`*`}hm4ڃj,PleÜr ˊn+.>v,NƱWkұ8bYQBZg(x|+A-Kew*()G7j,|6Jqq\.S(Dj3S0֭H{hb ,(j$5R1?zW3B[ X6;8'jBhՖ׏kpYc0 Cؾ`0ƈy`0[ h(|De0 QpcCg>"Y*y`^)/K}1X9LRt.9M =zyF$}$?OWN8],{ƴ ؏`81nkl<(BɅ/e|'%peWoW8ˍ1_gN_IHN=ڕOEX%P}d HsXW 1: yP*0{h%dq"y>q>CHRRy[lf*\:pX%4@ym[*㬎GUf!:/ʊ2+ykXʴ3i,ne . PWoȽrdȨ{wlh@6nSȚ*r(q_w A~$z_)z 3]Og8d7籠 qb 0&1|TevA10)S鲸~^\y8x0x£"O)}M5eAï.9# msrVL>m7E~`ݾ- ji7J|q;퇋MK;ӕ9h?~SY dEwdm 1 `!RrP?cU%D&Օru4e3UfQںQh|WtNG\)qȍ'k~٬aF:O_d'ٲ}?_;$Z#OÍ1io?! 'TSz4Đwùz~ &t4xiy~KW{mYH,>|c P|<uNփd;RyΛe#DvY|n9G{4|Rռ56Pť,smcG.ỡ>Wg7p2*c۴*w#A h(d{`0M DQlJ`4Qа+:8kf1 FBFuݖ`48*kE5j ]z$626P?f%}Pt\LO@OX!`0f.n9pHPxSc`NY,3[F]j$1Z(!P -[jGwPKvDKND&_we@0t;0U`qF}۷3r J)zh]P#Q)d"9-<^G` 34{=8샠%ڧ);]mj~Zys³('d$ujJ @j}`P"[|J)'P5zTx<Pw~,] J=;q^que4޿uY)sN ;[ʸӻ6?-Fvg@\X%+e^^?՗ڮ)ţ`{>='_ԛ!6k퍴gQ$};ԒYRZ!( ScF0+ !kg?YK].%.5KGa3ERg)Ke=ٯc9wR;‹/34xu뇶}=`R=N=n.z!!^w/8 ؀PJH`t/L0uK/}?іϿxjH)2LזJkt+mDۚ:D5-0SHȢʕv+dԞYm=D`06y-s y+5i3`Ϛ]4Vՙ+ĀJ/y;n W*}ߐ\v";.n >ޭy֭uXWv lh>ņɀ=KlNf-$Z8^ȏ6d-GŒ0xx9J 1goԝk6L@PPxn`0 >~V>5*`rUa^R+ *k K q…\[Ce>K 55jL_j JN\.LsꆺeLH -Px.^  WԴꀠ`/5.\וTYEyMM(/ 5jcR^FsьAI E%9EYr[DZLv&n|!k ÏZFR랿:h{~uk<AV O|pznS^>upJCQg~:o|dPGXʕ-9qSCwknqa>95BKpفFtIm}Eosgޘ5$26.KیѳP9~(Z7zʁm-a9roqB( ]VB#[x 6m `j].$W~Y7Ejktxf~]hEV5mkYFi5JK۲.]:K$CmܸMcj|NA#_~̙aP@JWW?u.]^!r5 5>ɂZرhjEꬩs[z$xsQ6 P@~vcQgD4p~7ӱ7}dPPkR5".be:Kpkm O }{mIcSLhn)X.$w_!沾%1~~*dYd2;T{#ύM㓍QrR#6ChO3a,go)Prxĥ@hJAqbzO$qJQ_B̄u{{KqKg|R.J%'q4?%LPyv"DB)JH9ʁ!qfxB#[%@ʄ"ZI.x2)4 j3/?>`_f׉6wh .BRj%zw[ޱ4;@ !V޺u 2k'MRhPPS{AeQ+9l*֞i۾06u8/.C3Vqxd Q}XɄ {cڱ㒂ŨE-u{4iǢ"^|BCHwժ'6>vW-x3XJ6;YlЃR"G@AZ qkc^2k#3[a T<+H_ف@\I>EBAtE(vxސqIҎE/x|W0$i׊@]ڊ!}!FeۺΏOlc!؄4XqIFg=6YӟXҨܢゔj8r"k销רr&$]/Vۺcj- ʊ2/i06u׊ LZ(!@qrkU\<ŀP12D"8@J Pl~e\L̔dڐv޲T i*9FM,7)+"B Dy^A - !DzX΁q2q 6. V!!!5$?fT_B[ʺu[[J IDAT{eW7, qyuV[rwTRy{֛A),֯[|䤮iN;r`5サP{k s>QA^fn[ҵg;!{mKī[mScQ %In,TQ_  FS37븫a!a.#|ɳ@Lbp awi+7A %~hz7]Dï?_{m͇W!̚T. J*Bѣ_tnWR7k.qV UjAUj23=ޢiLi՜>/g yf}B1쁁*Ze~o|x i,v XǶb6{YѐGC5jrH33!A0 i-&rZU@5J^?M-9"B @@9G)9pA'e-/,#5 &y^~NBzӿ{e۔PO~Wprh V@yWn_"Jgˮ;w ~K ;K-33sKQؽ_fV4kk_.cy]ix6Krrؒ_02 =y^ZjtF#??_TY`sZ 3__[$GJ/=ztI6uO3!7o(k^;Qk f8B)9@Fl\Cis?,5Zy~6FYx[zkIܛ"ӛRʉL/rU. 9 }߉v?ڕ2 'G~hHgy9=;)VE8c#/,[Ll6]>aÆ z{ubo@h9jimZ%5pa_ݑJBs, A/ Ehr`AM7ݶJiY 3|ײ]g(ܢCDEEXL7'/W9%jEp_?;hI[߃l,SO޺U;Bi~Xt~^~NfӧH.kG3=}l [<͓]I_*ly&PړČ囦p)jV$\~ɶFYC KeRxy?Y<7_ݠS~hAV=<<=>O DC)t *+ wf - ,ݟνx^) 6w5$FoԞTקq2.40=ciC 8 h^oiDmMM橢!'uJ ۏ%G~>ö~%7Ò:ّ|Tn(ĺT=V7uW ]3!^^~^,]WX@aA߰'z$f1w[`!E(^ e)u^ ݆r5?=j\jn(@Ӆߨ79Q__իVK?Gb+>bţ?$ v - iLΪy8, 7Vi-{>\ij+-$FnK 7ob`OZauf:OXp]P !PG(88q~~y]I+\W%8tGۃBpa| r_8Ͻx|fIn5Jfm29@,0W~kk*(ށt`Nz1e`ǾB{(|^c j_m vWF|s@֔"ju#)As%ǫ߭=`POW<Aș{y; v7JYÓF8p+t:[Jezb0ǹv scS=Ύe#2OmX*WB&w*.ٳڍAA@#CKn ꊑiSEeh#Y;=jGL]QtbzdvN蛅ť7F~#dIlKCg nts%jV]Pǹ?lտB,3޼I!?H6Y& /Qn[BJhLv[Q9="yҤO] `ɻV]ڣ=-Zqұz]|irO+lqgӐ&>gH~ܕý=>mPOO/e@|:ڟ.XImyJjނ'_LvkVJfO<`w&M:@ KKﺶۣp7?q O7zy}y?IrueMxK>^[m߳oY&PTzвuFjQ*9CKƊbd)~h}:m*,ނ[)Fc@FРo"& z1M1ôGߕtTR_tЮ}DukN؎  1[^;Fq[ZTkKwu%sO#$cvl6bN1sCOX\O|09%ar$łW*/=r\\]wYkB Uл1>jM*O8Lz71 9+U FWR뷖O{z]ĕDϐ0Ȗi6óMO>s?=چ8Q𫍹T] 4clऱ&0 _N\+'0\~D3q\.3KϚfoy &3qz6m {XS0*}Û`װZk;grۗv|Rwiۿ0k}<[Rg0D[{(㒂ų1\~Q"T]8z&~go6߾6w ;}Î)Z 'BN?CM]R#C[1>}eL(9@ǥ6Pp quUsi}ڂppy<;Tւ"%t0+ u-9f)8lϧ_osbnƽ.쟜.ر|wv㒂keoL;EURٍWrFMQeۦ΢"o Ʀ[|4 } {c팎u eB/nؑohBljrJrdZM?ЬJu?͒*:i&g\ i/i&T\>,udI1n:.]1 ԭ8&gRR7R=əWCe~-Ϗ!řW\߿~[Q3*%{r1*i]EqIA@]6J̿] V9MNqn$te21Θ*b#FNH~˫m_qBiK*SZɟcNΡcm2Bb۵VY&'ywTZ%پs.q{q0`]da2;ܠ;:)NK\,"ns4vz%w:ԕq362޺Bcf N֛UR{.?R#= `bÛLdTHՉqal2҆_m̥2T0>ᬻCW`߀:b:Mr~T\ON~F@ Ph xNGr!EIaƶ/?D+}W7~v韽aƱhyh7̸w+W3wá+8'.gO98/^+i<% 'K= k1 򾷶<=l:]HoeZg|R0[r@[mK=:7q6L?qX~N`| amW)K/H=unԆUZ ߽r4Xk)3=uvWu1N/ޫAVKRCN phnC.gf44YIQPȉeAyf[TkTU{Ir{8ֆi:6t{bTL;ZD;R6c\%^5aڮC$&$/ħ<̭ ӎE/|BCt1 ߾S\#6Vr`֋khyp3hxS7шJqSWcn}lLWP {`3A~9P_Y8 #Nt_W lH;I0RyȀfA1m|Rg4q!NVq6W$'m3<14:tVՆ_m,JZ9qqn[ hrto= +&nFCѕTIY;˅dN}߉v?փL{Ç7NJnx(~[٩y~1 SQ)灎d%woA!If44]I/WVjB<=|O D78B)t ) jqB'M8p Xʕrg7`Mp-I-%SpPmH29΍5<` B qح'u38Yï6֤r\\Ad[vRE< kb؉x҃2oF*s;vJe=TT&8pⱹ2!`aJ(kF*s;3\tbr[϶zPsQFn Ԫz廭>gt_WL',qJNnh*`ZJ0nUt v.k7sK"kpvUZ%Ai-.PR} ~_t0<-?(&%w >4F%\g O(&n,ع0ݱdy|.? ڽK)ve 3>}/ SOJbOӁrvUɫ`sYE^UZ:7m(/}V5++ޒI%47#s("b J)Ygrp碌#HOLzPEKfxPEgK\lt$3bDO7bxs Ӄ[>#[@n -|7(}d 7I} nʁtMG*I>*P3Ih=bxib g3<CIq"kTۉ(,#bƈE33{[MrxPgbs pSm8[:"fֳbIeI)XC,7yԥJq혜.-T X#V?8-^J O<7Kg_Q$2kt-?_G$hw&L.>F6O6<:7ߒI fWReI#:]K728ْOljѺWn&gmlhn˷4%aՆ"D1g84{c[a[fMztΎQ ۛ^?G,#lUg3r &9;_<ͮm2ܡOӣ^2.O'i `_ziï6R EZܬp'GwtmOZx*꫋*4FDp >6ZYvbJ"&Np=W-ŵzpe5+f4lxiĺm#P^#4jc.a@n˾9n.Sv+f4v4Ch25R6lUQ)}#=m>t%{/ z[ 9/9rrN.O Af8_3k&8ݖQPD42x*<xP@P@K4?$)\.d8"|5~?G)|//T@!y:OΡi`á pި@ɫަAƃ(jFW+u^5n^=y3$+}vr*Tk*QVxC!2*gz2 ^U7 JtQhd{T (%Mq+`4=Zҥ3}'(}ivtʛO[7hiF\N>#85G9QrTF@ Π Ϛq =m@N"+yB*ZZ-%<@@)h5ZjY'=|@֪E~E{5L e IDATBE)ըPB T ^KQSU5_UQZVy_\{o xAL*JP<'O(Aer2mx1 74OB/B6"6BWęydN@e<{Z# dAPT)SjൔT(j h)'yzU*}d^$ *w`d@yQۻ8s3+utEEQlXDP$'Ǩc@M'ibDcLK,hņ l/n9]aʲ,ks9g]AHuI`P9I ~$G_=sKrd3%mKdθZ^(qJ7>̇Nw>}]nstaې\54謯QHTngW.R&v_i[Ÿ9\$rHG}F>ȒE>e&Fp𬲇nlz h` _le $ LT(,Q*T%ՖrM܆DkC.b{.:^tN^t:lF>4mEH_੷5@/[oX@C0 )Bhm?~s C/Wuވàט0y[BXaۏ %dbi^JDԔ, A=-lJL? Й7m?vcĻdgTS=t&l~1fa7/xߵCVmn=nuuf`7]WNpœ'f,Z:nLUm0|/}5+[4}ՏW]}7{&@R77y- "+8Xy?zF?W:&GU 76"$#y|". $. ]n:Bxۚna!ixGg1L _' 3x /]eKEdedvpœ$2 [ف^kٵose)`=M~0KY; >``هT8K߻m߯?{-(fr>θ|ǶIWg?3u{ ?z?qnƷ3/_ٷ`˦ʻm6j'Յ}ȫ>:26j, ~Ywd Ay/1&3kyt`! + 7XKX[pJv'SsCﲧ6믹g? Z7`:XzE˂d˯م ( ``L^aV~Y9f`w: sl۷gرۀg4aTZ1&Uzyo;تPy \8{?77羷A\~\N7o.>}˳|f/)h{!󯑷Wv7:\1SHDf,3! k*d0T]: Ȓ/{/ 335W8 ^;M҃Eח=s#ą!qU]nؖ.ǒ\2l c2(Lf.Lڜ T6`vcϑV pgKk'lm7,O-Exje FjزFGVmV{aZ|Qe#Ĩ #_*Fg6'u&&6 Bz' @<+]֖b.V(2g3|ic3PTAPmu[ xErNs$  88*CPPBU7y8; []nO`dgǐ31 ֮6H;QR̮}hQLGHi}\{ÞzVX-" LH`0Y0Ӹ 0T]<*:]ϡ?mƊzX YgL00d04 ahLׄQEm?d h:<-̌͝l'Q.M>f Y`8`_R#RBXw4=#$ g=R@ t:x澕G^ _]7BNmn2X7NC hmUf4{{r6!+0d",>ӳhB!Zc COo{O2I1*sH8y H hj4{rtYb`c񻛺֓Ԝi{w%ȤB!]-*My֢+ !KtZ,BHߤhqoB!zr)Ē\3'ݭ $x~MsSZlYIi~7uU`!8g:a@ոLK4T- [9JrAk -־4lOv_|ڤINg[EzUY t E3 ]ʽU?ۨ9#gfdܻMu.>w}HZ:uǮVmm?y#cKW,6zucλw4$WڕdtC[\Wm̸Wpgn6W|1qؔΜ 07D@00an.(>5tDV۴ F=O7*-Ѣ/b uVղSqۆW߫.x ;nZq C/xX #>zY 1}㿌D3S|*twbX"EF’ёqcaTȲ [V){kV~Ty#f=zbF_~~wyE%h~DFq8[d@:u*2%8_08񛅋̔{ﺫϸO>_ޙOz @}:K6]H&@vV7>ypȠ?\jDz>b wō:_em(ocCZy#ed< P#QTk; x>hQ7 sE 9|Adztgs>^*=qhiPWC{cs۸q%3~RPO=Wص:x@-/< aʠ_λPd~#3'xC2'$r[4伫F>mMǵ 7Tax Y_Q3t@ecu}}CXq=5MuOƜ x-g v~}.f> `׫BoJ6C~^ێ< Cg?MagÇ>؃o":!:g\IlB!)COz M&y& 6-r_\{?2-Z -0&!h~W_[X8aA[1BѨ=r.zxgIn9SM!I`;*.`pp]h/xk'^kǍPG!G\:Q,*Ogw=۴C 9rM›RӌwZHxeo˟8cƌ={$a(LB,㏟je[]xyhG!}[9=l@ IO}x[YSygmsȳ j/(=>{^;|ȿW^1x Œ"ғ2fjP9\@5੯>/,0yN ?^a߾}Ձ-E!"~Dʘh8ڧ dYQU2di痾ݞYN )?1*T;wn;BHߐ9BMC3 v]n>ln׃ס|FB_\?xuoS:_-WcO /6eҪ%eBa嫿 ,nǞfμWO\rɼSfkO"%Ӧ96;v[$eǙSW` !EFHd`;lPJ{!dsW5(-*^l᯸2\agR:x#B!Ep43ut؞PB GGq:=pmIITE>BD]Zۇ&`(nJ|D.nqpһ $ef!$-; 7BHEA.R2DLhdDecDfNh28!]ܮ yQ,[8g{A !$ziOYuC4;SdLc!*]uDR{!F֮싯2?قBH*(:.ٲ;!BHwSh !JB* rB,EE (>&F=BH$5~r%S{%_5&V˫F4o~_ |[106q1 Oͮ()u^Puw}amS hul4ic@{Cp @K ZV V? =c !t+ ?y}|Oqy ;x[!i߯`w;(w.eaXQ-(knN*9vlwU ^ sfF/BHHw>Q4'7[&9IO!Oa@bwZܼkv\WgkQ֯vqkEI.|kla3+ i0Zי'ŵQ|=?#>)<|Տ`~RoN=ȩc^j@068 bwiF-sگ#ME@!ڿZwxcW7O=3K='Nk!ҭ#j}'~ :|^M39ySPl#ComnyyegU8rq5_/~'oir&dO0XBI#%˕&2ِ9"ߡzY o˟ӆs릳G|?δt'n1g1gР],H!ʀMSMEٸe_!tfQ=Cie(P 9ZZ+d@'wmp4B.cܠb}Zqf>;cy%!om+*B:Pi0 !]a|^@5/f ''f/~oo'RBc2&1CfB={7A$NcLז͒\<ًn[LmSE 8B9 t)ȉ>v:M 79N։cs^V~q)_ ,n~M]ϗɱ%JesL^^^.BHeLON$MLhjZYӈπ/sغd!pe[e.\_ir\Nt8vj! r&V73_!ɷ1sv,ABf)UUU (9n˙v;'+5jQ#B!V)Թ$RK6;LxdpBIXt2Pk pbd8ld*N!$seD=!-_.*BHˤ 'CDX:A/BQ~XpJܗq$ݮ$>ԠF!}R'{QOBHEAdpBI; r=&BHQ#gQ#gQ#gQ#gQ#gQ#gQ#g)4dpBI;0tl7vbG+ppω-V?HRmvntԷ]MF8g!ڸT`ǿɾiS&fgrrQ4={rKO_05Ezg;,hbXfkfGlim/!QLim{@Si~{ЬjڞaWv6!׎ yQA?|i;Κ9r,:! ]ٰIw!E`YN4B.! s#f[Xg]`ֲlH8/oM838$'Jt?W[ |A'*Ia"è?m4Գ:,e&BY w疠7kkmljlAYegw܁33B2,Y\~ϰ>@8] z={mm-UPw74 klQeee%K^XXXvRX3!Ȱ TKQ7]^ݚS\oHE99%'UxLNvMQ2 !t %𤋮P|#rrNt8V5M#(Ow3ft[A!$3(GKl]elvw(8%H㜽 l!KȠy܁Pk~uHO8vir׌Q}pd, Gu7g&iS !$݊7\{JᲉ* )3)!626<#_p)lGFز)!NJup fč.ħDM e#_63!^̓A!VB, rB2H03\Ovz M' G!ʰ !K̈́BHtv%=t"қ39B!}9B!}9B!}B !$zIhl54z4 UEV _[[pϞ8Ir9M'˘ &O쭫kjm544 !qβ]Ey/p*%E Mm9_l˥ja"wAKE!}RIw:p\`^^a/5Y ©@@k cVܬ~ʻm۞={nWz!t7ϔLyt4thy}jݒ]jh(P$ @hujAߏU, C 0Vźa펴]!dHCyySTP`a!3wr:B=+bV(hT\Y4{F:/BHQh^G$9m*ʰɰq !shT!R^^]]M\EyyyuMMEEź[,r:/BHɘ ᆱ E,+9_P:\$ EMM,ƨ'G!}S< I05u9~əw,87 $"jrn^7\t]!1SL/iۡݸ9l˾ݻX\geKpƽ֦64x5\퉦f_|fRObF>p@}ͷnӦCUu4nQ=e}}=]*)*++4~6wSi28!A!!}Gay{B?ɸq([s ;j𥗝0twN[@!$tve' )==ŜŃv-jơCl7!몪j.I,?_ec]rt6SPAaeWۻ[2 4ss<@!}ڡS߳쑹,){dpŃ\kH]2}#dq 2S8]. +Xnu,- m[wQIbn:!49'e9.9.1pɂ:"ϻt-}K嗟ml)(wegq.8"Zwo,`6vy\:|ՒʦBI)pLnb̈́07cKv-?Mo;GTsr'O=yԿ5!#1XɛߪlXPcWZnX|q+;eb`B^o9YQ|[ɓ}ؔ36̚H!}RFW~c-ݡ7|!VlpK8*=2%ĸvО0 N!ifD%qUlLG36"'].6 *HI!7a4/8\؍ j!q_&9FBz9=/8YN{A1-뉈BQBc5.` `_Ek>?фBHg( @';l %6?8C1!Bcc f|m9̯;5;mn9816ڽm=nsmn9!rv*Wrpcj©czދ&BH$a;g N!i-s!T!>+zmx~i@!G ɥMs rQhc8B!}Uzr4BH B鳔g}{6ii {=Fkh~sy6ƑyjollmxA?i\v:bY< $=LKv <7CS3UWW.u}i-s-M#D*W6ɂ]ݰC=(wTa(`EL{Š99mrƆV7PW̹$s/Z sPO>J'8y2 &)F}+ uUp. np!s.qu. +fdu(߻^+ޓCV*?rohܑT,fK`Y方\tgc`"cЬr|VU1|%Kܠ绊s γ 4~~ >m*eGCAҷ3r-6Yia! 8WYS*!#^ SX'FN,߬>msn˧3vWy圏FW"i xܶ" d][[8zAyS0  B:,2d(,W0t_!$èW5nB7!B3 Ri%){ߞ#PhU6,IBuX u }뿭ҽbI3m5}u Ͳ}jk h·6T{QE~4'69eb*,}DG6GfGJh' ғףYHCH Ëސ O,ԅ" $!8zvgBF d,_8'ۏ}.oS^@ALQMM`>*؃̹ YoBWZg# 22  C32!R}˞QcrbnHTD<.[IdȂB7 ]7qx IkX"ZewWM[8;{ojj`j,C,M[gkjY?~d "A C{r. م=?KE{%9ᐖ(v&O8b,Gtni$^!λ99Oc%"*1'Lx|Gy#^eB yɇ]yɋ]xhW4 **~nn;~֢yt·V\sXPͶ{F(2dA"(6TUֵ5nH9ewH97gR:g> Q%$QJDCor`xCEat]Xʇ8BtveKK}'>$CO~,`~RoL9pvł5 c!En? l;^$FCZwo]?؋?wrBDٳocm^Gk> ԌO>f^N+RY4 t*G%P0 .>=؎Cɲr9aI3+7O嫞CqNI+7MpD",W@} gX8ΝzcDM53s#G~Β]S'g3mbaHn;n[[AHHN[vG֢OV~n+cT/III7vT K/L5+tl=)3 Cus08BmbVA}I7F&K;|\fC 7B 1zPƱ 4_W8dмobgo\yU`: )f,!6HhV@ҙ̌\ةSѹ.9ҋfvB>@sd-NO. rB2@d=2OBzժի.(qǨ'G!J{K32hS֞Qa`{`z:݀#XWuпT|zΞz?ELG/w#>=Rk?k AN&ܓ|BHJ>ȉ뻱غ.κ@UΠ{A_М `.)I1&I$1&u[?glvVro_\}M0Yhky#G̖(TUS=Zcq$sS}) 316̌EIENDB`PK-TPK.[EOEBPS/img/fmw_login.png %PNG  IHDRDDPLTE=[Q3f`is`itclwcmwdmwn{rQrRsRuVwTyWzW~Z]]^^^_`abzTd{UedfggjjkpqtuvwxɯɰDz̳˳̶θѹûϻҼ˾ѿʿ™ôĚı˶˽ԨԿJ pHYs+ IDATx `Ew.ch|VAQAL_U8o'Z(>PrP4AbRO]F.h(5 +"wms;{Mvvn6?cgWc~1V~dm>{!cgcH15r oHruѵh|ȓB{c"dۍm!ce^1V٧_4,l~ li"wH+Z-X+bc&]9\S`Y24DrL,V K/-K_*g"@/EgY$E^G!Ї1\N JB,]$- mfh9В=\&B]m9& M]:\;,x&cHb!#'|^y[ͪX ,ر;jVpEKVbyj*W<^?H K5,<2܍ڜ# "0 d"tu Bc•_r^FeeKS,IKƺloIR2$>X|ts epX±p%/m{خc/VEB]{E6$qndBt풕˨X H9tX\eĢ|InY7,%iUT9ϑJci㿪V|P+U? (0/9aJ]T)ʕJgg>C@ouPҷ[G"|V'S%HW5%YW˭S`!"ՙ$> *&;5V%]UWt%EW%B ^P.BNr|gg{_uU%FUe8 F<-(._V236rRdOr I1@ ^lϫ2|_Y Svp{Y gM`SY f ) 2ا AjNڮ`ߠZ܌Z+lv]gaZnkGiL:Vp:|`5KugU"תû$@J VB/z?t5w݅u?ѤX,N]3弋ŞC;HشT)GF9xhţZ][{5_Joܙzn.қl+TK L'E|H2IkZD&K$׵zTMŷDRǐq.yl7=al"/?‚[7ل`l"PBSo{@MD A8c1 * }w*"aVôi[i[я*Ob:A:&| KT pZXvzϵI}aUUKcĵ mGZǛ@MXM0m+;0x0]alveW_-779v$k{9!Zd~iGMlfA_;~›q-K #YܠZBlr7"SKMc1x06&.@(EzןSVmsyw?q x^?#y2ʋVbA!+\uѕ['赙{nP]gHz^!>Vՠ%XXIIENDB`PKЂ PK.[EOEBPS/img/format_cells_date.pngPNG  IHDRy#IDATx]UŹs۲K"AX4Qt%`P"}Ɔ$5ELyYbADP(KXD3gΜr]{O\7993,@եeuk!䲤_ڮ!B*U$A/=E$7 ȡ4-) Wr QrQ[nN`uk"7* Gth{a/ <(C = $'=M+dd"nV^+L^d'HϬ?}.kBFcV%"DW+I{s$^"<8T "}Ds3F}D}^j“Q7xԯC#ki‡n3^y@0 "JX :KQ3С5cI)Δm:_}D}H̋( ^~IcSV.Gryx=Yv(a8MBIbO)GR $xq$رrz9D$y"G,C <2|YaSQD//`A+Y $Gd hQpqIn$~HJ2Ǫ9Œ!B!FDOQiZ8^e. + B'Bddb9V@*u+Qi^=J)_\^-gT^Q9}XLV!jKu;lBѹ[Y(F핢֤eSO|uC2T};I,X/W,a/bwPDPKu}rZ Ȟ&7^$G,dUZV*r8$0Z/cH4K4kߩ7N)e \ .hdjܒUR)1{931?h@^@DdXqs Ieh]X.[eS  KKȡ px"v5!Y# ,RXXX`ō~~Jk:b-%'ZR)$ z}2 dYRaV}/_ypv\$M:{'7]o޴yaխr7U_+Z^ uD}I/#۔(Q%j͇YH-A?\rra6C^ȁ0rI9"nUx'u-‹/!&x)0$h(-~9P)+8sg> dㅢ*R_yoe-խr5f6uA=fDwԁ?0 e٣큙^$.K $iϖZ7|7Ee|]ZK{^8}c@+?^8}HcBֶ;4_ןHhEK@CՇF  :{a~Ai9#sj~}<խ"הChu}h<(<ʦxȇ=${]YL0 "ro;q]ԏ>Jo^td<(ij@T*?o"Ї=pX8{MgrMwB(pBo4ߟl|_DPйIn _kdRIuOmu}_7{6lnnu8׍~q߻3ԨjH)6i'ʱoxy."/W<{@HH~3M]ܟy!m D3Y?=M{vɁ`e/¿7NA(C6+''_RI(z輞9baiwȧn8{(?;w\_@5jս}-+/pK"=}~#oO\ZxۧKD]-"t%Tyh=xZ_ 22@i@rA^wsmeXy(.)=d)j7v}.GY+Dxl_J(,^}m{?{mFۅ6mWtkmx2I%Lۖ]@(=4h?K 7vpޣџ.]%EO?snFrdh͟;)[b@_;*C&m?Ⱦ8 edƯxO%8|Ţf8=_v&Շn56ڴ *#|q陨 T\D|Mw:|]? 4OKGO0d_6r OS3cpˎ(Rb|~9Iak/oua=^?;|Z}^\}*?I%LBȾeSKjj ^hnٵFjXQS5e%]oהѮL/_i@ !S" QlgC<ӥ? Kݐ%%g|v4-YۺAmy82a9á/ujR0D(r ٗL="{){4(خ}QIywHβzٝ״csw= ߝx$nQl;LExL?pfPi ״.sEKD.Gr/[TO{ v"a|:\+4:oc,E*)Wa{?ZÑ%'X5_>w>vibzQKu_zOZU['m֎N~¬-JZ!:}7j=6^| K^՘-a'ryDYf'h7UzQ)xue-mz˫ 'yQ rTaFc7&OKqs t~D f+Ɗ&}&?j,k)6Ծ7`lXrَ.njpԗ+;hnU# \]> ]Z/~jɯM\$KwAi&R$ "ˡ(>kougO[śpD&C};pCG-^XÝwwв/48(H;jd_ZV d4#H>nx1`Gg2aʞK|8 xtyšYmMw9}H{31 . QDjJ4lb&d~5wh}Xƪ2M`Ꜻ#26<Ǭ͋; \.5'^=@YmHJ_C#CSG/MC%~亽V1A:pF{~# m'a>,K_~ +]=?]  {d‘hiq&)?'&p_U'CxTaNUAw˥EggF"P@?zb='e_IF|0~iLVk`z#d6!rbոd Ns*D\]1c'̊Jj'3:^S%x~E߁ @]hi.aS>0aHm+XlYZȪ}!U '\#H2O$40V;cUHl&6V_Iv%\dˆiJ}NY:ßC=;<5doWfar HƣMz6 PdԠP !_FuB,rwR:ϋ=x%nX֪4*;Pd/hr#D{o48>Uēb; Hߔg'Ñp(RM4 Zٗ~Ѵ;lj^;/(oi}bՒßiN?*n0@WiȂ E61 /d_p;ﮝ'yy4وu-24*4 W4e]gr6ά͊Jb!=|Xpo-"Fi.I XwK+SY=O}nKʣ+^v;uRp ޥh?0to7L4&'\>ouW:gC?`M`#chǶ4qLKπ6|P.6I̊`\|N%co> :CU.ދ$JPiJϿCV_5A|{oDUThP?7|큖]V?EYKB˯i?JkNkMeW[L/T/!O ^B;i.vCW_VG? *#gD>"M}W96񕮺$_2#s99R4^ }߇Q?TT>X "P%Gk]%;kpv;OxF=!q rhZu#(w4${Eㅧ< òKr_p}1npO%Q̩h3 z@(pPu~F'=**ȗv"]elcbR ` rP&ޒ }5,U(/}A>6U/lpiOMz[xƝN|`U^\튀i s} w TJGvK0%ܪkċ5 I'Zw#YV*8dH덊LNEԒ٣s1ג ~iRG||0 ^}gDsJ3 ݰ^ϕVGr{6ܨ $@G 9p XT9X,O8Ed/@oAnC!&[/˗!/"v@/Gz{͔IVO~H)zꤡu; ? ߾ \L2\'"IG7-09`Lw֔; ~#5o^tڌ51=/(칑!B '^hPE%!I u!O~HR0nnfWk-4J1vECșdN pǷt{ ڽ0unpD'r;Cl_jJjtlowǔUbG?d(!^S%{Nnzqv˄_oYVu|"?l曖{ WSU .`AB.SN>%_xBd C *#ZREO}mONg?_χց,-{tf6#nXR{<) "ALvS>NGwjEy\B┋Www7߽ խ˒_=K^{}n& 6=|$yvAޭ|tвGH(>t"|Dj2!&^):G_[evxB!+Gf y^ 9"eΞ#/VA8I"R/tW?p˭U:B.K=:ֲd4t }*YE]|ErȍA).b$_#a|84Q ]x2O@=_f =sA(Y>i\{gWX'@riVyg? n\DPPt!iТY,22M_ [ Ed_ vr􌂶!5F"P6U#ggG`HnWD2'L'@|`7/6蔯nF߫ELJB*GdY|'`7k%I%ީh\)j|AA$=0ң sЫlxE?^,xQK!D.WLrE's$1+.5weUFE&~ۧ jzR[$_ow<| SZFyW K=d︣0ٟH5Fb],{E沵ޙFL ,H/ 1 "H =+g:;",A+%g!#<c_X0mDeD=^yi eW|T JY8׳?yڵĨ5ھhH7٣kb-a[1v{3kZ9֍Ui)qX{^?T}Ɏ]\Uǝd/D"EІWՔm"}7oO%}ֺbZfȂsu}HU dظ&2u9}r5И9P@-QزQf%~+m-~ޜy %/}ijR[$UKy46ne+} w}hCY3fZmv5^ǽʹ>j9P!*l@Q[LAs4 vݔsR[$U^FN 6B4ak1p1V9p'[ g'k~kNkұ;!&Ne?{}͇3[sz콾KP8fB'z'^sR(n]I-I1֑rA3]{EITud_m&ha_nVvb:4g{[ ç6m㪼q%+/=mkB E;Ϩatu"DHjI $RTw@Lc@bֳ^CiȂ?bah4ZJ鹵s| !KM~u4~Y"WzմdYmö́p<Ȋ ?ֺ), i?\MF:mҵmƒ'/&p: oJK 5>60cEtkhʱVU;g*վKuۤasV룫}vWY Wvlԩ3NC?VA3l??8GV:y܄VW6nE E%_;Բ}鿿cVg >%޹ǒ}%Irn~ww3}C.d_1dཱུS?^ؾ7wW]=[5kR*š3d"Ȟf/I}S ُ4۸a0f3d Xƕ>/b/vN /=OSke9#>o#rQm3d">rd-~zNġ#WYL ڋ}6jT3 Z8C`(M&ӼQg >E}"%>zO{C @;c:SN_VP1&r8ڴ\44!{Tea]奬@}ʋ D dH^E">K;e<bбĒEΆӭ}C5.-cC5W$' AP`cch.rb1$*dq6^ +R."3d">">a_>m>x%}5인6eCrH(8,(ٿG=[UmA[jb3d">">GFzawr@+ލoL`Ym,{M3e l6&TUxC22VZ1 cXQyVg >E}"Ɠ}rnuWI~ɢ^{9툂 }ŤЫ$d?XlР)$'6 Cqo.r`'d?{,: 6JcN ),< ٧$%sFf'+bx.;γΐUݫ=doyu: $h QBLf? á={Z}};%DgMՑ}ÆM s0$2MCcViLc*OJonS~ٳИ>r@t3dldj)1i.z~v)z-Md1;%̩w&E$dpp/j;9]e} &,_4lxe+)CT5M8 d#{,֔m{G## XYa4zj7d~W^B[ҢZ&vC8׳?yڵĨ5ھhmXKЇm:I](Nn :y뇪/ٱ3+&g9Qf4|ҏKP[$d?st?P^3dZdMNonmٷ}S9^J ucŌ0^DKsiGۻ͚쨣Jk1 Ss y6Eaq9 @J^l'WWωgWL sǸ"QȔ9aB ٧ ٫Z8gF!9ݜM;-V\ІA՞gbZ35IG9G =*X 3jAs4psvprN} `@,24v~G[Ș쫽 ŘOyIW0VOf:̍4(lhibIJgճ rsڳN&vs}v;ꄈn-b^Yg|(Zufv^d_1d_*2.4=bdϿiz+=d"~" vȼ"I y|]c}l}0ޯj wc+B\SS4g{[ GۧڴKRдI$]+A'ݜ.]pL#\=`( YG1 mFK7٢| !KM~u4~Y"W֑>0| L!Bj٫Qa!빴5;L#;0t,ca\PsZXk[-6id&2(K=c飫]#t͝Ŀ(~jJB4MnH~ԙ׌Bp+Wm"ABQBdYbCjw$ɹ1$wiP>vO {!B(dL*&)Jk@?iFq`8fuv {!B(d_Erd7*~zNġ+d/D%HRZ ُ;09tABQ"ȾD}2 ${wkfIN^rEv!"К@Zyh|d -Yߍ˫[! ݹb]`ZÕj{F+{uW ŠHeLKtհ}&ůėep: \ƺ]¼hH'@riVygx<mh=y:_e I@ZQa @i2=+s3~Bgٷ}S9^J ucŌ0^4Ҏjew΍oYi>z4Azj!09޲Qf?07g^HK>8Ȟ]]<5pd - 5 j2h"QTQӍd[+NZyx-ts_27 9O[كVnd-U78G =*Xc ,ykq{6svp]77"uls̝U!Dk2hBQ_A?L23O3U\Qtb\B~ZF [ᥨBg rsڳN>1XS:!aK+&Ne?{}͇3[sr.q=|dϣ\2YFQT D1g'{V5ӳ¬\dOt׿Z>2/p@Y}c룅~UUbub9gj@>iWS/8!{u|^m.ГXԘ d(e*ĢT0A٫{=tLc&f=녮0}Xh2s=>ֺs[&tC"XiwE7iW+ފF'>jy%d/uTI=/7{5$@*Py؍?ECq&Y@7A;f/IF_ ُ4۸a0f3]̍/55 JDkL2v7Hԑ@*Phn^NPAU%)G -ǎ0M:2G=G.y(R˲9*e>N@947gwU))GI-G{:~3G+htQi$Cx# (A@ (^ޛi ˾D}2 ${wkLnG<ډN,Zw;㪘< 2QE_Gؼ+pyKBapbyYCʑj\V7¨̊k h`Q|KDkVNPEkVMP)N_۱^B喬խ܃?b{tJc84Cd/+,B<7J<,A$(Qypy"y(@ߒPsgyьuBho7P9Q=YcQh*PzTJeLrB푳 eK;wyڤ'dRSc#MQIV"(JEVx(_90!u? Kzb{)Y)-A!,вPƨE3n`°WU&xhQhP Hez73 O"4D+M%ZqAP7IF^?D+Ӟdu&E-2IkD{&c zgZ5jx9=i0 ]ǵȦd.U_;^󨘳2dLŋz°/6t)' R7CzU{W"/V&U| )S`WS(׫@=Jtӗ#}TT+^ْǾLڈ1Uox ET1\4/Ff"\^'tvޓƾbsMޣ*1ws+䵹 w9cM_;^4W]ǣL'@_H^0C|!+ek3CXk楽Apn` 2\\{~6̖lzh{i\^':W'zoSnES}eFܝSg-b um}oX]g<Lj9{[ѽi\Lf߽C菢3Gq*Ѩ6sfd=Oz8V9u^QlYI*D_j]ڥy4Q)1m1̜Dg_u6Պ-F+cl?]L?u&0:׾'}ŵצ^~FVVw0z#t6uxO}^Ns׳5}~xQLM9{ܶI'1sӴN#nAm"{W3%̩w7i$dpp/jy!+^P~Mu9 !}NeHnާʜJ6ǮT:VeɊzt׃mA"*4^,5C]9:Wim.ݜM;-V\ІA-{AL]72pFx`qqor.0zT P;g千;if?>gc}Sd l7x @*P#JVQ bzkZ@zf-MZFdUGYηiφ;2M `@/>;Y[kuBD7XÖ 1^v,3k>? ٲϔsN0|֑yȲdjr*P T·G ^o+4sY?zWd^j:Ⱦg0=M{*܍, 1 stj'h>OmUy ^"_X@Md oDp ϛ(|}Ģ^f@Sth[W,OzHS1EUYzò ! ;-h)yֺα3>L1 ,51E/e0_oUӮV]gQrZo~9˥doDEdOP":oPdUz*Pdo:k[kH- 3&PDa\oU٫ `F=bnR6id+2xE߼k,&Eydo6[y$d?ukF n4᜽LVEژ]V=@l& %Wj@U7~NLДTDZǒ}%Irn~ww3}CSp^1 ?\Qe,rLJJ<'ʗ3]8+=2.Ap:pyٍi4a^Ng TAշdP*&)J1W8Nd?~Ҍnp:bv#G' jrY3'o&Qա8>,If;kX/9nJ0׋4/ KP^[dl}oTU.$^u[|_w8CGW)kjN*)GUm=,{*lEF~/dZ[!0A鞠̢$/sLJ"V Td (>rd~io}̡c;"{uN=̬ ){a$W<̢t@P!;K&6P=ՇYT[K*l^ T(^;Ȉ :dL]ګ(#s> P TZYCWO&d쑅`؝5|G׏( T,{=*RYR׎afG##<c_X0h<+/!:̭j0Dqg(kQk}cZ(;BЇm:I]fY7VgC՗Ued%1Yk7*P T 癙 ²7'{@S;&i!hβor"@Yf+Ë+ha8q.mb=ލ7b|8}hLGC(`rebmzZXkkAk4)y鳝\]=gQ~2doc*P hd?Ј%:rGPY9R@y4d]#+/դ/fD@^yEd*#Deo 6G vp7(Ĵ+ө9gj@>iWS/4tHڠ:J[g$P TF}AF4)^|}*;M ct.L|9*ĬgUeJE'&^k-h)yֺegl}il Yjb `_ˊas j{k& (關vZ,Q ϺST#T(${*I'{:}[e _ c=x~lUs59{LxF=bnY 4@sV룫W%Ŀ(Ϛnezԯؒ#&Sg^3j0 p+WMVb26dOQJ%y> jUrP *䄣>7 KCt[eWP[0l䥏:rtF.;گ&`DcS|R㿳$I΍ ONcp{=u㇑ GJG:wxyB\^Ӓ!#nc\kDQ%pV@+ą0mQ5 굹EVyc9{$@#*ޱ0{ULRclOT[I3k6s%&96u vYű9eҼAMiy6ބhFTg ğZy}q-FްA+֓KT-Ω+Ȟ zTNRU[ ُWωax;8t}edFϧ7mN6E2[*h@}^ŷOPl#[īœ/4n*r\EI^K &똩2Rd^EVyio:W6m/A|B`ت\ɬVtg'MۓK<4dZ/(l1~67~gR/l8D]/'\g^> :n6M_7:s-ъk[=}Iʑ}R $Qc21:'s26,P1VQA3U_ J^ЃblTsӿ5<V@54/1 D-K2%:['Ғ՗53Z@jL]R/דZK`/{{ap=j1 N٨7l 븫αLuъ Ͼ).ӣb5~Չ dH^Eᙳ9ŵ'pd-`ӚT%>I2=Ⱦu+k%+ˬ %3bWޒtqYåy}dF'L^Z21/&YNicCIOҼVV}e_؆üVWg]^V7M9+]"c{9 T+ר57f?eb 6^AzM ;XQgdLnb*и_;WMnZ n^^݊I=/ÍЌ9!{@W`oZ@]qxlgLP0>e7P^F l^jВ"Qdܪ!Vg/MǤ4/1/W/ YI{z9뤯Ftڴ-^AcoXiŖl^5^AOo˚k{I? >ړ^0 ġU)BW3 K%yI) ’tfjeDg2ȘjeK{~DgzZq^"rW^A'-2L%yV;Ǿ7w3W2W9?{#̖jezOrwwM#'}92F+*%իH q%sy3ZqUAl9-2Ku0e8R^E,vVϧ7(ʵxh{%O!R2ԫv"MolIY}ŵȪcc?~f+R/[E?G;cUouf^#S>hQX_e">a_>m6S7~ͬm𗲦:GՍ*]ô2 0ZIh>Z3Ј 7~Չ dHY ݹ_sUEdVȞCՇXՌ]kVMq= :d[U@_aWo^m=#'_},I/ÏJr Tş 4)HNN:'Þ6 tkgȪ<G=HFq*Ѩ6sfd=O~DVR6@AY{ڭ@)5@jD}b| KW5I$wC,ӴN#nAm"{3мOjT9 o 廾8CWN@$󔱹)<5UW,*ДB0>SMMG##<c_X0h:KhKZt[d{ZnHTzv'BF7mwsi@'1+ݛ;F٪@~9hs[LQrUMC}yw)Y[_S+PL4/O XSu՚۾jH%}ֺbZ0:"q.V^{7>SDn|=Jk1 Ss y6Eaq9 @J^l'WWq?8H7"SԢjc^}S^ ftCc٧0٫ٛ&ߴcrlEϕmy$cgbZ3k {s}psBU؀Q= >.od?޹M3\m&ufx.屔?mNn2Ih`  !{>+H|?}P#K2%YHoIx:覄ΤFz)ʕ}_ T@#ry;7~ZY?@a#DKo!okӞ we@n^L}v;ꄈn-b^Yg|h>e;W_)眓==(W_6E]Yyr9I48ń4=VU:g9 ]A[2%S4/=[ TIJ7m"d(4sY?zWd^jU8 ,{>>ZxW[E!. {ƽԦm\7M̍bx#kBݺ$SsFeX07=4jǨMӧVOQ¦f2eK&d?:WeKZăl^xPXvx+9foT0"weYS1E42[OaҐlЖic+z4w}yْhP@ ټZ8/mQ V!P o=֜u=I6`斆hhkhʱVU;g*վKuۤasV룫]#t͝Ŀrgaj*hj;=pԩ35~6sFs8+94ʊNAP%/+6zHݥ\yoJVɪͭ9I*ȃ^Rz֧FUyI4/`^"a`hyxŏRϲǒ}%Irn~ww3}CSqqVSIC;z@e\|:XGjXA}iC TM2-:}IʑBv $9q8 {g̑eWHx,ehn@_hCrF>@*ФDwuhjW'@5vZ)#`x[sj-MP&V@uhס²:dL]ګ(gǓ1>6o ~A=*ȾD}2 $/ v þ}z=О[ǵz"E0^/^H#?I8"ΎFH4]hܳC " 5> %%~OΟ4`pkYviUo=#.^=Ͱ_ r A$=0ң sO8'{fCGSg݀)JG $h )#,GhT Gx3"Xҟ 5> ŗn|/YӤaz,ֽG,=>@Fd_UR>9$ddR]ӽfx@ *KlBq z uB~`^hBԡ@6}/ GGKܳPRxE>P!g|2YY}m S7> (M43d}j[?m"편MnhTqNzО=\Gr@{@^S?"Gl}"^HJ!C>e+AҏY}7?4O CAqχ<&5 Ͼ͛!u3M!W5a^ٜf@ɔ#nAm"{3;N9釚)1fa 0/\ 0\Kڎ#wB `@˾k@6GуtKg(m !h+W !K.bҒMֿ7Vd_N e.XK G` 7{d٣I ٷy3GMyhs-sG##<c_X0h ᕗЖ0֫ݐ67Ov-1jo,3Z>+;b-a[N.fY7VgC՗Uei '#U`O8)HabI#?:и' pD#Qد,Уk\rbj|J Ox'pn32ꗕ[*IهAy)+ j|m T߈ gY$7UYmTNW>klex1c-l::!8vT+{<)Lo"S7fq5И9P<{FR͙hRg;z;ԍEVo7:go3/87 {!5_(oߨ>:O-_l1sL"^|,v-U7PZtߖ}8.H ʊUb% ٿ pϾ̀є'{ݙl*T`nLiǼ`ي~+s]ڐ4Heo{=iF,1:>o˹>baFԎw\8~νsf9;zM:4 9>~RbX9lihJ*F}rv7wo?Gb - _x䀺@oY(-x<$_Ϋ[aiiM$ "lKFc;"JWbh˳Ѩl|m À<'в 6B4ak1ZTQud|[ݜl-v b6~kNkұ;!&Ne?{}͇N9eO}pf9,P =-cb,Kcb%[UJ\9^}҈a+L?_!bgCBIѥ&~[~4UW~6$LcLڤ4ƛ&TT_5%P>7~ŲZEfD@^yEhȾg0=M{*܍, {ƽSqU49{vkIYGUx4gILj=rف-@@} w5#&vTes2IlAH@p~H~ tK-$1MrQv<  2f8@ (4Θ3ԿZ֪U{W9YZC_֪x2ᾳNsmAGo!>}w Ng$g+M?EhٛrI{\[~Ob{oAAoMt9)Y"-9_}~ʓ\^FDn`LfrZw1csW=vUc\s;~} cf1i}Y7/d7{y$fϛh٧GpG"b Lق֭}zGϕ'{ZZK=_e}famrc ]]>r>_?}G}&_1)[%)02~ʓAzM$#l>j=QB}.G_6\ W#sg|+31Tx fZ;+ؓriYq$Vtb__Oa8!M }!a28.@ЮѮ޲l6Gn">sϿmliBG qM̈́kՕ10E~KOy2DlsCy#^yhP_eb 8 ^{{,-Mưڱ"=UFL^b_7/<͵nYA/Osۇu߰} '9l)~<ݯ!Š^޿۠b?K`M+{}3v{U˭C ľ)K.L7N~h uމ=ؿ &Z "U QǾ+޵}agKCCÉ}]ssљ4ʏ~a.هr2cZ<~am|`AhlHPPi*#n8n3([>eѷeu lh,bRǞ?l[tS +OK~2pWD-Ƈ}=={ӽw-ۏ\ѳ76]6t`aMpĩ :MM9U=ql6Oګڗ5R7qw|_˒yCC<bs{=jߍO-eAR^iƆ-4[-Ş893G"!@!W?Vf}jÿZR b"1~웻:ľڷ*[۩^[{rMh_wDQE%^&Bŏn' 5f1f_9@ T~>Iӭ޴؏%==X,xz`+1  *_[vî# k_ؿv %4x fI:`c#>"_9@ ToqБGtZN{'سھ|Ze `k=ojb_9ԼRw*7p}p1}Xs~ɳg D;Y$5W7Qx`uXsMmnhbH^\{Є~jݽ#ķ7/Y✴-n i[f|96YzuM遗_jYY5K@X`Zk^mjbˏ= Rg=)zĞw,&9'W{reo{u@Qf?eӤh7_yU{ϞI<ڪ {"ߴ:|>1Di]+ 6ή]gئqmQmynR,}橝lDĞ)kRvhY"iJ'mb5 <}q=iC3sH5FCe'`uu#6C7On.s/ zKw>ATNf|}ғb_=QZD9~O($;%]Иe 4XUΘ_b?8G|RM`7 ą^! `!fHd{bgpӪCҘ7Ps3m˛1\[H6'rc2K̈1{bwc\s;~} cf1i}Y7/d7{y$fϛh٧Gp{VHxFzζLvy]vbKK_yy[uVLu?65(>bً/r4ȓ{wf{$WAL1< v^R3^vi('/X`ή[g8}Vkᕇ5Q1*_Π=ag]ޕu>kl&[/ٳWB/+ ⟤'y,{ ,ت 8f_54ثzcTQ̡|bbOVϞW)J'5KcbHvbKHvAĉͳ#BUB%GK ,Xb`ʡľAL~GعWe{nbi Xx`DKmV`G>% *'yciT[V>=yD}'Pon^t9<{ D眚O .Ɇ-\b}-#aQ^Q2ZqV\ l%T\0 §.jEذeGh-*`V]/60~'P-K{$Mnxb9؋7ckUCy .b_L:͚qx=:LŵӌN@/w[>Qo 'ؒ lUX<|ˎW z-aG􄵯[>Ej]uWxKTnrӋ/,XUagLg_9@ ToqБGtZ~.gad4|ZeJs /,XUaޙ. j^sQn>8¾W,9O^P#bI܆ Vb=m0g# =Q;Ɗ \=dպ{cG7‰oEosҶ-medtmY`/c#_7~4xeOnVץe z^ִy`5Y*lcyjSCܷ9Ryvϓ[ܒ$/>6QƮwGA~ɵ׶?{ƪEI7ףn.܂ bׯ32{dI6ϣa*| v#e\l7W-Z\3wD(؍A<s~u3kS'TF.6=Uo׻JmvA_K3Y]XU6Ş;o>U˪:X`z]E?B5L<@{^b~O箒݋ZM\ooz(,"0~f'rBigg](>J5ۼEf9~<5r۳/Zu}2}߈5,X1?=f,ĞABl|;W|~+ȭw|^ Ǟ)ܳOϞc=lb;]w\ɕ=*Ս( v47N9+{6^mW9]zh:Wb:,Xqv]Y,%wGE[1YS;{-פz~KNLE&lϋj@$x,J}y/⾧Ϣ|Ϊod{n063gc;`̳?l6k+>1j= ҝ{_bb5S"zA۸B!So l9}.0g/VTA9"beA;`,.xLbfշROPB]?Yqjxf%pJωδޚnc r-_M2zal|# K|f;?ڪKg98 0a3 Fntv.;ZA q5*1+zߚ_֣˱!ycj7EN#sW=vUJ٫Yyxk cf1i}Y9)/}hmBl# b?oޢIgJ[}ʪvd&Uz[ZL 9WO?jU`VeF\y&ۀޕ _>j=QB}.G_6i'-E]Ğ4M*2֢2s}sɶhV-`'&y asKgYmEKbˎ^m0~0+ *YP?…GwM} =a0VVܳ?lNbCa--mDn| ɘW%M[˞k‰${Q䱣,?eW '*P_zshO_ٛ' 8ꇳ z|̞xYMωؖVxNdbߛ1`x=IlzBۙϮV\,ؚc/ˎԘ³NTϞ;ΤW~ =wq0~S.~wFŃaaY*Tw4&DTEy^m x@_o`u#s}D(Ѫ\,}r)ꐬ,H%j ZĎ<z[Dü:u!3덝l\+b!H[Uq'{+);Yb}V;b.;n<ľRӿ7{7K/bz-nwbv.G 4J/+<2ujj +YoZNᵈ>9PJ3-dJ)qB9+]ll+Elnb_6 *_eia oZ޳6왉F<7wXe16c$^`7e Ͼ[)ʏΛUȉQP޳qP=fO+`7vr|$sVhB9H>=b_9@ T쿶]GE־nV&ojVq z@Y**2XKl+sI[Zڅ4JuWy[-2̋ ݼK^ mZ b3Ź8kB܈׬dܒ(Ŏ0ـWrQL v<ľbz㒡#7^N]V'n]_4W8Ua|~jsW;oSF}X7bdݪ#%`=sّ~bǍkW5/(M7\} a+33ćguJZR ՜W8ctױ)-JX+(Y\DyG [ˎAۀa|K&rh%='UO'}K#l[f|96YzuM遗_j=̭Ě52Lpٓ=u+I`6oc__7rcx<y^#x/eܭ{(¯GF%j:&XgnRᮌv<{7<{77@+Z n&%cI}=sj %m| bk[Nӽk~cU{هZ޻Q;mc.5 xEJkU`4sц /v gO؟oΜxzvE=k&.$-n 󫛩_+Z-FGݗ{b.6=Uo׻JmvA_K3Y]XUM=?3{x kg=3Weˏcˈ%X`Y'#6w .X=GZ߈+nv=aC(ҟ]% >J{{' mjn7 +q}퉷PgvYxORN~s+ykg_:?f)QNͩFcyq6c3LI-F<˞3?x#6>=v|Ë}:ZvQ[ 1 9y96|{p>u?{Rk =XLrt={3=*Ս( v47&!W^q޳پ<ڪ ѳ;a_^eߨ#_?,wbNͨXgcG|p6 z)P=8,ޖ*Ոgb3{v9[IW2^u};@ pBI7 E_Y4ޓYMPX/&/f+#5*`>W^9aƷ(- ҝ{ TLf|}ғb_=QZD9~O($wkvAc-b9'?cU9ce MFu(76K1.GhP`3d#$ .bo־k=̘] 1ZOgO Icf;CωδY=F19vW h^4("!.gͦw~U28(cv2-g,K|`uX>m5*9E6'rNjAfĘ]=W[_1{.|f׾FS1OSP3wR˾z]%&{>p7oѤO->eU;{Ob/Cpc+sD ,X6+eг/G 0^|ٔsOG3>ߕGT!.6? *Y}fkᕇ5Q1*_Π=ag]ޝEHf;`TnhUY^% Pyv^ jVrKkq_o6[$q5謰E Y a kF;2P(EK$zzKfwI4Չ%BlMy(2 Գ?e]'P%CGMojN&^zgu:XF~fNY] ܳr4Sƴ>¥DɼخV%Hnz3b️ٛ^ t>F;YQ"& !hU *)QEEUWH^>fgsN>f+\n@>:fFsC'e䑈c2Iy y^jU ܒfl%Hy-f!)ba$LNJI1V9 ޒ-*YBteV+yg {籣 ԳbgOhk4a'A zudzl?hYčp/Y✴-n i[ӿ_kI,Ӧ/[|ľ96vzLY}l= ,Z l=5AY%HmUz-V<uQitLB@=ݖc$-.JQ%+lT< !h 3Շ[l(^QabÎ`%jSCܷ9zw\fn*zh#wd,(cDfy~  %^zt]C?t"3 PV^6g:$!Q([w\㥳jX G)a7KVdw'ɇW]< 1JUf1oF;RZ喬(.kYmۈI;{w &k'rb v,e\l7W-Zy#ݻXtmv}"lƠ|n9穋|RnttJ ~bc^I/1z|Q.h?c&k1;= tʃfKMŌ:{>MaP1 %{#%VYc-y$cUFǎxx?<{D%3LCŋҟ]% >J; mjۛިX?a |_iV{-'U?8ij}Ejy s+ykg_:%acjzPؒ;:&Fzh>//:yM%[׎"d(903ۑ{+p劍s~^ c>f׍z~+ȭw|^ Ǟ)ܳOϞc=lbo(}wQn@QlæI;#_yU{ϞI<ڪ Im\3ePAmĮ{:c ֫0P<#t^*8Vk?ډ߀&+pI;4`k̞#q{{kj!R~VFL>NW؛ ~Kr(6Ad{^4wvP"~Cf+VRE_Y4ޓYM,b(^Z4pCKԳI?R~bKR<$jU`.KX8Q~ {?bXI-)G ҝ{[6bb5S"zA۸B!)ij la7y 3fݔxr.hxR6`VaY숹 ³}5fG#Ǿ­77>|] z 7ʜ}m!G{yix~5ɀVꅙK"}?ăT/]ϚMiY k W ΨƞuĊeؚ:[yc"Kf;R/lczCZcTxr-3R{c>f?wc\yewÛ^Ҕsb7]c >i|e_f=.a_NKFD<.-t4ѧjg/ܑQ[9WGujk3'|HJ,*(D+? /nn{\g/lʹt#OZ[Cv \쏋zB˟kjU`V>K^Y}fkᕇ5Q1*_Π=ag]]Bv\E|Î} :c'hÆvNh0~upbB ߏmP{G]0_q=YĞ/t-ޑZA=`lgK᲍5f_]45؟=w1Iӯ;blrC ه$,X+q W z{{fE[]_Mc<ٛelV ,X<]6}eSKѿ\  KolXy۲J{bۏۘYN:=,3A9`uY1W y⠲Lm'ҳ'^6Ճ lq.0~'P-K{$Mnxb%l|" RLekChݱl|l\var,^ *_[vî# k_}Ny;wx`LTozY疩kU`V]޳ϞW{ Ͼrz㒡#7^N}'g/`,ͺl[nޞM[#NE g#a+\n@>/}Bҩq^xY*==;Ug؟H#r^}F;b?e'Lcucs\=dպ{cG7‰oEOHtmq[H6س^?F8Kni4=VnFǃ ĹlRW{Gx'N,ʳ eG0~³OXϵ" zh#wd,6{bj%mzl=H/tX?d{Lt[AmY}H,/ضz{vh9;AQuoVE^M#dWYFډ^l^K[=;]xW_j.D5 [lHVO\vԩqb9AlΜx*0e\l7W-Z6_3wD؍A<s~u3kS訣SF.6=U~z|Q.h?c&k13So6`'bPwXfaee_Tv4V'!XM'^o!CSSN }>ALVHv̆I` WMeGl6]^z=X2C(ҟ]% >J,\ooz(,"0~Ҭ[N3MVL E<'^Tf0/r'Fn{E#{/kO!bVͳyF0_5uK8#S>kPrz̳O*{'q|~˧i}#bA1h.ޒG5l2gَgq.c,#,+>f?c;g>/džcO٧gOJzA6I՞\ۣ[ȁ`MzٱʛC쯼⪽gϤ^mvًadѻ aˏ^ }wǛ/،%WCN*dLi`۸؋4M7fe[ۥ;Cfɕg|̞s$W?bo>wRbGR~VFL>s#*(a[IfM+ٞMݷԀHY:'x /_}Og{OګL,bD{NyN$;7-x)wYwl7XSVZ#z agD^IhM94<ڿl+:`j"K;Nb{֛spR ҝ\o Z@d=v'(ތBWó7,ѸV xNt\w>Y=FZΊ q$Zf.wVKPtf?wc\E*;f/>sj)瘧)z >i|ems夼d7|U!jz,p7oѤO->eU;{t+5ԢGx NxV,Q,wbN4"m4\r2tvhGO+Y3Mfr)9{]f=5(>bً/r4ȓ{绲}S$.zF rǮ0={ʙ2_6< {X-',[L\;̆rl\vԹ1o3X <4ؗ\hl.<3hzCOXYwg{ oNA;zc[Frk.lYfscG|pˎW '*_zshس؛I웚ء.\zfπ  #5u *_c³NTϞ;ΤW~ {u0ꀛCub6>KyP_,tbYu ,Lv_ܝ_9@ Tߛ]nw=|a}@:;y|euJ'su g#);!:=O-]FrՊj7(/am>1˪N|mc]\ yNǚ& 'D}; F,xd78 ;X\vQNгYxP<UoNa(b`ۘBo}h?ȉf6,Y,(,%AR+N̉עC̶hF,tAc3}-=~9}qQj\c `Xj)+D4۷X1{(žԖzYe1{j&JޔKkG[THaU%gi0$.BH:z,}f ͘yYku"cc!5;7:yd `Sؕ0~&;o,GFl/kOeU* R-lWڬYnd __HH81m3oaP4Zy2%K| + ^nf&+lFVg#8dN@.DYIًքvkfL3g7 J}ó^vc/Qk@h3̋bn<ÊXhlv1 $kQ47l&6 W>"A@g#g4+^d&)^GMJo7\3]y۸kaGcSKYDFdun%l={9)!0#f<ÌI +b!ڔ -n"L X eG{&;bE#MDET'{f-VX˶38kyV"󊒭=JIm6YPK,ip71`d˶Ǐ1m 6 g#Bxd'yAF%wr':gku2gcyqFG 3`y73XU, 6#K|`hGL P8rծ,(/a僠X$7E@v~3/;ΣV(o !ڏQc0`fbIdSNгYxP<}Ф& sV.fhnUzcW zkikSjv|L,4i:I"Z wq׿#6KWj0RvWTrؑƏ#G_ #a)߸bh '^,ʳDB>un|'"#gXd)GB/˻A+dmF RxyHqXzţ͵1ƍ=c \cV}+xoCj0lY}.;ڸrI8;q{(^-+Wǔsݱ=ZIؕXR`Ve=`g#*LsYLUl|޳xZ?{jDHc7VG,kU`V+ Q웂fS=vW8͋ ]툿gNlAF1{,soG`uY.;cP8{|Z ?97/rtcr X`:, 벥nQcV_<ޱgw׶$6=oIg^P&+ž&`V+MeG@'^^V"ζYb'oI6֓0XOc*iO ,ʱ(͛ˎLWd!P< p>Y[w->b}b_~a"`96f= @xd@K#!JC/+gvumXzP|LvpmHsd2 E.%)mX/$&+Nwf׼!=,/Rbl}orh]K𯸼{FYCۑ+@7fe\cƺڦD)1ofPԛP{Yn՛f'"3+~ .,bDVy ߬Q2AuH{?aGؑ{(9޲pW YGWb]v$RkmVQq\>G<#m˘^VI{R^J؎H?Q))ى-{@`{on5XҾw$Jg9Kvf@؛y3:wb~m<*a3dd7&a"|M q\W .I$!wlq>q?e!P<2O{N$ZBd]Mo:b_"a՞ȅI$T<'mK ~xOGqq6e38&>z>ݎ P9c\ V$ϧs&r7):T6[\xD;r$M1o}IUчޒVs28Jrd( `K[Ə{(ٳ%on;]z5+kkq^?ebRf]8JFO")1$[!9H 6 zP<2@|rc DBC/^TeNĒWjA0>uoͼ ywc!ŅcWv zl+[³h*g+L0r7},Ƿ3vÓBbͰ3ل:n!Q`_whle1V5r]f}Cx)m`tɕ K~zˎ6nm*,Gv6.zԂ0~(6+ ؕx#XV%lT_NeGU8{["2y^t9Q9l6ˇ'O`Ϻڋ:[y&WreGax.A0X\ŨXU`yy'#|Bxd-;7χ:cWgR,ʳT)'#?e'Bhd^E6m-uuڍ;ZlY6kg˞q@ٛ&,@٬PgxDvq3]xdIteO-C ,X66 gQh?k!\,`g7.ۂ1{(9_-!<{_ Nq ,؈ݤ^ܵXxP`uY1f{(yŞɵ"&(X ,Xݤbi{dG &W =X`&$bbMѓai"eE.`uYsg mib#Kdy nuqV,X.Q-a|(9<([i}, U,X`F*lK <{(ŞK}@{O{,zY"x`kR==QcoD3ҍlhŊX`MrcD@ٳ|Cy6v!G`u͛_9d1. zP&G v,G.'Q.+Bp`[[JǓMzއ@UNer,X` a!P'{#Hzz@x$bbbbbbbbbbbbCľcvW 9lj5*M*MiHWZ2>ڨOF.bC=O} ׫WT~:b83{b_SA^!kj:<[ΒRH ŚbVt- HޤƻͰnTcކ%U]yXYrpb2Hd鵐 q)@P]Ou2Ŗ҆Keز,k}͸DzeW^ =T{_4]geOlV,eVE7d1c){եU*ZB[o kJs]N i=TWrQ 0>2$]ɼ:}b*=ɰK I6"&RtJ!Q ,0rHB戴KN^I{īw2@bC}%Q&4{qb@Ub@Ub@Ub@Ub@Ub@UʡuZ/5վP*?w| [&=bbgUZn{!@(p;]C=2<  MBjOoj {J *C!p( xqh8@Y't@$lص'?D<AfZO4=̰{-@(gbO}.Թ?*sóCU>bi}4Be9 < `$F}JEu,Wm0 а>ON IMa/j "Y@mߞ'|`Vu2y/]0i Ps) {O9"r^.*'A{(1ALُb a28.@Ю1{1L۰lj`=RPCb8g=b[P/63b?4L :@P?zm|SsS3u(4*v@mb@IlڿAs ^I864{7V= =*&վP* =*# P9@ P9@ P9@ P9@ P9@ P9@ P9@ P9@ P9Tf?{ #gH7<ؿv俪E0y˫'A"oZ4M:j_c onxx`$1B'<4~GTRxCCI#{(#{ƒl?k  P< {2s{j%qgI<PS@PS@PS@()n }=ܽbE ]:Ǐkkk;[DŽ-b E?6~@ca\s Z['Ll{()bWpDE!@9H{Z1==c{({ P !@@C@9++$?z0Q$y|& A~F_OOSSӷ^ç7n|w{S ٫킓&FO% ;޶Rľ^ӽn6T-Eb_C|ᑮ+.yw]sI3--k~ﶻ>cLғ#{ڍ-}z$GrY=}*ߜJR<?yah;}QzW\~%Sփ>1n^woo9ľ^ݵϿwaxfTEHo? C⒇ZN_Ll_^2-y1nfxW&O:=rWP7x۷9#/>n*ڶnC%5oVz/@!zPkTQ#u!~Rľ_7bO/ypW/'ľ^! F\ݢzvt!_vr}ox]Eݱ2}2bg/,Y"W[I}tbֶ{O(c!U&N/Fed% @9+=⿇AE}{ݏ"aE>y=-FmٳFe~]W!0W7niwtյHIH蕐ܞ"ݏ8ye }4a]uNRžoUGiZ(@+h,Νi5ADvywVR[וtyΘHKbyw[*+@W__jQdr?H ݊T|i.~J^bb_[J%cq{MHy*-\6<(G*hT@͏{+@B}R ^Tg=޾y:g䠏?3H,_";~Z{˽~Br芽=" EMփ@+ˍ.:m Ѧd۷qoSL2ץ7>!0{}$})zZ~ؿ @@B+7PŸž{~5+)bľ@/yp`[UVKd{Lsm|=ľ^5j7x{WKϊK~?1$,!ulöEw>d)S'Nlv{D{( zE_է{w1'0j70<;sfgKO9xґ'pw~I){q>G;b@Oqhp׾~e!P qv6;ZWS,q;KxwvuWͫbb_ƵPuS(ڥ z~1==c{({ P !@@C@90r` b WZ>vpǸRwrrjFɶw! v0W0Y#=v/ FPq7(y;F̈nH.jOw4lT5vL0EkJlIENDB`PK98[SUPLme1тF<$yA%F&>d)rd3Ʉ[$3Prg!/nzŧge]P< @ *#.}SS9ɺ@K"< @w @.zF@;,>3*/B y(Bg3HY|3" PH@w @Y>f2F/FO H8g3@,Vv{ϲ3s{QNϐb  y(20ܘi_U++R~z$fHg3@B-  yH"@<.}pEeE ,vaCWOXq!#{B-L zopY (Hgmnrfw!ߦc d^ ȡ=OR!_2g,΍ Geq oxn,K<AGZ$mVk5ŘFE|"V`Ƃgeqϴzd:JZvOʨ*?mCA0AGZ$mV?[ZY.2|_8L}6K=̰Y%?C+qeg[*ĨriQ|i,a2Qa-H֫2uCySJrIF'fhj8fMriQ_{VE<Kٙ!gU~֟%#-!B~%cEhb!X'O(bF#H,EXf LDf"SLPJOTDy2nbF=Z,U@#5X`U!3^9V] %ϲ"k qTlodfƄ,AEReIF]Xri"+8IۃUWBgrg&٪h2igUϿ=s5\ \y>* GБ, !sfbjE3ggA^);F#HKbaQ8}.fGVF =YtlEM8F#HKba)+BM$k^-#YFwW]sȨcI t g* GБR+3F#Hc:KԱHBV]Aw0AG Hg*PQ"_ڿ'!B y/ A3 \HMJ>jC@w)/ , ~ gLza@|A&a\<oֺ z0CIXC~pGL+liyVhOb7fon:f-Ic}T[_@E׬۬u'iu#o4P>TUg~p,?cG'yKΊ^ѽ,B̿5f6;o[shyaY˜y-6Mڿ뮟בx6ZR*58+fv\!֜k.vrӱ}qt̴o oT=d+>047gnCDded?Yɳ.s|0㨡jIt+8?>۬Y\&g_|>M Ru\t:͔&}>i=vVgj\% o&Sy<c;$wWwOik `뚵ޗODRģ9?vtVQNB>j6icScF:|qS>1![3ͪUk60UH?_!ӗ%*YW)_*һ=LM\EpMzqlmFͣץ+vmz;[?.'~_o F)%g,V+lK/L]:g h}֊ޚҍJ$s<Οqf"c޹R]ͣNٜ}quz8nf#>6v+lw!cvE=:mY:?t֣WwK"uېCUk;+U{O^moDʈ1O[mmIҷZLqi3^{ܽuzk.k̆X]Ap{{<+|4yvqI5&ge=fM~fyͮ{G7FWҜW|_ٔv_U5-`=rZyvlx|U7 ws9}d3zlY6u:O1Y B߸IO^4?1 Y.E]f{sLI}f)ߣ.^98~ *e !βx~,?b - g) /u&kZ0[e$V|$OҒT Wv ~ȳGgW%}䮗_})/(mZtg}sn#5{o r~lȸtF"ahƣ:|:86P?\e9͟:xט+:mcQza}R4?Ys6vs+/aWX:k>fpDY;_đ6;/-Vkii~]}ygE} Cޒ3d?|i[*붆;.-ī4&ih巤M5W"~L{R]vZg\|myv\n ]xT[ >wT|xٚ {Efd6$+&zyih7;y![g߼rvDq_dԕ "HFCJ+Sl?`Rw }:Ro{t&Gg&_ag^lrι]n=kX]ӢtZ{l_*kn| ͮe_|k^|zɸ#/fWmN Vunӹ 铵"m;*W!k>NJjo%*vt+`-d 9]"wV[ˇVkr텗ۢ_Wlc֤2-9CХy7Hfɳ$iqg$\*:d9y<|=[ Djg_>͙GrkoO"q(\dѫ{F-+J[;Mɳ WDc(n]O[WDž-0EWv\⟾ Xiώ龴7{aUv,o(Ӽ#ـiVGoo `4iy~3?j:ȸ>g#]x̮m9E6bm9_)6L8N;VS|;xzߺ}Zv>햭Dg% V-Ͻ{ B9]ZO:v^V%g;֖Za_"m|k<[4Q6HDp;qX{R]ϩ0G'p%Vx֒|=][G+:7y;϶m㿶?U} fU:Rfa'lUoEc(ڳ+czZ~D`qa ܟ"H| d{)g+4z<1Wu~ۨ.+l! M ϞEgߍ}\I;NOI&M9Ŀ7N{3qڋ$U' W߁ެv7,eݲe+6Sw`1@ޒ3ީ˭vޖ6dJ?-Dhlx4 \x !ܤ7 cJwDs(T/wmMF"N5 ɚDϩe{+Ue3I˦ s:'? ۭgs ϶zv!\nW#襽oMmCI$zm'nU;QgYԝj+ϮKk/tG"?L0e=$g|[Oď(z$=08NUy&X]7&sLg&J]Tm߳+cGi/%]mw(r,[ ! .,!EJAvq$juF<+|4yvUIjo.ڿx{ݿ_crڗgh6.Ife3?wS X8lqȴi믚a (ǰ'uVJh,7::C><AAڿ'!|5ڐz_Um¾/fvG6*p_?t .jKc@!5 8gVI_^|^௔!1,qMu޳Y**p m6yVh욫UZӽg'ߙWԲm ]mʃ>\oOk6N?1qt<,w Q$aQ0{Ex iV: RŸMI<+L5j/7ފEGvv׎8/6uSGuTƃ:^+(sC <;9~fqEh&"¢B M3.zܶPOlCŴ!"9ʳ䠈ON>_?8шv< ȳ7\U_5n>}s8jDUJb]_?e3O)|>|XN$BBXTCɳcCO<~|(zW?pz'vԇ!"/nB{}GCQ?od„+LcrȽV}u)U0;ϬC۳gof"!<,ҲidbTMy00+L<3_.^}=aAmUɧ6Ig=On3L+k7zT%| c'g^zҁU5U/ y O?^BKU1 y#n0XwiDLJYΠ]TlG }p1ʇ;uFfa"K&,iU;?>(jg,?_K?=AO6*ݓ3YDȦ>/ZS#"!Ac7u'}صgG~d[,I~ <B3>2ha{[A[iYŘٵNaJ_XtȿQj,R((hltYxc]ݏm?n~C3]sY}'8Si}<751E39K-2&줗]<ӫݼtֶӍ o.z AP6o6<;X?yf DgY /P@)b֋Q=䙛>Kpu;6M,C68%,;H^["Xs%\EK$0yfVbEer1$ōFcz,X`fxŶ!0Q>kB ˿^SԋV<)g?~ ty(gn9y&##<+YLȄ۲l?o\r}-qfNpqki"jL M^WD"y\uF6cFhN} dg3'X٨I gUeUyg[E[|Q۳O3Z%bJOQRՑH|=P7ʓ?FF%, APȑ#_5no'9t漹FTn3"8r's( IzWtw U*ȓ?%E˳4Whp;Ro̊VfR*УAA =0;={#}lscsܠ5; gҐV)"AXnd*ű@6=g> w~` fR\g7 p??Qޤhwş~p/go;Yk=I+/ǿBŏ%K?KmHO9Tan,k;wu4e}Ss\"e EK{Z:!T y!g< /y_[(R9Ύe,5K˦ՃZVPM4yvcBQxx:Y@,8^ѻbUuQj6O3M5K%Iℯdf=zfQ`hxt`UǔULR]m O*܌k lKy&ɽSOd(>-R:Ad7U7 q.S#D`EJ(hs6.qbLb5`ilt͙60]sY}'8Si}<751E39K-2&줗]<ӫݼtֶӍ o.ʚ|O4PeC~YԋV .-ϓZk~7vM˺I8.a ׆9mH{-s j$C %+Ro 1>T@K xtV4wvisՙ/3?ޘ^w6;B88 6g礖H,-]7yй&MqS31޳צH.[NNyFxeۨF^}^?>?FF%, YЍ{nY..nLMd\W35Q]93n8L+IdhJ8JR#k"P?"A(0?+h^BVpLpq#}mңoL\jI.PQ 9@$t9v6U 4F]蝣*{ϼuC *;5B8Tc%i wC#4yvNW~ySi:m^)m#ZD gA:m&M :w0EJ2b,o`;^Oy ςCaWI'.RҗX]S*`*v(3omFRNӑj?9qaQSZ OVxDn{<؆hf>kfόN8GvyZ'7 3;$r T]9Mz/kyyߡ; ݶʑ=Anv`$%kfTGؘx*n+sHٳȐ&DlEf$LGxL<'ym1gYԩmS-fh-G$M3'̋e}b>brfy [Crō)r"b?Pyq*&]F @`%",SgH LOOy&!(prՎfdy/8N_ՠNnx'ZhOw$6īOn4OշV@ku ?D<3ʶl(nϛC}oHcb"~֍`2R$_.Xsg^uj1Zl&1g3NAKYf2u lDAZ*$l=6ծ y"Kfﵬ%1t$J*fw%W63fRZ{xvhm "U@+_IQ.!6LIUA RF;;ɳ[oāYD*.Vm7it*SY׌mz_V0K Y^}|3=efqhm4YbR_[_[MᔛPy3v`.[OmjB3Ane\ e 3.YHHea||F" /]f}7m> JEG{-#={%tT5 NM_]nR`QAZJ]!%Ce>(ə/+DSUy9UCxPURyQm{pghb5zGx4y6Ba1]sY}'8Si}<751E39K-2&줗]<ӫݼtֶӍ o.z Y>xf_OUNzdgk`,]ؼ[YAmea(oqeB $)pӺA;] m%ٻ<'ވNyHTw9 h~qE>IkC']#x[ZFP3FS45\+"h#nZN;9ᅖm[{I0{ pKت1u~kKYg-ZɲqEI--6tw`~ dط@%ȳ[&syF5R )RZ+ق?3w|3ɍ׼vD~txb{rw>>~yD&AHܴ:ѧO =J67.v9މYe-Em+ve;f&R.p`f l0oD?KϨ"`jw43>}lɸf} ̐$z/6!M << XdDө*K5f;Ʋs[G0뛚Oa.CO)ZK/%֢Yu Y"< <1PYD8*Z?jk%@ryrVPq4yvâBQ~j)Y"< 3$PA%ez-3ArmbUGgJFm,]y!g< 3 $|y t^굦Gla%C~^{~k ڵ Zn*b?n. a .hb}S5}!k?~黼lM5;髮#D1Z֚߷?z\9vߗN+;=c!Y;nyflj&:H+֮A{FD DpeHμblLg3]9h) \$módV*$L>ѵ}BȒY{-k|I!&}Z_kϼ8%RJj(-i]ˆKJ:"L, ^X!R;$PIIMbf0SeUBl6?;;<;ɳ[o ĂYD*.Vm7it*SY׌mz_V0K Y+?ḃf-?-,+:VUr l֋;s ]V6ʯA؀iYIj OwB:D*K 6$} q.mƴ(-a{-:{E5EK.k\3x 02J=2mDQpy_) 28ϩ"E /PZTydfD] 貛s̚GtyeWLF ̦|Cu,R# ^\^wLvYN7.ֿ*Q;y qXgI2W}ƾVJIb]-kNp.et,_](('|T[R8=!.n4'1ۨ77VQ*}qRLmH+ JEkSntQc Rk!t\>{m0ѵ̗oL/1jR9k$d_7y2x0q##<9X3gcgM\Zj-B˶Qʭ$~}~HK8%lUY@%ȳ9&̗s3!%Y"XwZ#f?EN2&geBY3=KtU"AR1q,Vc#QTRZ}/tܹx5%RjoAkwmHuC *;Ch*ű@nsp-]0gnyk1>0f򌝧t䷽SF5:G̵Rylu^,@停gτsc}͞ϙl L2:5k}L=; tvyƩ3vUhfDurNS3.47kxRJH+Ә<=3kDR ":v)!R4.ڌ0G0,(\gÆf' dPYډJw)brfy @pkR^'7W.%Ɣn"Ч<(~ͻlXJ9'K%ܓ+$|#h.Yx'7t4}K]FT}sYO Fa"+=?s؉#8C3g?K"`I^Ԗ҅*w43U%-fH=Pɳ, %K?KmHO9Tan,k;wu49.d2DdkRm-jUYǐ@%ȳp3 #J?KqY^GEQq4_Y *&ϮzXV(O-4Ytvuti?FJI=$MU}Ư/6UͽK6jQF%/ZS#!R==YaZS-Q{bU:ѼKv/( a 4Ga=YŘY§jL<{mox `}M[_k~ٸjvW]Gbw5*o-~ ;ry;/\Wv[ȳDy?1̞宝< De=#'+ѩŴIud3)> Uqr# 1JoNaavBrܯ4oW*Ƌ&]ײƗbґ(Gս&N0"q ?.ga\ؖr4WX)jJb$Wq%KZWҲ.h Z^͐xvsgbbx~"zj,R((|0M.9QP̬yg)1vR;i9R}<751E3cK-2&kP5 ^ͥSn\0u!Ypp 'A9ȳѵ)9eAb.f-b#i` V _6uI,s6}Friݪvffm[{ӓ`| Tp{ Y~7eeh%}4*~KA*2Y(N⸪ W8{eb{FK}Eĵ*Ez-BDe~BXJR# ѹ#&n+f$7nHCz[ehT@8(R#ܲXtewΞ,!Iyxɳp¼L`CܴS F5Fylu,J!Z.:suDxLÓ/;AR9q5҆W)vM]a}#%̽gka3:1 l-l3|~ e4gb{R1̜0޵dcЅkm?/uIL'أ)0{z -m"m&n> Oy&^T5TuxOJl)1gS:Mu֢,W[4Y=h)'_KA%ȳpȳ@Qg qu\Vײ,uQR{B{4s\~/ɳ+S ,N@%ȳVYMy(U !9!TM (vY@,gQ{&|y t RZCL:%ҲZK8JW;=0CM]IlZA%u-AŦwVlm̈I¦.p@Z*^ꞽ`QM:{F& iקY*tPƗPFDzȵ~pfh "s迩as!](Z-VQmvǃ==tkoM>a<]vsƭ ̬yDg\VI+yŔjtm`*lMMw9tQL)5BL5;%yW jol7o.ti5ȳDyzNnݮ?S̪ 3:8$%sAY%3ʎ W77>O^cFQ"W9#V[bzP6`˶4cEܲUꬫyy!byfV"ޝeWW.lSnwݼs[Xl ό&7_ә4k m a]_%Wi{bJVQzo8[gQM<)g37V6J ʇo3C3vG4yV6,Q̩.n|mv:MDiH$Ϛ뺎f̨[ͩl7+<)v!!Y`+UΣAzG4ebЇAL RDru8'lwBαhvϜ23mLNZx7,d{[Ճv@7l d3ٳg)9?,QA+:V9Gi/|䕄3Ȼ6Eɽ+4V 8 E^+ur#I*Z,FS܇1 D5 YbG2إhj(vqp-Ptfi> gA:m\gÆdp<<*[;1X3Eg.Ǔ@%ȳoc2?q}JpH|~=ɮSɁ]#U/;AruhV2,_ީm&pcԄu̇u DJ}1&O̰}RX~3g-:Q[#J[ =KƠ3cH|+ UIecD5 >כfGL3v[E=S+E66sQPrr߸#]2#&ϮIi>Lywy>1u~kKYg-ZɲqEI--6tw`~ dط@%$˳wwko|c (Op=hH~LxrcGvNVy!꾒],m2_~2/Gl\ʶ))~m<\gK,08#r:Uel'3;Xvzhf}}Ss\"e EK{Z:!iO,S!π:yd DCh,j,B Ϥ]7^ڜ^/-Gy.ӳ zxp򸨭P;&OٽsVDS4_ڥEd/6{vǶ'|cOV]<AI:3 !Bg`,B |4yuvm\7̫d3 $*%C8}uSgVȳ=_6ڢ h>s1Wc=OR Bs+B`.-F&VjH^1ڀ|NӢ_4yvcBQxxz>hÓNݪYMt!A䙍=w_n~=Pn3~үjM%,XE*XCRyfaѵFbI_bsuǕjd+{dTWTb3ty GR!ڋ=`ƭ3HJE'4Le٫3zof`s>+v\W>]tnDʇN_11dkLY6zȣ۴Fk~WsD.Ƭ]k*%jVJ'5-I Э/|iN8f͡>?'5j4w\hA:ǟrE|+uey g\Wq왡qL}$Ri5.l3_/]IP'}H=I8E*Zlrpceag_-򌓿i`;Jh9+烏o۟Wkg qj%ďX\>-Ï{ei)Gb^鲀n_:s:ϜW2tݴϼ+ǵLa"E !Fuڵq¶#DQ Kp#Q֘+8ڋ%uwpiYs!*]Opkɯ󍽕wMDžfHmc<$IYܐBY"yF{+涛bD:Qu`k6ܴ?㣓N|U=Z0K Y^~߱qQ!'cjk| mXoFogVv-K#NS{wfEuq,X|i՚ AĊ5VQ`Ӧ>hJĘh h[j|5ZIHJm#)UiyKνw9sٹw|?ޙ{993Ws\*5v8wwhU-]"t̚wx𮆋WӺxVtD :a֕";zey~g{*3+g9{#_rP+qd-;_N~t'3q̵{=o-WsOrrm8|E}ϮUmylᝯW]Vr/8<\^}3A _v%;;(wRlL㮉֧J[}o?`Ӛ= Do)>k_/X9kqn%Ο/{Q͙F[}B~ZSO~o3. ^Qs&/3-->"U{>{C.8}S]xVij&ijԙ=sâCt oXR9Ta,'-[_qtA6\eY5F8*!|*P3JtƯ:ί5յ..Tw˗*mߴ}|pg"rVT\W;"h5(vM;G]|3w0*7z2`rmv z옉O=^OkWK*rp5mZ* gFqЁo{6_D*mlqoto}n$*~Qݷ ?Z V;ܢޢM*i}g@1|MO:lp,ʊe_,8nz_ӯUK:+oţA[\c~am{;|Nc+7ڒ=46k8MVDkEJ(:9w\O|`amLY #߶g^< D٫2xMx6ʦ|W/o}_T6`˖C/oO/ g/һOzʈw[[8y"xVijtYܪ=̞#f*?)粹bv=gD]ϞGxгU+Kg\(O ~֯bby< ,zʩ)l=_ų{Q[6RSRim|섳z<=bfՓE`SԨvvرep+9T>"юѬ{/pDky}`h& _< uOe3QEu&m}Ӿpp9]q4N^GT3' q ٩jEDRDJ~6[1oy< g3ԙHṣg":*A>}Q/}3Es;{8b\);o٩4T}ƍ U2,,CRDc>Fʃ>w*k_ݺ-gY!Rgϡ~Y`g'7ODuuH[&FgrU:::V(*>c$8g$Vє'7?2k\-Mv'Jb{RK4>Zp'yLчvpTkeFqت|+a5}*|ڵɍS+ܵ'.SR=m}6=jK_to}0Th٤aGPh.䍡Ȫܫ. L3u3oܵR>x'L3xҎg<|XIxSLzȎ [w:|z+svt4mk{HʿuŗD<1JuF1̯j1Gqř.MVe >Za͇~w+Q#y<{؏&y;3K>Ь;lr<닮ȺZ#^y/r]ٖMɾYknjG*V?ߺly[.P[0G,Zg#Mds;7ML?z=CYgFg3dŪB<͜Q6~Usmvo<;o%YR?8,C3#3bUJ!RlD6C~YE,CijH}=}嬋s|}E߼#٣; &2wo1熬Ka;q䖝-'<ϏKg̞!+VM"1{&c Mds;0{+1{! Y*dijsmvoJ3@r3ҝhD)3Fs$ ~*vUHO6♼~]>&(@n]QG0y/-K~/@πhA<ČČČ̤Ĝ2,2DDN| 昀qTOB ESub {^ F &8R!#TjzچtXiXuc6'bGI*APV)de #2ْ(8V#SيX$. &-Al%?fnj8g*uXfONR=琬U]~ymOv JJiMk)(ʔ *Lzr ݮBgݯ]zKZdc&ز:fԬUֵ&aݒ-d떦r[.mwH lŨdb8!;ckֲRN("Fm"辨){{ iW weA$`R(:2fi1*0,";q͠*Z*k̄5mA?L/^*^32إ-gj)K &%i2m="pg=wU |߀.n8\* ĬAz77yngy߈O.T9$\DAD駧Dx4z^paE7{g{,Nw3ߒZdo1=5[/ܗ=ϸ mP-:Ed!׏<#^/BRO:*n)p V`,p Sėz U5N Ua<>}k(ҁֻmLʗ"t&vgvRȡC0dד58(Pq%l76LncH9(R3Qn'b4ML}àՊċOF:G|f?&υVjeHN#c(GIRqk[J:c"CU/MJKR{`b$L&2K`BìHgԙG@]`ns 8-7iO t uJ?ȧ>~ @JЂ`ZӠD'Jу% `0@ U(RR"-XA RQ|`x\`8J9T-M@*47݀*039TRԫ\UXPT"T+֪*.J uu]!*ծ_:֊"T%BZA'yz,֮f~굳a-lK:2x, $[ɲkQg;hG ,@mNւǵ5 +mY:fwKQBP xA.,Ybv,zmk[Rwu@pX@wۉƄ˕msˋ-{ h`n8\`Ux{آ5 [naU0+B'@VR\T'Z B٣u" X8-FTG0@>*Kd 0( hFfUx \ 5 ngCQ>IgA1g>O͠GT# = mhLE3`qzZI7;Ufgԝ 66_Nq{J wrΞgY֣-w;{^xN@~/za_ر=K/uMǛGIo|vܓ[ƺYMxxp:~|׶) B?$p^DYu~ƿqaxӿhl7?J u^ίztwx ק^lGvWisF QQ#Q!5R>:7xyzzy /S3U5S:$&m.cx'v`"`%U8SzZ'zxyW &8aavm+wK7w;WwZ[heSƄWr)օ<Ї~؄*6,fqsI9;H7S"XXh~xWth\H}xD凁'[h剈he[ah}GzpWwg|0qh;HR8mgk،F^xS`ˆ|X+=xwit\ڥ|((H]'ΈVQEV(w;1dEvdFRK:p{e7qM P xDAhe8ffjf9VG{{5)tzX;)|=?ysXoAĈ(ה?ǃǖ/1S)sn"i-8ojzg&p i`gy K9sgXIztWut8R觏hg)up_!sɗ鎓Иlڇhn)C9E9}}yxq`اH}[9{'܉DXȟjYYww 5ba J#QQI&R$e E`2ESi;%V9LTPaSUUW՜GKRVgVkXoqX%IhlXTY,Z. l7~<0VpZOZBZYVj \Z:cՈW HzY[L18zu _مZ8_ȚؗrxJ1ca 0avaȗ|zb#Vbpbbh ?x^`5XcB9[}j#o1y9Y[3k;Ky9vw~hm*Pyi p/<((cʥqa(gQڙ"'2eyR:`#Gcu،iܺ׭/vMKŒ=NTUIKMw_aסiB Ì==]"v`$('%,a{tuudH&L1܍ŏvR,"U /To|DKgZYU%]q }Ǡxc=1djLVcP̎_(*><0e_p! 8 .ީ7GD~t3fCrC Y{gNz(5}Z#yi{9 opC94uMܓz'H^s[FvtEo}\7F*c,Q!prme]ۘ7s&O-b@?p䷥Gc `>X,^pyY_O=>y;kRʹNן:}RQx-;nt VGWN&^>X@eeyR!u8'INXFbں"i)^=OGuWUҪ܃lީ`]U #gmB0gNiZg^<,M>wyKezy#jZQ7 јt53 hS'.V}uq~j1*<ᶉSXUϿߴ5xڦğoq?ڷ~n^MğorUM}rOcS |*HL wyAۘ qbR! (I@)Bc 1 X ۨ>F:ۚNii^6alM$/u8WJҭcO{W6O`~ժRhj5-e:\d\glp}wVu֯ >33cy^ b`e;ՠ|hui5 !Dњǿ:픕F':OP۲|Ճ眾:7?v޶z-_> asjəPX/7s{O1%?FpŏEu<%R2{v^rԹ"(j Q${]oYwpIOQbb@e/pD8FD:t8=Bc JԼmI1{;<ܳk;9yf8ڷ9T&LzI'ͥrRǿ9k д@YHӒ׸Fmm-x6(!7wd#r+FY3lRԳ>[X* R90>ng[7s8m^'p햵W`c<ѷs ܎),Oc gJAqh1]MZZ黁y˯^i= o`"E[o%npYrPg(,KSʘ1 GKFZgxcs3:{W 4-yVVZb۳OI$}6/zu/G-[ u)s}a!kk\^讏r $5:@ʐs ^!Vۺ݂<♕bzy/\H~w;ɡMS9'|m[_8ENŴ~7/KרJ7!IQx_37k鞝V{ XM-A5ݮ67?uўΦ5kg25|>_uhsN8kG7?(ؽ%ԳT*&w^~qBl1г^ia/A h9PFdt^[_2_&"?"S-~2PP@dWJAc(<ElF)\C}V:mV 6*^f ɱv ݯ,= wI,8TT<:&E_iWfXtLDz(fvNd׃燦¯Yi?vU{smVH'<+W}U5㚭j&SMY䁈h9k{MXO]@DBzH3qĢD-ROmY\ =8e5C?wjYj.JίmY>$=ey`Z_~ι؏ L 5Vʏhp!~&T9vz2ɲt i]H4NXr 5%)S8bH !*Զ,7vޏ'<6 \jqBN2W[|E:e|Uږ铯oڛ/|=\Tmr䫌[MKh_$.cWVfpܙxW0s8%Uɧ -b͉3LVMLt9"=V['V~IetmS'"Q1Qm Q҇5LED@m&( D}̲? nz2@Ôڏ08O PRA_ۛsʁ-Xg{);x eIu:8shZ*o[9\a;yuͮQ8}ZvvpS(}ĩMkVrm\Q솎OP˜4-mNj]Lc/s#=9sOrJ|f_Jxƾ.{cEbs+~<5#!ͮ<}n[mm-@*L]:ೳO~;:`BFQXl``v?&O1 gPh[຺틝fra%,g[7Ixm۶ꫯٳp^~?6>qUV=-Ʀ'^8twK)4Թ\%L:U4@vvv N5P>+2Wv :H{Mtc~s-$ Q?! <u~r޼Q3h1]Mb2MTi*dvq<6C\ͯ_9A}`_u7_/'] _;;,8Vf+{_Ke8D]v ,IIZeΘ˚qc~c;wVY8uƌI] lh`}Cwk^֤ޞDQIApd2ltip=va 磞1k:\S FeldQ<ɮ\CC'˰!q'9 ^W=z< ](-{zܜ?[Џƺg_7Ɖ9?;O Vkt2%t + ʨM؂NǶtzgzopc[68-{;3>M-WG[9`%VڼGʴk,6wӵm5 .lڹpgb"&tF)JT25!lkt\):&.B۳'Mt4umIOWcy[r+![JNi1,[(Eʿ~Ց^mrUhս [,x4_zul|*q[59hjk:=k;d72^PPIo1qVyk :Wج' T:j7lO Lɜ.G:%NϧwN5(WbgpC&D^T},q[k Ҭ]9KrSfQgw Kʟ}0}\ʽN6c <UoBQ(v8 6ץ%ϿX*-g>Z宵FQ\CQ %q#:κsnyN>n^NY\n-E䮌Wo Sr k4c:sɾ纭b蘟Nu)zLT.zۮSAuA@2ŶuYk67N#%_tvE*3nu[UWq\)I#Pel-MX7z 3i-g>TZ&VkJ10Ts}܀wsʎ@26AP桖 kXR#˩7MpLi p2|J|Mu]^(ˑ_LJ:qa,֭iڇ=Q џ=/Di嫫84coȾRJUS_ wz MWj#~NTgh744w М|qQ_u]7]rdXE7g"[.:$鋲"ܢ.&=o> D&Hx-~TWûume*JX^ bCZۭ,ƨŏZЮk<ȼm SZB)%h@д} $9+o"25 GB@bQ&P@tۯ!]z3]t(PD)AaUdOO1Ƙ.4' ػ8h:H"4ZR|D  rZ9 LAO{ IbEaUΨFх 2QSP8ɖQ ]H$Hm?%0)Y@ @JA}`4BM+6BFhW ~|`14Eg1 0lD:]TKu IDATTtki"LUiLNT)LShuJ:PhS{CwStlj}:k{(/G/تVu-!y%yӻ=\}׫{: KV@ƛiR۲<^A$ :Eg|Fgfl/ [Ze&ܙVi~fS{vJTJiwӕx&L62.@"V1 I0j"Em=s'׎"/ 1 1:BO:BaMkV~:bjґ~A5lUkׯ$]pEGUAaO^\VB ;?4b1$t"b_ٔUF Ϧpڐ65tfZ'kLZ.XE!`e/u_E!#R/!"A$BP۲'_nK?@c};o^3LO&P_GϦ+?֟<Cjj&\ݳ4.{23~$w|῱DC,}WzpDH & ?~D?~DF ?EֻZ~LL GD@%hQ$=+6( \ofLo6|rsi?ڷ"l<뺞?:;k#ԼVw52IBC;4Yeֈj['x96 {mݝ_ƶ`J:z*O*_"V jRtxHֻq~v#ltD"Z ; b"! |-Hͫ?^GSmY.|U;ޓ>*#g΍ŃNq?v-=t%b8'>{vE{LR/,rE"q@HDǛq {͈~¾sry&-哯2 ~ Y\v-ğot=l<:u^"۾Oi`2U]_ke) Np̨#@DC':ب -ӯih+w:8Y!zjd0)tGp&̨ Eb(0 &Z3^2*]J^w5uO{@h$%TJnW.r%E=g89Z3^cl):(>[ce{r8E T)Pr^(9e/C॒SFԵ0x#9yfV$Dt~sКυUNFd 09KSg̖Fm[9:CzO^لK:nyW|аİ"1=o¡r6Y8fNltUȜB20s5$~:|JzoU%MJxB5VPx>xSvH gR_پ}Φķٻ@jq3~]B_> rf/j_ݟ000`|w'̨3ltdm[_ȩ}P6s@ ]]~;lOȌNݬŸx駃'dn_߲q?O_SmqJ @GGTu#U8̖rɒ% Vp֌:p F5 ttt ?dgl7=㛃Ǫ|K/K$}uxښ4L$ISNݰaC8}9̖h}%>c~z\sɦ (^%ԩS-d=*2.ζolNJX WloG6)O=`5_c]\"0f{} 8_G;vh[l-z:нܫDr8A,;wƐڰ˳wK$Zvq5g0eg5Si-~yF8bƒl҇UY3]'tXXDbs8#FU){_ߌ1gGH1.cc^#vӚ4$w;#KhB,N3KmYay |ۄ;o9ݽ⭠, H]B3(Ne1[r|BISTMi ArѲW JyJBZr(r* bM,~JNH o8y/ ݢM0C5oqX&3Ppms8&6u9ZfE.`fϮVgMN@r;3}Oc_ |^=NG(z4}N!AzLIp,Dצ6UI,!WL+h3k/+ivX˄Ƶ7Vt|yX\6BZUU9ANP\kqt-dVG;{XY,ge'x RœhBgQȖ]log8$#x7332!`a^pyA"_.ꗻvt3F?"a:3)L1Mv,&3{mƅ$D'RD4H ;\/\N9(2/&SvP:ky^u?a=qMzA[SճkC]``!;ϫռaqꈱUH"kd7?~ Sr2b3ΰ^YbF::PuG>.^y9WθEN R,: XU]`SQ/{My 5Wߧ{3"6RÂ(``*uM盦rJIЛȖ5 %D!_MS]P{?ey-EOlJ~ʰ=(\W7k4#}`ۧSfCFJQ 3ܫWV*I=yR)9G $F!~\z(X5:JN 㡩d/vvh,~Z7:uyߛOߡ鈱ߵ"Sk|Fe4u1Os>7OUWPlbR1AYVӖ3qwk E)ŘQ&I !̢2ȼɰ=N9a >Kȏ>܅j5Yl/ %KAшT{W1%SSTVN3fgh_xguXv+N:LG/RYV5JQ Ue_;dX)|(:+_xJ3أ|)}V 4qBZA,. Y1ͧP2wX5:&И0Q@?o}s KІ];{Ue#>O?p>%m=dNh:UO)7<[bo0>ɗSvj蘇p8@pKKq44VγצǏS,gCRY:Cyi<^8ɦc-Fr1C` PCj(KSB);&q*cJE74uuz|ܝ]B^]ctHg*cS>Ip:$$?Wk$.tv7_.ful͸6_f~y3}"@ɵY:];vfA"25sb-:BU@6m1i:\d_ v*ZhגCWo6G۵ڮ%U?|~>xś  텣>2?1UⲤLZN S_(k;sIa-OKp*|J~ 8ʍC ',,1E NP6g?kף4ӏHKb;$]$,!)B>͜~2!rG1QEn9Sr^(9e/JN!0݄8ecSx9oS4| C s tّN&5=ʚ"/EcQ≄S=bkPQKAb5 QՀSh~SOz`c.>uq-Ul{兲7/!Yz, ]Q^8IuBYiEѨ+!DU"HX*9$zoiLrYI$Ed\(2ʀQxcQW' -eyR5JݟҺCC}ڋi1cDaUW7p`X/4ax,GdLG`0DHGw)&F1/&L6oy)cBYR:5B ҲPR2ʆFƅ/ n)+E Fj6ᄒ] Q3ᓄ1MUP&(sq* CLsU R!m/xiMk/B\}(J߾ћ.*tkRդ~`h!JX^ b(%~;a"DcH<QS]1J5v80[ʲCЮrQx7tqͧqʂ%<׸慒Sb| 㳻k_ߜc%y.RrJFrK) 6j)%q&L;@ ?!ޣ2Q .c=dTa C~r{օ:dF sz7 h)Nq!Xp"5uq!R Q(] 4QBbLdNFW$QSUbL*"CAQB$$)AaCLҏ`HqH" `iQL(e {Npg}2 ˜ϫ3D߇30Vjj t,!@C !IK :P)@0mOƤQ`KD<NvtR}494T*h ]JZ){+o\j}iݐ7L{ͨEu"b I"v    {,9[%g{НC*ӶgQ{P?SLQ2]'TcLӠkT09'?>.rț0c6 XB"""* te+ @JͭdI!wl/tLs:Duk;@Yj~U44C}wrJ$fƂ$QIԁ$ "3A})5ZQ?] 0jt55[Ms&j Sت{)iʳlDx%`UlUkg /{>V󽬶˓bwOfS{1upJ ADV!СG0NLNBN1yx߿׃GPeB50:2P7YfF#R$huW_f\NrF?9R$[؃S\j%Yw3;G3XveY}ä$k6i\޻GeV0;#Q|b`}uIAOқ'rҌ VwXF1n=w摵\lj;IT6$-RÙ6|Sq:p*Ài1 EAt 3QӴ4~_N DS?eQLP8H-:QD "(A@Zwӈ9xsp]5-[^ 6[r[m 3jkĿKcWG?Dݍ.{9OTkə3D52m_/p9UbF88JLN1U&T#`ıdE(RQD("ZJ D`Q(QK` q"(H$f]"t(Ц/:j5Hm:]_keNU]u(UBL$@DH F B93j"~pJq@rtX?3>'Z}ߢ^GӅ3w}E+NMݵw@[Ԝ5"}}}#o<ӏ[m{o\7}ଢ଼5_? @οK:5`ysh=Ť$o߻i?9\nF꟨/{gr7ORÙ/\%<Kء[3L 8'-h42LIT'?L#Tպ5ʔ;Ϲn {8& h}4bb &$aHD#@ +5ƚti4>eyJ SPbpTV\wHXW/ԑh0M*th 4TES]7>b!P5P>'klTFDADL׉(h=m+V282gւé""*;{e x[4"1B(@(L'Tu *:>'ξ}VKeF9 k!$DbtOھ:O`H:ۀ%- t D`&`ґƸaBM!$h#Pe(7cOоaLz{a}nj+BFFɚ,/%$򽛞aJvn&H9jhZ: _zp8p2 %d@7 @K!G#4uՃ/'5N)Nz]uQI㔄\k;?4|[i6IK4uزLf=LPY\\X/|:ow 'EO *9&Y[Fi9n(9'NEkvˇ,gaz}Mvl ̞_q80^}Oc>ɸ>{嘳W-Mo'?zbߘ`i+f+kjjtttᆭa4_g͚cDO2 hړ6Xюŋs 3dFӠ>8NUAglml' N:rIGرrʹƬFso /xoi p8y[`\tuu'p`R@[bڋGW^jUCbu?ON O 5 KҰR]EQkP29!?r?!x B)6,)e8'4De<7 p6`+_Qq$r!V @^v8 $" L2Սl.}/pFEeOPגśֿ mLp2%GJ7/ͽDgsFYz;]ʱq˼$>˩fh sidBd]8#|ήl{pGWl|epHH|,$^^.HWW]3yƬoy"3J&2JAᔚG\5g:<; o%uƌ"RpCJ6ϣ䔊Ѐn\Ͻ߱sIS>9vBSo"(V(ߺ0E^ENA>gv&>mc;S)[t]?&~/Wo1UN'X5J'8ua>rXeuTYhؔLT"B-kTҩẹ$;KFoq4dFVtewɂ ||3 )u2p: /933 ַT|׹<4EZ]FM(þ\W/ZO-+{zc^X񪙆whCP9XpK*2oѫw@uE&:e:Uce,6[Pմh+^:[>> g,Z^l61$vpǰ!CyP83'E!$ 2i Qd"Æm9-?;! v|ZMz6^7oaweGՆ櫶K~%MS.>{gM$z{OIR]Q D!*=WW۴û% 6&6p9,&k^^.J..vi]TH"$ @a0B)a1ʠC@"BOMB΃HAHB ||*gJ}65~ t'YM e{6oO#wT"csw+e0';G<ήhd\ Ss}>]\2GrGYQb/>83SA(>JU)% GYPʂϣT(7ʜ)qh}㪳uT:;!y4(>cP %8+K y@ @;96>JƟNy:c:g^{Xw~uXS_Msܰom2*"T(Rd@G`.+`Du\Uֻp8-Zp3k>dq e υtVmǕ7Afy"9D%It̨ȪyLB1MG}ˆFr.yRh16|s8X]lc0#/n!=:>3>SYl?1GA1+X* `!qv-xҼ[Ec2ѯ;I$0? J %\Zo.A|~>3oQy9s˙FYΩ\鍢l8?O%ʢQzGx.s**1N|'ZJ1QsdFacT.`(uڝ40s'CrSy;q*~7y¹e!QoסՀ>9AWR!2jDJ[~v#/̼u^p*4o(`kxMfEU9uuq(*x'TFU'_HQkZne@uLCiV*:ݳQotI6J[EG^2hҞaz,m.^>1d{rLSmw.zUTwLt_W2CYw>UJJ %Ly3B|  %? ʼO AѱT+>cg<O0/SeviGN 1O_]SQFI/AfA ji u111\a_CKoYQpCV@%^I4jY?]sgSjZA(-j+cX[/%Y?Yd>1 ׏٩ӳ>'?8Xe''zyLo!hy;6-p蔁][oWyo/݃a+&r?A+-X$waKͧq2c9R2HpˊP䭏}cst:phXU\{jkCWl/b8g7;t]8g sW6;|taIKdr8QqN]l!lYv/P/J{*Eॢۂ<^EA,-xPV+E.T˓yߙ<6zG'|NIkĐ 5g!L" wZm^楟D4qfk&:&oa̴K?(;9ADD1@IDH#@ ez9BJnJ3PkDT՛H#Xp%DDC OAr_^_活cVg?~ՁKr2DJ>᫏v/-"j<ʇo~t,r{w 9J"~)¥W#~3_XzvFuyᥧ**hIPm|(QJ)vmD#]ٌ(m"jccժ=#>!L2 T|t%%QDdFl666l%ff"b;6 b/7.":WoB.ɱq_( "F o4'؝(z>rAv|jJ7F :WdJ)WW?>2$Ұ`mU?&%[b> B}sg( eQzBNƁHcumo_^H\~{߾5p8?lYBNfavqc%"ZxgADƧػukoͭMDtw?Ō]4dFID4D$eQr:-QgϜ)l?:<4cDv]'"C4Z}޲(dyԉ2y7'vf) ^] 7]Mb&N܍T)&6 K a ?;IENDB`PKt XXPK.[E$OEBPS/img/page_definition_picker.png{;PNG  IHDRfݝ pHYs+ IDATxyEU̙d&Lf@ @ }M.{ (Dޫ( (z]ЋJT &\!, dIf=3gzNOgs~&'յ-Ghbw)v[+-RL\gkla`6V?_fR^W]30m/óuO>Bd+&N;;ygΜ93gQ&Tu+.8fϺXz*!Xq7->ks]rE*:SNvμÌ?]nJj=wQ1awĉҊ%b--,5$_xkخӄ1H)y, )u>{cWwx ݥۆuqq\h9>o[4t=묹U*?/ql"6-:.; fZggf~E>s&caKG%v8Ӽ|.ε*) 5J9Jļ5>r *V=7ga|msSWb++vu5H?.!Rz12W8xnk^dN(W*z kyCrۊ#]?pg@>4'_Rm[(Ec乵EU/zĨF I? q:;,?f6g--YoznYxzUBtU.ļ!o)AlX^5Aȇ}p5`r=S.wO>PHy׭<0 Wܹ_U 6Ͷ5Xv\+{hϭ>c9}zbb]޷E4>!xBO{d}QFgW}c?{j #e_Omv"D. #/i: M(烳]W޺ᮟ^s*j#v*n}" KOjV,"uݧviMwzv=Y!<'ޞr2illN&w\i^l[˦ZzC|@vْ͎ɤm0G?u44h90mή3*rLΝ[>6/Rx~O){9QoH #W'b`Pc.%eE"Cr4vއƯ)@#%:?X\3Xwm@.5> q}#N~ mkp=:O@?"ļm[޸bj۴TKgUT;-ld5%imm<;Ե͛zL༆ +WX/̘SB洜HaJ]qyL Kq%τO6'v繞kE)E:w(d2??f4K=6;|#Z,9ǖyEh3e^mD'%|wa}apyfz *Rp`%ԮIHI>>)ĨY+bUfK\'q/)zms~C%_Pە|G7}~:HMPa/lOo!{QaUӧ}kpy$\[16.Xu"͘m+F"ļQQUzS.5Bb^1.]k+_$0י|W@Y)e*?lolfx;wzyjiuY'Q/1i?=o'✩×-\] 15.gR:^@.я,8]^m*ظZr *N>e iӎh3bxzK6=~|y'>Ղ,ʷ&EB !{V=o_knІƱ;vH+g:\a:d -J!=*.xDWU#_T{؋  @Ccb/VMj{lU_E2 @T{y'|wyםwul_׭^![fÆz ( xIm>>]\f ~]v:d9`_f&R*a#{H| <.{:8JǜoŠ%Ѐ (UeuѰ<7CD2*e^9'ڦY0p265Mʤ.thžS;w_?f-םo0]9gњxxJqi_s]+-Z]cSPcaYE/:-#h|'^<پX$wQΒ);}6kuLg,+QvGd]y\顇س䎕㣦vgt50U<êX EX_ц7 iv:25/>s 9޷.`F^?51mgrr3Ϳflx5#ITS@scF YX}4(NlUϭ^Q+\X&\a74CKoZ$3?M6,NOiv;F_3#s#Qa,)\y֚f,vEFnmn3rkׇp%F#rS vg!{\z w%Bhii `L/ 鵪Ϻ!9FrNA1ES;3*+䬝C3)-04F`!(nʹl}H"U3Qe@4 T`m~|rs= |t߭xןQg+TJ< s= \u*L-mDsw_N (gE!B6Rc;Mwjx5sCBnB_LN}Nˊޅ aSNP 5( jVGxʯJʵiguQ8*Κq,ykQZ-rSF[yyHTKqZ'QF6t]ֶצ^>CyK061ժ>a|&|gג450pΪ)NR jwV3VF;ɋw:~XNQvД4t @lֲ.U&nJvsMM7|o~H\曚&L^s~m]) ~xǒ78M~5J[K__|?@өuMd豫vh'#,*ܼ~y_^/%R_3зnqn{+-D1r[|ab[{x!˙ u6mBr^Qܾ僉m;qӧ<&[|ݚfLc;OY[|f&l4{xԛ8e#0}=` ui16YއfLUx5ex!mGFiM2ZJ֫BJLY z00'}=Re:?vo UM ެ0ƥL@Lpᑺdl(+3w##u!W\:q8hTsNl;Ķvk48S?pc[Cgk\[O^5A LI];9$W7(^,VcqxAooޮcx'nܚcw?Sږ>}xp #[0q*F Z(]Cg}璇A,&U[ދթqR Q"BLq=Æ6t7eUH dEg  u@3H0yyCB@FYM\6?YiB7* jTCʒ*:M8IZfڢϦt˖ 4a0kH)a*EuHݻH SA#ҶCQ]//^wW:Z76Ǝ= ,o[t7YwG>']SقϜ92᰿c/^OZCYIm{-[lS T*`֬Y"Z3XdBsv1c5>M?n=}Y{]$"n:J/7o఩6DuU 7MWf gMP2=Oʹ.Ʊ%2)E#[d#Fnw޶r_}@\-|ySqџ/PTEVtb:2s(æDbrL&iKh$aVX_l컆 wvLz}Ύ'k\C׵CV0}/]|趸!I-\;+/(([sm9? $gqM0mYҷDf~,27޶>,kk-,9Ϗ5DYeZ|,Oˀyxy:˲"xuͭ!jgk amUX+|>fv4Pj |;a\cT_acmd 5x򻏁* W@D*ځʲv,k*ځʲvFrՅH/kZ$u_3Zp/K۲S^fIq. &*Hr"\xULۯy"һ:?<߱+m Ow]ѺuYW뛜2?\ҵ<^᝞n炮 Pvmߠ rUZHp3NUGY\aBځʲv^FL*5mrX<58Ӆ5ŧyDOe?!+~zqzvTͦJ953An;>,]ZiR_߶65M׷LukY21<T!ugY׸==[ 3-]h1KxMXSYOps5Su yy]xy룞*˂FI%P5 }YŴNb=b>Fۺ_*-BZs0eiy(SQ}ʑ{{øy=cLe|ԊBDhQ^4 "+yZ=#_~;opq!&YLazUK Wgo՘FV(aduS]H)a(ɬ)$"ݗT~OT`G)@ks!$B?(RÒնi"-SiLRd&%?ڽihٌRS(L:Y'3NhpѓeW8Ǵ27.?5On ׮(^2wR[~)N0f2dS̿SG޺EbL+0eyǸ(q,?m8DL\U&Ĺ{g֌gz.8ʅgL10ܟ89MǸƹ.5Yk`*)s}?%FOQq^ejH!Y??/YV.tJ]*J9O[xb+^$d2e݆90 `iuJBoyS&wiJb8e Oޖ޻%`k6̳-IYM* ;ɯ3d`6mfHbR!2[p |vǤ(L`\rd;?^y+wP(ClnUZTS8,B, Y(Cmxk+:ԅbO,~nCBf=*-e2\s(`B06h%"?.򭪜9? 9XSo7AD fD$ 0k\#.Ek e3,\#vp 敾#q!j_YWƹ ,Z^^OF?ul᭧ 35mt Nz :cS_n"A/XrAm0l6sz |pZ&RJv諈'߷5N1{%Iw-3ڳڛ̞p}\:yջڼˇK'ʥ{vU57b>ơ5denaABpi nǧO `Br]D?]bM#^?|[qI-SoLn_2jgRw8F `ˌUmzcu#a'\=q$7]mƩ7|#L?'d&8 P' -(M-S͋d<]If 6X@߬i ْ';}JK]RޡI<ԹLl+%;[_[P}6Lz>I) zE)(h dV伳0"J AAZ*dMk!40A*ѠPEhg:ut SmZsJKAT7m@D)t<3jUoZx"ZhCb3$\mWxRxيZlDCE}&gaYumh5-\&Je>glbtM˷{egfFP3jLZZDHjv< KDмP]19x,62U_2!F6ssfWE~Wi)1KOrBdmRZꪖNO3ᨊFif[0tXÄ ffXBzyѤEy@Q0.|ڙ\a=ejO0[Ho8>Cgt"Z6 ]*iZEu?~Q@̩1gMϵg[.h,ciN ӍR&Ehg|9Fm!:f F%j3K gM3[,S^]s46ۓ8%>7+M/0TF ~SY2:v`3X îu˫Tj\>VOlN'*k=% F `ZȐD(&&]w(D#'A`3ۙ&u -c 5VfɯrRf}95GkEn`;j>c-yY n 8!-3tXV ]Sv}ToU8#::RSQ66/jH<4r&Y#Z`Yl^9SdK50ٙw궪eչJ(fVRv5L9`̿_v>wxk]TmF4jb]뻬 /³(WUZo6rXoT*_Gl9_D/*,jUf  (6kɵ&cDT6,_7]?(z9j/iO ZH|͈9edJ^!sn딤V\ocyZ'n(#s*cPNWHik׼!f]{)91y3ٹJWCgF}"fԤ$x|{/c!+kts99eߨ=Ќv"EH3 "fD%jfD!$J4|CIQ4 LcJ @E6 H(lmmO+i;eAT1AV3ЦW]kml)Xz֚lo jfWڮε۩EZimmDq=k[ݶd͸!%$j"h$W`60m>3YRNbfJWq% Urf=#O`L-3|2ڤI땎Փ *BXtV)|0B;Ɉ Lq3èAJ AE8>4V.=}4 fD%Z_4 i&ATv&/kV>鹆{0vO1f!e+')#.i&QmMi'j;Db<<2z5ncSRdQJ${RΙVB˦\$'gI3ݟu%Ln[ÐM6 F⺮Ƿ^3 )1Me^츫yLbg Kmnn ?kBL3/mD1<Ǐo1NV) &{|&$*C[K"_>^ӳqB52 㵷wkOp5zo1w֘)]^o^efaͯ/ʓgt74ۯ?̙Nyuwck@&Q $x gul&AT#yv G43ݺmG5JCTɭN_xw%M3C~a˦li@T.Qn虿/9u}8k470M%M2qejhΕr0ӧؾ!ʕwS~ E%%3~H继o3hg.`ı1(~虯xТ\rd0ʄ=i(7I&w:f- uS8]dW h#$;t*˟nN\ 籘'Z>s gFQFV7d5Ng>Z+:%Z9u KAj {7x>F1&!:ZR8u#$tSH]3@H R)z 1I]> B@ץ2L&bδ>BЁ!a*G< P)f0HH)7Zo2K]H5#z{xP6H*K2 /oi `bW&98gN1EeqEQb**S83Fvv&s?yJ;SmN\r$[Nj;|n,/ ;-GAU9!R23];Ǘ`Bg36ˣrEa*1I,8jR,\xj; Ϙ֡={[bk' Okd;O>SٽmEe- Ϙbx)D'Xo${c[OV)@<ƍ7~.o m&1ZsC*\* 2r AJ&G=M+) c LilP{j;p߷#tiGwHsw9oi9p:~یS>=(v߷4Ōw}-}OlklP\0e6~3ֿk8QtT8WcLfӐ:8 &u8*!Θx1P >lK[x?q 'goW߾w?lbb]>mKGI("l+&Y&^ ~<[?M;RX8K\E~kDx8z{8IɄ!Zb–>ShFS1eGD3 zT&AD9aօ !d0tm󎵼T=ч"ƌkϑ9IU>s*RB!U0 \~Fs@ " |{ vADL"EH3 "hfk^U) "Hfvu\k1b=ѐ1)A'FڌC_xF8a;W`l3]Ods>|WTKTamI5ۣlZ6f +ٮŸW2^%^{Ԉ1uoqBM6-%l4wS Ovn=jǡ=d};$a3 "fD;1iMmu=;=xGo>s $~s/0o[tl[[,y#N뺞NpyHOJp>9_[o=䓶0W=8 DŽP˞Z+ ngXn\'>dIK 63g꺮9sM6mڴ?<,tEf15u.%޺wՃ\0kr֬YfZn뺮 fmK'7-3k,aXc u1K,u1(1 5y˖--:0(y5ˮXk}{۶ᕠN;_>O F 7|駟ްϓ'/ ѱ7w8˶my㦛nRG}4oY b৙M8:2"bp/^i?\E$1f~o{ 6'>{ :9m//ث<p]2{ܒC֮]uq3["}sfW\z6g 0 LEZrUo@jI! Ιw 'z W[gtVkmd0 "<iX6Wfmj:XN$E%lgzLa'$/Jeͳ2[@CצZUH) ,Si mT7nO @ Y1 *5s߹yms֫gM#>;1.QWDUyIm tPh:ǀk*NwLJ]+<3cCJǕT#1b3[яt}1TGƌ]DEY)5!t!KHR@hгPt`JiUV=uj, dehn@}u1hФ9&4)u M@31&E^r޽M %!42L{i9^vi$kytiC\|U%nAnV pȬIlfհRL׺o#Gd7+E:tMS`,^H^fzUllZSN$5HMqj wRpߏHѳ-iC'bp@ ЄF/oPꡍ̂)RJC)%x XmN~A>S9p-in_~'Lû[~9vjox7Da Bg{}?L'w? MT㙮69eRC@U ݻuQזo~zAS!wm[켭֨I͟K'zWwy]csw =ܓᓍi[2a4͐7>0X'FZ*&E@j~?`ٳH3&!hJ1WzS|p.?:WW_9|~jMԫN5m+:o)w$ވ/wV sJ ЄHd .ݴcY&jZ[,3i 駖͞=j! kxYh6M_&'XLeq\rFc5=vn16yohd>&oݏ!}r.q6v7xLPHX3Qj,:gLR S@J`捈8xv޷‚e&ƐmwDŽʙ*2ճY]>2i@E{u]dJ<0qc*=mO~ԀlE C+*2FShxgʢ!!Lhf]ͣ5Xus$f0pw.z*ªxVǝ?=4ppPLg'O^=Tn$Hz 9kRUWD5 n_ͳVyݖ핔kjQck+Qw! >cӿT+d7Qkfd$&+\0la^HS0ȿ6k m뜨^XzzLj۫""ykf cU*:!^׊fr)L4D ~k穙`fzO(c D`]);;cM| $* UV4+[5!6Z׶[M5m5}'Q6hu|R3]#ZPATE?'ͧ&Ju N#]^ FTit _UMN3+۵kn75Sld ng7`lx䘪Mo}LNP3ϟk}zk%mnNТũ> 镯UQA?@? a9:Z}O}[:PW-YK{0xf|30|U`ߚ٤ARLد3֞"vg6m`^cgs<3Bl!(@mq l5"4RR9S?+hr4wF4kwz Ib|k3窱(ϰ6XGZf[l[2 bQ&LfdVyOyʖ3@a\ѽ桗z\ !*N6Oc=1aKtk Eg%0xa.H\J}ifMǖY<>9_XNy|4+#[G- 帖ydLgs,t*FSel[Κ]̖jksZӱ䓝ޭkx^ [,lS{vYn3q/LAQ{& 鯥^i~Cj}BZH*_a:YЧQY|Nޯ-[DGxOWc*[`{&#D W:qȠTRB4 O%5hM9;,>äl%L:>w(hv;"uRҫ Y'#@XaέBr>~)S]wz2uBNWm/$sz IN][WٜCaimnqK PiM=(L'9|qkǞ5qkcJ' +3M{sVO?v22 7[aU5l`V1̳^)ZB[D{sk4F2,zZ+񀜆ּ2IQ'V/אF;ͮ^":!Ɋ2PD1/qw'ulK!)-$[#ЩξP5\͵w)3Wث)36ڒsV}Q#vzh>>62&\q-x ꕭ.5i i!/Oh:WylVDq:#O-k*V4*Q@k Oʮɺʟw凾 &f*sja_^q r #k^].%$gzjEd ^r[{Pya>Sr|D ->iG粽nq~$EsXxxH u)Bmֿ~Utr|aqF9lXHJ >:m-9ˬΜLkȼ]ʷ/06)pQi+* y9{9Flb':tFkJn3jTEfCa0]]͋T+aFּG#RyݢnKʙݎ7;.C<b=1|MC3 (EH3 "fD!$(BIQ4 OL"EH3 "fD!$b/i&ADL"EH3s$L"k{1cpTr2Ddٶc;,L"S)AA|l&A"}k> Ox0|Qۄ]ksJsmWZΔBJXtkED ʹ70)$Ae2k>MD91 ܹ*kyh8a< bLC&0Q:h< HnY`Q0KIDq`%X6am NOt0#+>2XϺJ:<㔊fA"g4NmgCuu.QSW̔mɶ@jt}RCWBdj`\BT<7:Q0^T{I\; DP,Aׄ L"E76o\wce.=}F~I3I@66KQ4 i&ADܐ Q8&AT)EH3 "fK_9 ͛~ y]|?uTY$^|]2DT!㏙1˓],ps#od+:gzn~I3ʐ J]QZ6eثil&]e&$*C&+4-2p"1`"1 QJ잚WHټдd]CBYܐT$R]Pd/FHO&{ک?RTڮR /ʹU~)0 BIT.B?[)L큥{3[C蓎;XNo=L+i&QR!edͤCݙf:ۖ 248w4 tlooWS$GH)ifJDy57>SY&Dֽ 43WB,{O"R<@Jӳ%7)DFHZBu+/6}>;i0f 'ĴnkIuwI)+a_2N$|IxDt=s/C^_\0ONk~}_xR^fs#ypnm;}23NUJ$y |/pb ̙ۗ}A0AcR^zfJk QL֒l&ADt,2@+끘+uݫVZ, O2׏2q*Cc  B^/Af HeSn3'r1p)1&40WSiu* ʇra9zT. PRe䶡wI^͙K&OkVTT@Q( 9WXkA2C>"%tI!! l幤f%!c8>ʴn~cJ"b 1 sp2eRr 62huz'B1b`1ɓb{hiV#[˫{nLB!thRj]R*hRtU8'xd…Фd#"ZmL["]䴴01aIEJMh,'2c"4.0V0ܺ]٬HRq6Z C|BA;?m' nm`J"0Q;7i"S h:tK]@ץC)tR!t)8WdsE8h0l2Uf`\1>mU?< t}\k}h's?6O^}=g4՝Ɋ{=?6>"̕ Ϙb8t]&:k*91}m 9A  Yv_10dd 6 ?V&u]9?aK* lsT+L1p0c{Ö`akXOOvABr01lK~f%}%|ohƴzV[6bd]ܐ^x]߬yKCx_86XP c2]H|@μ⳾{ .?_)F!8 0 + c) c_ԉ-O=lBx-_ޫo;vhp||eߴ)ulJk]rH7ݙX|DKbkwtvW,N?zbKSS_6EaϽ7wq]=٧^1oqgfc*-{bPZK/]=wH gY 96i/< ;~,ss pp*Ii4S |[J/ox+߁97B2&)DF5Z>7Onx$Y$&ĭ)%g^M*z޻_S_R֧[#y7 `u\QՖڇ׆miyy_F U_R_nC_Z9pIuaİ`^)ܜJ!M$h(P^O(3Գ q0pv e ~PW~R .R0)u 8#}íLUU*ʎ&&^]K'OhT7~kqK pfm7R0=# r@_n̹ zz 2_0<|2#&\/^%`R2LLQC׹Jd w2EI(,8gdsf@ ܻH EZacoƘ2\mL H BСiuJc}Z*Ivn;Hg *3ʕu 雁` !AD0e&R JB2Eƈ&CBBeJ@At0,gmeY1!؎榐bi;Z#(DhP G,0lmR`gKR糧kMe[z*#O38c##M<[.'ZzAQ~b ӵ'iCgs ɇHyJ nl@0Ur@+.4>=AApoT(1` 9DAD(dAD(dAD(dAD(dAD( 2p6})e ٲpjW"RS3BD(uWZyʌe;87>)ۢwu &kF:z sE^7)l^}&Olz金ӧr}y1k{mGU>{on.ǝ^cTiS]#{ +>u!@r?&US5'ڵ9d(g!=oފٴ(愓/W2B&!2 !#r-툻O[pSqBBH;2g{xӹ9lŇǎxVev 3~B!d#K--[]';oݼA_|ɢ#㓡;:e+6oe+_rBJ9:xn\ OMM5mBHOQؾ̡!`xx8-[mؼa53000tRIq~ӟH![)&d>S{/ v<\~؏o\>wy}9Rعsg0p%2پ}ۅ%o2 ʠ\LB!|i RZW޶ @-*j9P@%Yu ќd ޓE']jRq&p8|T>znH&þ%݊xZAq"˝T5QAkZCʪUdC~!x^ ~!!]9xMiJpR˪81Kq*lzl8]*5LN*&rxy'q2W\wF)#!D!Dd R `=B6Z6Q4|Խo5uUmxm>?xGJKKWJGք{>Vo_wZDSš R/2`Y:SJlUaFВ]s9'Ĥ?\S `m @H! W ]3Y,҅#W8v'~WWkq!lٔ ǖHؖti7e!'#//M2Fb`kaxi@ O4F2^ ?jb8+GŬV*B % @5!)!ח񒐮}o\.,H{S'?6<,s)>Ș:yO{pzǞe'7o<~G{~#olْKI/KM >t] woNs~WJjlkWp1yc$-F^P Tg&_iRIDAT _-eU06onOO^аypopOȾ}i{Ȃxgk(uλmqg+9 c7,_jwO|8z>;N2'dCopG|HWW|n/qUo҆t~{e;0ɦ+̓pA2Z?eĶ UBTEVfU!DMʊ%_wd巋|尛_xM ?p'/Mg<}8S9~r{KWog'f]R-W'Q?PK?g%ȾMs/o]xm,@\Nokv Ğ]35)I۪zyg]}^'cͼlQJc^#Bȼ RCfdL rq}H%&{7CjU+C1MH+(j E<"k汥QxIHQ́Is)e_~)5+R8͏(yIb]MT\$!$--e#F>52Ke_͍ a23% !&b.t14ٻ`NRzj9C隸9IQM{uHB EiB)ׅ~KKOl{(rDaC./`OϮM[1kd;KLBL&Zr=*y+4j0)4*h¡$!BC&!s9BOYIhuLiEf "}kϼ DD"' u&j07ޑwvۍoPp !ĐzZCHp(?R8N*(; Gf}-{zy YItR (Rn>%ve=kŇep$qc~r&K]S à$ЮF&tN !sڢvˌ =KeqXd~iQL'lg\6BH"ܗiزĕR#KjАBy#>$#p, RF`E]sj A2P6h{W<*<(ܗIZkW1iFʧsT"~}ph*"UeuG`/ 5jqfPЁ3qeU8gP^g/NOhA_9 ^֟xdP5S=:=KgB%s ñlir㞅:jMzoCMX&`B&]sMb[\T;A.R݁u\wT^<&DhVq)j SBٜ1bX C%)KL sT +bnN2A/jqFP5K~C C)9N6օWaS慢]bc'KПnꃦ KGy4u,D&\0S2q&"'93*ָg`>>DD^8gB.2?9M[BhkȌuԿT)Y&Hꟙ"3"% &4[mX Gm5$ŅXQ٩hRۤD/#DCgPa(ZÔ'9g PIbJbq}45<^k,9374Jrݖ$o92ëSN$B`$B`$B`$B`$B`$B`$B`$ ʐI!I!I!I!?I!I!I!I!IZ Kjيyۖb ˅vB^$O2/hSf{縹BHo#HBz)My'_add +v@oOo:vUٹ8U~ˏֵ /#R2 !@ nvڝR6ml(6zeuG fc1Un) v҄$аHEc&'?ՃbR6ɳk{iիiRv]+=1篽OPI-pTFq]71G:zPHv+t= &nXX?y!/KQe"S2)yx{w{gLBHo1tP>rhbJ)oY{/@P,K"t]i .R0dBzBJ)=t`LnrGf32#V*9^3ϙS!%H`.j $줬lzaKlV*GڣWd%eBH"߼yScZB@U Vrj2bt5ʕIV|qUNDJ ^AJױm~_Lg*':+5S2 !Fv;d`ZT /B!=}3@ڲeB!r 2 !0<#IwUuUO?]'㜃h:*c&Ot[ |ZqSeI #2\M05OJ?_wݜ|nnEQ7M{foO]г{; D:SM0oq΍um)dM0oD{`>(fs iJ_ 8G*TY n7cIkgb0

{1"Cn/ ޞ׮ˬtjS;3vƝu6!\GWX=h>MyB6TmٚnGq[ܞ/}Y9<pu6ar;s)R{ sc0aUwtk"A1I67֛=ۢ,RGwWE3 `fkr^W8+*pB%N*=!9qOMdNξ(")} -D0Uno˱9U%ӵFpN1<A`og/hfo\ZgOD(2~~p̓\sP{Q)ƳOx ~Zf9ՙˑ`^G `̻!'GιL@qX~=Sk99vm`j!7o5N8Ws.7}$lD9hasU( 2QPZܺĘ#n9F#--WvSS i6T{0cFO{7^):2AIگPnчd܀&[,#AC h|‡( $Y6𵵪΄.av5pi)dYsĻT;}}߯P3؄FwT{09MpHtL^gL둵-Dô:m.arUgY2 nצ;%Q ?2ݱ@4׊%E>W1\iz9P!Wn|xrوҒkؕ_DωݏO铂 R}q޽r5mOIG~I[if}1qCJ}a!yNB9 T}WPMo;8zQ s>à4ۙbrv䒔D &tH tE?)䂔XW$B5 2t)4)y&3zcpBǩA ^ ]Nr;u=p:LowWڮ=Sm;%Nڮy6L{;*UDS~J⿧{ri^Ws&XMSgL85@UU#;[+l@Ʃ+gkzsN mw,c/Y5"HEttilkn؊ݹ*Ƙ 0c 1_ԃfi&ڱ'1}Q7/䥥e1"Ǩ!/KMNMUU4 ɫ4s#:?69SBbvBPuf1Ɯ7f(_hc!rKY^"Zz7$o:זw 7d5Sf`9nנsӧ,ͱ)a 2"H*Op(*ñH3W~7ݢIV`φw 陒_0gIV8*}$+͵deΧF͋~Ays,*b%YY>{g {~ʜOR1SZZ$Yqs;XMӀtHMf`}G7*v/~WCt<1KHMcԆo烶M!:,[樿uD$I4i"A4)6v4-2>02*o\\}IW .PmjBt[UfOۄORɏgJ"BW FQS%$5-(|p+7F?D9If$) Ț[J<4kK @f*_:_r\6k*Ζv ؞u릻\=B (.Q"id9@$Kdʼn5^:&OЅOf,/8pgLj>0ҪG:"s^}ݛ?A;E^WTر|}toޫ2^ u]ulȾoQYΞu"3bYbsbNC7$%c`JZ~_ef}Y;.lcЭK\D漢nX'*W*ݺ\FuGv ݺ9CB7NZA2J#"%I;&\V.\ |ƐdOX9$fw()/lO 2kԩSBր% s54۳`*56Z99Q"<9P#|š dYZnl#c&'_ r`/O`XVh9DȳW:7:hRר\c2 o5{4 p/Wo=^WR>!.qXlv܄Aˤӱщi,kޘAKst8n$@xuޘkoS[7=?鈎6SN}U)3r :Dq~:\YujXkphʋxe$:.έ%r8[_@vh}]=.M=|?Jzz;׫4N3<$9Mi y\lr~F\YtrO`6QY랼yz'=ۙbl .:mۢyKcw]=}$Za5p;n_df۽<v|6S?lNF~ dϹrѨ|'_:tf'f]&wG2 9S9#8Ҩ1қTW 籃 mWyB*sͣpi3kG4ONr*O|:ʑ#jTaU0я:?(01'}-=|nݺ :v%h_%EDhCF *鴶Y2~g?5 7l̙`o=m@qĨ,;7fG:c򺃣2gaXl{l%Ů|hKըgi['%44Zűi~?`nx踪 촩Vj-!]g7cӝ'd%z_=SC%FYZg<~֖~tXay+m릭Sc}b1v#J;#F_g*L_1f >u ;NV8Te mگw l]֤98#{Ns5O1W}jIV{$ʫX ` kDEhR)6P',A>#TJ|AtAt|H`$9EW,p@KyaRmꃫOUZ+.m$0+!|@> ˸eO nca ҩD+k*" (VWy+NϱIu4^˶%^^=iCe-KRtDʥi&v~l)5̈0cI.Yj]~@q 8*mpM{k?Ioxp'^`=3268^yj&Z2γ#MXrk4cڬkxgVq7-YǶ=,Vi BPٞ%ԃ'uV(ы  0\( \S1Ūt(,| h~⇞J5/h^ }#HZNAֆW PAr`XѠk_]־]3\]t 㲴Q3-ׄ\/q] Jy9N9ekrƒޜz+gi]8䧓!7YK%Cw2  46n9ө8['|}zA{׽]$h=k:ƛ8l93΀c*kX؟Fgs[3M=RԟʷQ<Z!Idn:ꤽܝ6HFhQ0TěLy)=c"EuV|q%4"w|m7}!̛gT/!e].{h嚲ُ]s- 9!/pl'\v蚷q'SN:xkNe5Eh4/LݳؚIxyDrr;%tWy{U."»Oxd]׌}yv1>dG7xsXޤ:eϚN]E:Qu#.$_r*!AtTzly9<5x5 JJ?-E۰(\_,N_@{Bn}WP2$%-*rlvJnA#Cj SOx:?#Ӑ @''T?|\RqRhVsga:%Rt^tP?whAܒ{[hY5XcO5l3KEoo~[0oev:5@ 5880le-["OUZ —tF5G\$YZwm|Ƴ>I2k!5GVS᜚n;!7PY[`D(#=RT񯣻cVVG:Z`5wh8@aykc؞K];5E_[lAg<[N : p,ǶIJ@S!ޚ+1 *oyGY1`{Ƹr((+s QFLۋz5\MkzmXns5Z-ߎE1l}%vo]]~ e¡;h25*P)$qnzʆ-X _;q,+H=,X`h s 秦@,e4i\_7CqUn`6PZdypl 6מ __rчʀGxk];sʍ;k'] 7jb]ރ.Uo)xI,0 rfߋsW E׍^`͹ߕx~$hSjieO0-BGf%/h 6b57v.Bw|ccoF_6wps{Av)gIoc1ݹ0{Y敁DyKf ^eiH h Æ9n,3eKZ O c:hn\q"J+Ä : Vs:A~&J ]HlHtbj*Վ/_a1 "E Tm[J^ܽZrvӾySn f5GNAΕOSz0ЂKySn Ϡ9¯0&XA=VTWh􍎋2#: Du$-zI*G-Fwe(=^.?Z8V,ugY'\b`LRzKdBSdfp^bb0EOk% K4m."PxY9 z%<,+(f^v'x h4Uy`͇#G^zF&?w>fʍ;PsgNn U(P\Vg\@!οZr; 0gY[.>keMJ]mu[5o1`ʍ e/<9?yɭЉ3H\3θ̡_Ϥ)2 q@N:+!K\zZ:0t|p'+6MW֜>0‚Yz.)g^1\+盓ل&bzipp=1=zL?9BNqjbz/)ӭ9aGdm. ))J]tD85} _tzH5gɋ' Gܛ ix% +z۵*䨤hM*+wjǻ_}L8 u;fyF덎`ӚD?,WU;oQu܉2ʸsxt!1lٽQD-9X?|g,zGnh3uGX7{y.s_::暸ؤ'+!M2ڢD殩Aաko<31jȺ}z%Xcl }ԡ,l7'IUݟx̸ #"0t 0LJM9NGJ $+ wuӎ[.:nݴ9zt]q7rOwܓ}A%u7>0SglO ?~ryb~f>}ʻO/a/p/uiLH46;{7^B]_{UMhz>1*iqQIËt @ Щ;qRWN8Iܽ"JfDC/B0hΖbNȰ¸]{a|->+Tvm7b ͉7^YL+ŃǔIzC_lQ,'VHꟅ19z uQ!XWW<]4Sx}GQs?ZΆ:X(S* V8ZcW=<=+hOz 1񒅒x.%evQIp,-'҇B^?xVf% {^=|a'w,gq5X39Lw,W:nG%-BF%-6ݱ@%dDD WA1*i:gmŏU!5a`5Yc/Ƀ :^ J}\U~*s0H\QWMUӫH5\ƖwnN`"6ːy)Ѿp*]Zd0 :k˅wwz;75o97Ifzt!`E7LsDmS}$97gDkz*|l?ʏV r.0E@u\9FZccuE8ef 瀦=o Mzcf7\␮yn3 `" RA rk{Z A@?Z BV# Ț#ӆ%A5Afd-coH`<[85#ts4O^Ca&gI`@e4dE g Ԣ#EUyMGw^h._M9]O=z݁ӵߠ=z,Xx=w:%AעBtN9sYZj^NƠ]c^S165r vs@SJS9*c:ũizr`>D]FC750Kk\5T+>r^%>DZޫIJ)]GNN/$:6 1M:S3tyZMlՒupUj C:Otx!Cn|ˡmNV4-JIK5gkԝ?( qDgQIkQt5[}热>%h1]mPg *jq}6I ;{5a/Xԯ+cՀ;>`GjAEsB^Șn;pYĮW^х8`=*q9 |6Xn]ZdAGt§;6;_%A |DpzʀT`떏}AD-Yҭ{8ʪqGJzfL  ?={Ӗ$ tjNo0\%V\v5FX: XټA:ӛ𭞴َrޙRod2Û<ٷ"-Ӷs>]x]ֹޗ\qWT497U |s':9͉["(`@7ĘI zd_ʫo?כ5û)|;5i:U3wQ42Ǭvz8:\+sxW/wZwa폾-1ئWPn\YWNtMaF+\^7J SJ kZRV :Z\:$ "v8Pt~Ft}/a?sŀ! "zĘژV+jNJ&vI@O ·V5&,oNu 4=ror BlysARIT7#ٙ͢exn%jNN-2'vDp9ױN]#!]Ji$wtJDg nvč񨚧F!Vl |˚#9#c"]A>Ai%Btc;OU6ĘWܥӇ6Z#|uXmg/~3I 5GS8Ph?͗|n!QS cc(dunDK VsOh_?Em!Ys0$E=.WE4ad/Rs0YdoٔRΛWadm3fsOn++i2#ڊ]'X$Y7FC`q6WW9jşK(QHT7s|Ӫ8khu%ZOު{yxm{̂iC2FKt@8F59Ahxl4lH\q̪u]p6sø9)/~'LH2F-BǏ&kp+Oyj3 $4AWT 82zbt;W:|M R!#_w~AUA\p̄Q09q6Ɵ[ˇG5m;ڜPP`3eTB:|o#j\p_z⨶T _cfK>SSSS7ziii4Ӓ=>l~WUNowlHE< Vq9Ƭ::J4e~|yA>nJ0Çc.cΨG'ِ:6 uÇcieO9r9F/8}){>bNͪP~BNͽsK]=|)1|;8c9`yÇvշ5j}1hm#@ lΝHN]"[^v#6 Gay@j(!^~?yZ=]a6wgcGol`KCbxḣy ᖌ}.~nx>r 2GN]ehS/>rjC5Թ68\Vi.<.ܑ#?*XꑋgWo~%CMCBދJ?я~_~~}wtZ6;MhbU ?5=9.6(R- ps?+>"bG_<; ؕv.0HQ~viCyJ- ߛ6 gP(=#a=~&e=kfw= Z yCAJQiǸbj7_5sL`f)L|/!7tv!t=6ur0d6s5kQv>t^{5s-{/?rC;+?> }qֺUcA5 >q6ӆpEu@Qز[imu^_ܚ+Vgg2S epAG`Ǟ}Cjg̹'V&JADhi{߯͡~\ᨾ[47Cy WōtL])_V9" T?O?G( +/-Y(6 QJq|' "!+E-{=AAMh/  І9  І9  І9  І9  І9  І9  F]AIehGIg ЂD?fN-X0CzcLYS/[%9(mKݐd%H;@TZ@B*8Y3a]Akz7 IDAT~I I~9Ԛ}{E큱z@\pzZ)mGch" p<ϟPz0${]nmcnhqЀN1N XV [S]l AxNsDE5Eg=Rg \}Q(,GA sEQ2()NN.f ~6EQj$s>f6U|q|֞+\7<ƧBPV' >VcXhNp΃|v0Arl˸eXf2nO_޶;ǽ ӊ˝-f3{v۞+]>͛vܪטxf[{.pϜM.u|q .nio<Ų3^88L=c״ ?y`9u˶46Nh?6hC rwcٜK|Q<\}w*o޶W6DYvhIf6{v >]jK:Z2c1sl6j!8C֞Gtn{.vMe[ ,ye~ǎ[ u24<= M7  jŎY_'8 (ܞ@Wڙc6;_\q3bΦp{Ƹwʁ=@D''scWG.>G$'?9W=XW/~;|pغ箻VxZ(ܞuhłKO7;[DxI|[][g(B[[" 5#f]c2|Wkv,7_2D+Z6gognOqk?1af\q- <-:=WvhIo{lZp)I+6nT6UYO ybvRMZ"wyƸ풷Aia%D~=(\a`Ts(d-.H 8RxO,b I?{ƜPߪ-x^=oG 1u]gf4 L]R̉~ڶ#xk6il;iǜZџ~YE:6tm .\(缷S'$Ixe#L:i+K-Zh):J!|V;p#WGwr%Ѩ%:9ᆰ.sy77pUUZ%J:ۖ|,DATJBړ`o J!|\Y  AA ёITt6~G!ZGbL/}ptU (ષM|zm%t,ڸJA%d)>U1ld*9в$QW\܍Z7 "s pĆ;!2DDH2t"E.sH `/Ѩ>#Zh7%D{4=ŬaHS" L `e j:X9g}>x_1IEF }ã1p0 LC5l|%AAD"5oUJpgF8X[fs_sÅ5qlN|~g ;s wE:Ku3̺p& \-&M+= $ "PpI"+P8 \ir sL @VH愁l ts UrC$L@8 +\ }LQpYaqN@ AA:& O7^r Tfj @ [LYVddpQ֚yۢ| S[v{֞+x/J!93sƙ(`W=dp6nI8Gp JI &Ko>|ѹdt%3@,Wj*-V.Y,3E\ K̭\jy[Ob1ZinϘǞ7_Af05* O8tx/q"Rj%zmU?C$S5œuKDg/zFS0'H RrLd9z?wQT" rw  "5mw:9eGo:ppIⲅK׶;^z(e0A+Jkn;X®*Z;9|5 01@A'\qWGNur<2zWuW Lk+(iAX8s%G 1ԸRZFzAϢKiLt \-9}'1^T=5bD%-ؤrS[ikDF6)C$7K-ɢ˃o1_Q`wv4M4s42Muh1==+y//Ƚ5v4AAY>chM:J0D s9Ou¹`dpX"|@A G"fiAT)7\R酗A9DٯoA?|ɕ/@TaW̬:s݇3.>l)zjf06; 78tݯʐ ז'oM ՑoCz$= K PȎ?@؅EGPan`Mݺ$ V BYQ CnWoޣ<ouƨ(k$+`DbǘpX7!Ƭ%;cDGI\DУUqeA`ytw=3=U~Μ9U[]j(+B9jzxijG t@y: Pg}xџ\"ĉâ]G关>N.NP^Տ֖j:z㯵.yhhĩ WS.2[%xɔGg.+0{bIN0.W>gOuޯ6{{c* ~ϿƤ)>VSjoN]7_;{a 1{%Ds9s榙猚ya٠+^"4tI?y Gt>&+a袼b{>0 5ah07)q%!Uj2@y*5a8UܓZp0WbOT!'|>KT!$ !qS?GDDDP:*aojjQ>P bB C C K5Վ^cWWvAС"{|x<>J U()..u] ODZUQ%Lؙ#""bQ&"];Zr_y_ aS}RHC Oa]#OUw,; !]wp|Ϋ@>+c3_Ar#a)R |+8gSI]B0 H|O;C6ahc|?KӠJ bGT EY蹾~.h7#G_i8y#CBDEf,,BpQ)J^F{^˩sQuv:RGDDDTp=d `x #hzye#Ama;Xն _K]j Bsy]z,]iִZ&TMQ5&MUnDD/^l&iϳ 1v>&LN06sHKOD">l3ZIT-c,Xj1$ufU&U3"kg dҟS5`>=kCxuE} e5lf2ҵh uhs_,zrS nQHԧENη ]V)ۥ"i0" %O`15~^ӑJpQ`r ;UۼHNT1Å*Ml-ZLX.L>M_KT٫ɬ*&OƾQɑ.ne ~x]8# sZ2?i)>}YcPWh(=U^Qh uCB /@$C;/+W^]')xyŗ}N&"""7sW'ҥ/VrQ5L CUǀ*qoFמ/˦4]]_WyDDDD!&N/UWPWPZ~hE5'^qɥwDDDDyAN /Omgjwٰzt]uIgys_~*OZ/Up̋g ,TV)˴.YL*9U( `OsoU|W `ȡp,ѿV}=7#@ wQ!5fitrD J9Zm0vRMTk됒Py홗Hȹ)`kjҾЅSP/suQ : ="9cw"=h=n?sٔ(;M߮muA3m(q0t,úI-XVTcL?`M< tMfDHbߋO``.i9دixǤ*Ίjsԝr;;+)wiKIs6?'LSCjjщU @N;{Q}8E@T@ `o+ڎ(N-w4W Hd,޴t=EY͕AЄҵ.ES6sf|etJx7 H<-6!>e|niy}ՇM&kwd;\5; =Uxq-/qo۹?aT,`g V]o% ؓi1+x&|jt %@{;+=ѧ=o.Ɠ*;,wЩ.kg.l?:,])V r&8̖6I5): !Orٞefu$Ռ.vkHc$lɥķ@p,zE[D0~#XI"gu}$]륭K==Zp?&Sy•^p\#_-U@9֖g nUp\=tt0pC5Ì3>z,xN/?w<4RR]eȤܒlςR,83Y3FLr$ji֏l\yEpǿ>~wOw'%tLIa5.أW=x QθDgEc'_46QW#"""JPpqUddG%+t"l_KDDDDi/YI}=0$R[T'"" /4L9<%'N%Q]DDDTJ ~R.90ˏs|?D'\ؙ#""?$/y爈 H|q 7爈 벬DD ] tCO7C^e/DBE*>UDDcx^ 0=PoS}E^}g]vꂙge%w"lD׬'LDDJM@[[%c uO>̞k#AL8!pw8iH)ÚF"'" s܇B) #ӃsUUξ1H)C,\GD Q t)`o/:u40Șᮮad2ɂ?'LDσwfDް.2R&"cjj;d7::#utGNF"c2SJ fBD[URJ܎=wo8y R!9 "ʻ܎?o5Q!"JU `﹒_CDѮաn29>(J?M#>z1߾hg;[i_^=vLs>;m!"Oϫ˅ t_WYz߳!K){{2(OٵXrqC”&܃|1(sֻO壍G<FLD!k!h5 ,pScsOW-.X/\gΏ?9f̸>^,BDDDS4K%L [w~s٨loWsgXb {]0>w_$`P(PElçjeLȁVf0NwX_R^kƚÑw4WQ4Oܫ'$r:}"y /}DG-MqMM]4mMSʖ|LsF?rql%{"d"emB_p_FM[Fۋe>2oPמߍov&Q vKoPT[Ӛ&u"lIMbq27p!x嵕f^|صM9*3vIFEWͷU뿷؞ݼ–L|/?ƍ=\w<:>6|ըph0-;l7%Mwˌ?oH$|$.b}&<3wV~P2dq~y-i\"""mopm[QP]+h(monޞ+-_jw \QjY>鲩7.ސDjd2>*yx{$n[}$DDڅ߼t&D嶵 cIڅ)n1_Lh%[UEnoo UB?xq҂^0uƗZ"cL<~?8 ;_i.hY>)62is :f؟+Rce Nzmks%6aIDATzasveI#;iS9wMR;m]RI7ifsǎ y7o޼mڴyqmۚ5'FF=m͚mm6H[d#<ظdS~$-0GLZ4AڹJƮ_'_6HJyq0fCv 5}@?Ll˦N2AqeIENDB`PKpHSaNaPK.[E"OEBPS/img/workbook_saveandopen.pngPNG  IHDR~֩IDATxOlcw]zWر"gÊ>;EŎ V@Q"Ev) ,ݛL;Lߘ${fϝFeH1.:Z6`!Lpz 3ckeseuَU~# $C0Af ʲѳj݈!Lpz 3ckeseuFnD&8=L1zIJl`lZ7"sDd&LZb\Y6p]0z_9@2 N`p^~-l,.=1uպt 8  Hg+ wdZb\Y6p]0z? =FM˯%͕egAsbdZb\Y6p]0z_1'FM˯%͕egA/)]q 'tWuA痽4WKߴ|=)Kcn8, 'TVby.b 3eN& ʲѳcҼ˨f-!~|ޅ ι|˯>Y*H *y 6H^[!O+zK_::C!)vܜ r4Cu!%$7({-NlR&?#T2i #Mۮ ubo\Q'ue kgckeseu_ǜx'v:؊:vПG^}T_ĖH? no?gt9E 󌰣EKP9O_[Gݷ 4qBx5CQ.j]b8ƖDѾ%(F eugv6Y8F/X6W \m} ockg1v҂>+JK_.Cl1рs/qIk`MA qse0QH_\떚byaiimbW[D[qƶF#֟#'PZߩv ?8AqOM"2^;,_K,t^Ë.E: J2Y_=Hy>sWxxf:|d'?~MQŠ.bu;.VV‘qyq.&*n'HT(L_[Ҹh)@?hF)d% ly (\OcɜYʯ%Uz_?;!r k4_FFYG(F\{0:b5u єd5ԡQQ%-IihJj>vEQ&6`ؖkNs2|e3vN$Wˇckesu}gSTUWRȒww\z5Y5p㈗|ZMJ)sJ0pKO3^4%Al-Iih寡%U5'FE ckesMR=G([mPAn#Yqrt543| UCw\P V֫B"ڰ._u' #$?JR _h?sH5q3FUwiib6UI|p-k??ᘥZb\e_d#ѷ2pRV#._oNU-zU :"jזH}b z; AouKZtk5,92Nז4^f;X4i VAepp2U|c}pL|ƞML^;,_K,̍\[gFeۈ>UؐfƛQ(myg4kKyJ9,}Vj)kRŞ?+NSIldYH!|ĝ "rrgsp^~-l2y֜7(]kn׆*b8+`_ h9)+~0nc^?O\zot`tQ zŎHkR53@ok_/iV"M~z}p@?G?egᅤᘨZb\i0VUIkI뷼j:[m\彮JjbF\R:[$Aoj."G>hkgckese"dѳ &,F̫赳1zIJlڥkl"H?Wuv6Y8F/X6W \mWчZ:P1zlp^~-l,.=1uպt 8  Hg߬# $C0Af ʲѳȬ# $C0Af ʲѳj݈!Lpz 3ckeseuFnD&8=L1zIJl`lZ7"sDd&LZb\Y6p]0z_9@2 N`p^~-l,.=֍Q  B0S8F/X6W \mWFd( a!)_K,+ F6u#2GH0a˯%͕egպ# $C0Af ʲѳj݈!Lpz 3ckeseuFnD&8=L1zIJl`lZ7"sDd&LZb\Y6p]0z_9@2 N`p^~-l,.=֍Q  B0S8F/X6W \mWFd( a!)_K,+ FvL]"]Yz bxMJ"l$0ttA<{ޥh9 HVa*EںAZ΃A W);RACA W)ZmU,<9K`Ȓ:I bnl2Īed$ FR4שNeUw䓌} %b苔/? BYu2T"AH8wFUIx[ycd W)]S'Ec.zo z.} ?NI/^ve/諧jW<AMx ؤ(l~ϗÁvD8Ū}%g 'S7ƺ FR4)w%[mm% ЏVX=U;MG:ɧ|g>owiz嗞KWЍɻL.Q?~ݣDseoF[Y7JTTA< FcjF|@Y'8Zޏ^Y`BKiPGA4UFzǔiInL*^}og| ihCz3^=ƝתjtZ[)(30_ϥ(+ZQRHv 7^RueEge]f.("$fI!P6 FC_5U'av$据OІ#6"΀-|n>Q bQ^dr T(CV*ozNG "*TP+(UOhqQ EMAa&LP 8, VWmW:Y ?vԧʫ7 FR4nVp61y!<5rQ6#&72 dK^OS,VjO^NgqҊoᗗ]|TqG{<xL#bZG ش!W*DB!˃oӱd?F!Ab'A0zvG^ɗ <|"j_(R\?y@[R?5z>;[WMz+-}X|eb⯡nVYkm5]7J"b"J;f ո 5 +zn!ZBH_($wv#ϪޠMa A$J_o$7^|f/Lwψ.e `GݲehZUT{@MоG)۫֬]W7]!H-ӻ{Uy7 (jGĐ<ģnlRjT-xP[GV.UE~6˓=]nV'G6 1ZwhH875ꛪz͌2 J_'ߖ|3 \as[7'OiC`S] 7[]o_iNW1$QL*@ N J_ouޑ"l$0zt˝zG b`f>nl!@UFzdAZ3OA W)1uպtǂg]zG b`{qһ-*^"Xm!*^h4~-A`*^"76 HVa*AA W)  6UJAE1Fol!@U + 0zc dFR_A l$0z b`C YѫWA`*^"76 HVa*AA W)  6UJAE1Fol!@U + 0zc dFR_A l$0z_WH{,xV[Y~ֻHV3c.46&^w)Z6q5]}xϯKa^_7'̵sn-;mv}<㖭cBv t$ zI$KWӘ_FR Y@/]]sy U}0峋 'էw3W@^ }#M\3-iVLKojѫ?1n~X)jぇ;LgM;3YgVyp nсjHUv}/c\Ҋt]:v ӄd){5fFolatk_8.UزpҕY_Դ Qq|8j5ү)Fmbb:w_5U kPt3FQM~W)RK*[fS5lǡDdH,_ 76ioh6 լ'֐ {vz2wwc{+J5ni@P?^|mfJA._"1F2`C<_ .<诚a*պ=m(^Djo=kVa!w)tŷ梿jѫW50zc A9.zgfJA._O?8Kd){_ 76$W֖w)t9jѫW50zc AYޥЁ7~FR_ w),ewU-kVa!*]RG W)օa'] $KSU y:EޥЁ/@ W)ka!.W0z̓";=5|a"Yʮ_ 76YW=.CK/;YӢ~)fJAZZr@Em miԻz`诚a*5kQƺ#┓~}lVHH_ 76YDlfW=stcDN|x!fJAZbU.> Ԍbʏ_}R]@ӆ&܋U feTFy*~} .N_+kDӢ .B W)YKW}O*Eu'&UU =z5iY!fUtvS7E+诚a*5kfҜsvN@E2ka&k2Uqʼn-m{:ז˷cC#lme{>O(´$N9vmSבx偱6%˜LL \u<%+eȃad5;m B` I:f QphaH9*qPj!zJ4@VAYCW]cD0A8l51诈J(e#.Gc9 FidQbdFV׆I,X XF"Tad+]v JS:5C,&a_+51诈)=c(6z!Fgڪ6T~D҂]S!*2:zqs_jFq ڽ*+cdrŖ(Jnln(,kSyyNq[ r"قiBd(= ^* W:+OXewT)GC?v#YkڡZYd\Af+Y)\. K b}v-+k)*1ZQ7yIv6 5;lm^ujaVn;x8fYW to^@%Fe ˼oD3ie+`JӋDg=ww#ȗavQXYqVF4Ղ@\Vd[v5M WVOX9V(B>C/EEdڹ+@dR6K_HK2Q_Q^Ă!dyuVV1~ K uRcrn7UUm֧XpY9GuqKDaxs1w~5ڰ]^%!t6re$OK{wdq|> J.WGP_|PyuufۙI [/H9n=^fw4CNjoE Ġ"&&_+0x΢%ICzdEYjkn<"%\i:$IݮNOS7~ A]6Wo`CuY?nJ_lwl;tAҊ'|UIuN Ȣ[<]8xqD?5x6y_ U6E ڜ_551诈)=| t*VbQy?V17ݔAyV7nzNU^g vt͠mtmWyNzUxuK馋V_{<\7xUbYG],_҅ىʒ$ʴˋԍvן@h2,UVT2'Dj=27AuYźkS/v1#W@M +bbBaWd^~ :tg<])t~{}\nx[ ^߃, a7|s;zA҄{kJM8+:r҆Yv~]wO< de \Y F"W\k3o0U3_yE prv^\8cd8c]])y|טkS*AvzgU^<ޛU3_ !";8XcsHGZ]I\|M=ڶ*q<75ֲ٭w $y9nݗk߉Wt9_jufDwW>,Glp+]n"Ë܏?A Ġ"&-)BY0_31Ay Q2+~z&vh|闩-!ɳGhqgeG$ϧ+)OŊ<7_ ȷ./~nY*YYh'fiCgZ3dx$em_/;x|٧诚Wxmxp8 #=l˜ɴC[<{R]=tIǟ};6k/Hd3 1S؊0.|иʿ_wHsEM+bb_ь [D^WۯY0_vc ;"-DM+bb_ _++sr .oK{_+__WA4C]rs uߴiLVܹOnJ#@W^x 5诈AED3Tݹs3 ֫+̙%?޽{ s~ˣ>[^wHKO&11h_QDaUy%/IHw^d( Zr#@_WWx\)+ F;6ǿ/e0-+Y诉@EL + W#aXzU[ \k׾ayezGd o k_ fmjVpL[~aoR#@^}5诈AED3TK`w.PnI Y݀;?.;$[x5D"&A X׽lqu*Dlϡ&11_r H!jn߾NA^CaX+8#{hZzGd s^5诈AED3jj߾$_^y {oWĠ"u"^5诈AED3ZPla[/&11hF+_.;$[K @EL + J]3+w_WA4>|e"&Aha f&11hF+;$[W_WA4;+ׄ"&Ah| §s_EM+bbt-DE$_@qw-|65"&Ah#@?mN]"]Y 1'AED#ZؠwH1nUz!n;"oBEDZrUVűzԐL`lk4~o;R 6"_-zG 8 _F϶FzŵA2B_W$]=WߤwzAm@E҅ѳ^|zG [_W$]=EWܠw;f+ ڀ g[#A2noco_v6γ1A$AD y1h 9=>yvCS+_']/#E︊K~гsocySs!jMbLCIR>d`w<1' [:DDuVvR7>HZ0z5׉_w:aG++S\R6em6Ȍva85"HFF)A>2&t}WvȪRZ,QXwY/+ g[#=kA2w_G^k~\{e`]6IdA;$@O৲'0@ICvw΅;"0z5s.FH$#z녓W8xJ*32V9Pz^β +Ez̨:HȀCCVd@{ƻDONE\b]HZמ["0z5;RNޝ^x\~\OceUe8oGlmUbe {^S5BO-RYf$JĪtU=Uη^?&"0z53'^w?eONJS׎l\1 u\w7u V m,u0aIC Ig+AmI_HT }]2(jG݅h$$ %JBE=s;RGZ2lv鯠%P`x`s 0%#O jI*T֠5>WU^AW# Z@EZѳpޑ"HF8jXuKg҈Z J%AWsјNOwpZ8-KŌkȣL~nAȡ+s@Lo)Sh6ZdBn?%ZyE'|M5P_'u wo}M[Ue9+ѳj݈_;; 6:Ε17կW r즊_-#_Gn_ԆoaeW2m;yM).%UaJ?~wuGG}*[}*8}+spVLxd(J^&gzM <49CnH j;4eXA]HZ0z_9Нk׎ crYy%vbeHAJz {ٞ O/Զ}"ΟGlGi߶v>[^VHw2r;:r,945rGUBE3K\X7W,1%gE 1,2,@ɷN;nU-w1e=# TY| ѱH0z_9НgK8:E X逮f_pQz)%䑸 ?IŪ KdwQm;Ux̓K⒟}%=7RakGvX旵ukM~:urxW9lQQXP&k )F1${|*Xc$NBk"[MS=%\F-.l+r GDLH8F6u#2G2ֵ XҪ)E#<;ϬԸqG3+Ni?éxjgY'^BS]yRڏ*x0t/!]W zEL]vo,](,Jx T@2ΈIUg QSi44$MWohܦ ʭ5<.=X'|O72p62% [(pg F^*<>mU{ka?Vя_dv# 7V0v0 ,UYqV$x~yUD)qI(މ'eYlO2_am$I~پ8{?^* W:+OXe8w(:\!U͂E~Rn睆Yz& SG9[5zVсg- {%plʵӧKi~B̂QN1ͷI2Ϲr*e ,J;056HXeY瞼OC<́"R~_9zP9gpjIp-8&=]5V}QW.k8F~{SoFoўKoZԸG :дOq_FKV*jzPyel5r ?Uq?K/zg[F8$SV(X,"~m?`݈RV<R%kܔşџQwɩj0Nsv[lKŴ{Nwh7OYޮ=yњGu߭TZ񄋜<+/xcz&[ $P,v)u+GUioQ^Xt،6p[͟wR2%BEbalZ7"sD;-;)}1S.2%K)B YӦ`^Oh@q~l}sĈJYW=`#.8ݞG;1 K[<}Mk'P*V 0 {/ [ήEV=||x$emuȾfsVl-CEZѳj݈zmxp8ڙ媯9r >zO+6?sݝx||,G~re=0/S>quSY^l}g 猹=WMΡzg:j8w/\^;\2뚥\4iBdkAu@:]P?"ui'U7c2졇64kUe-WϢ|TGXPn4а*W"FnDBw_KqCb(΅68xz3\O nrσĎ@je2?, D^r#1[S-ųG>j?JqW#磇ɣse[^n2v]bV̧GSXQ]I0,])ulYzec9 'vop;${e٫~d_eŪpm+_blZ7"sD;%7C29P"FnDBw_J(;#Ho8o-Z8h̍J'Zx,KHʇBR.s$.e1F6u#2G}NQȦk:6k2Hg[zX@Ҏѳj݈v=-:YeAQ2@ݶF+>mWFd(tA2+!mWFd(tG-xﴔR A2+!mWFd(tG3b˼31[W36J{hBEҋѳj݈h﯐&EEF6u#2Gk/-n|kԕDÉdgպ# _#W5ȑ} >f_$"FnDBw_c=2Jo +dW$C=֍Q55i_ alZ7"sD;?4׮# n_4clZ7"sD;ZZ ^ F6u#2GJ2L;JyFsdgպ# AMܖv2>jsrlzLJ zdg;ZWwvn;ƃ#>Yr+pN_CDH~!HfWGd(t_6=.a^bΙ;JE2ѳ9n#0=Z/IG3,/Ȱg0?X:zUKٳX@DJ&PPW$=֍Qk=zhӮ@gOS-8=O{AtF6u#2G.ż= q7K:pvXw5H0z_9״145  qq7Qw쿧w5%ؔH1z_9,,IJ9+5?|+>="pm]w_DA,+!mWFd(ț s{sIאlڵ[ˇ;QSn.XZ_{b诈gպ# AmW@3L=p'5аG._~W\wtr?  FnDBw_[6ƚrg!QYih /Mr ջž2z '9XSJ:XUwv-13vDq F6u#2G;w*brYdC[Z3\s(7+lk:B=8a̹[zMw}w_/(.Q)vQ'~M5+ċv~q0Gp5"FnDBwZL4Ԭej-W^|т\(Z920Y'*ǟXy-=,Ta'^>qW_>0!\)-ZptPw͞ߺH1z_9НkÞ}zvP9aFȃ:.i\{Ce`Ǣ*Zq4.x7Q78e4aqpG̖D 6j'AEZѳj݈_MFZ毜gvrЮsRX56ϸ'7.]'P tMP]ḳ.‘\.ب~ٸ|wf,m͢Go<͒v'