Skip to main content



      Home
Home » Eclipse Projects » Rich Client Platform (RCP) » Design-Question regarding Actions and th UI
Design-Question regarding Actions and th UI [message #466594] Sun, 22 April 2007 13:48 Go to next message
Eclipse UserFriend
Hi

I have several Action-Classes in my RCP (no local classes) for adding
and removing objects from a ListViewer. My problem is that after I
removed (or added) a Object from (to) the list I need to refresh my
ListViewer but I don't have a good idea how get access to it. I was
thinking of something like a Registry in my Plugin-class (which is
accesseble from everywhere).
Is this a good idea or are there better?
I also don't want to take references to the viewer with me over 3 classes.

And another question: is there another possibility to set a viewers new
content (refresh the old one) instead of calling setInput with a
complete new collection?
Re: Design-Question regarding Actions and th UI [message #466598 is a reply to message #466594] Sun, 22 April 2007 13:58 Go to previous messageGo to next message
Eclipse UserFriend
Marc Schlegel schrieb:
> Hi
>
> I have several Action-Classes in my RCP (no local classes) for adding
> and removing objects from a ListViewer. My problem is that after I
> removed (or added) a Object from (to) the list I need to refresh my
> ListViewer but I don't have a good idea how get access to it. I was
> thinking of something like a Registry in my Plugin-class (which is
> accesseble from everywhere).
> Is this a good idea or are there better?
> I also don't want to take references to the viewer with me over 3 classes.
>

Well I'd say the logic has to be the following:

Action -> ViewPart -> ListViewer

This is the solution you do if you are using only Actions. The better
strategy is to use the commandHandler-Interface. The idea is the following:

1. Register an Command in your plugin.xml
2. When your View is created you register yourself as a Listener to the
command-interface listening for execution of the registered command
3. Your action does nothing more than resolving the command and
executing it.

The above has the big advantage that there are no real dependencies
between the parts and your are completely free how you trigger the
add/delete/... action because a command can be triggered from any where :-)

> And another question: is there another possibility to set a viewers new
> content (refresh the old one) instead of calling setInput with a
> complete new collection?

Given the fact you can access your ListViewer I'd say you have can use:
ListViewer#insert()
ListViewer#add()
ListViewer#delete()

Instead of refreshing the complete viewers.

Tom
Re: Design-Question regarding Actions and th UI [message #466623 is a reply to message #466598] Mon, 23 April 2007 05:01 Go to previous messageGo to next message
Eclipse UserFriend
Thank you very much the second approach sounds pretty promissing and I
already tried to use this strategy.

I've set an command in my plugin.xml, but I don't know how to use this
progrmatically (google also has no answers). Do you might have an example?

Another thing that comes to my mind is, how I can access the new object
(for adding it to the viewer) since it is created within this action?

Thanks again
-- Marc

Tom Schindl schrieb:
>
> Well I'd say the logic has to be the following:
>
> Action -> ViewPart -> ListViewer
>
> This is the solution you do if you are using only Actions. The better
> strategy is to use the commandHandler-Interface. The idea is the following:
>
> 1. Register an Command in your plugin.xml
> 2. When your View is created you register yourself as a Listener to the
> command-interface listening for execution of the registered command
> 3. Your action does nothing more than resolving the command and
> executing it.
>
> The above has the big advantage that there are no real dependencies
> between the parts and your are completely free how you trigger the
> add/delete/... action because a command can be triggered from any where :-)
>
> Tom
Re: Design-Question regarding Actions and th UI [message #466625 is a reply to message #466623] Mon, 23 April 2007 05:32 Go to previous messageGo to next message
Eclipse UserFriend
-----------8<-----------
public void run(IAction action) {
ICommandService service = (ICommandService)
PlatformUI.getWorkbench().getService(ICommandService.class);
Command command = service.getCommand(commandId);
if( command != null && command.isEnabled() ) {
EvaluationContext context = new
EvaluationContext(null,ISources.ACTIVE_WORKBENCH_WINDOW_NAME );
context.addVariable(.....);

ExecutionEvent event = new
ExecutionEvent(command,getParameters(),null,context);
try {
command.executeWithChecks(event);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-----------8<-----------

In your View you also fetch the command and add yourself as an
IExecutionListner.

Now you have 2 possiblities:
- A: Passing the Object from your Action to Command using
EvaluationContext and implementing preExecute() (not ideal)

- B: Passing the Object from your Action using EvaluationContext
and returning the value from your AbstractHandler#execute() and
implementing postExecuteSuccess() (better)

- C: Passing nothing from your Action and creating the Object in your
AbstractHandler and and implementing postExecuteSuccess() (best)

I have to add that I'm not really familiar with the Command-Interface
and maybe my advice is not the best and the API has to be used differently.

Maybe Paul could comment on this :-)

Tom

Marc Schlegel schrieb:
> Thank you very much the second approach sounds pretty promissing and I
> already tried to use this strategy.
>
> I've set an command in my plugin.xml, but I don't know how to use this
> progrmatically (google also has no answers). Do you might have an example?
>
> Another thing that comes to my mind is, how I can access the new object
> (for adding it to the viewer) since it is created within this action?
>
> Thanks again
> -- Marc
>
Re: Design-Question regarding Actions and th UI [message #466630 is a reply to message #466625] Mon, 23 April 2007 07:18 Go to previous messageGo to next message
Eclipse UserFriend
Hi,

More informations:
http://wiki.eclipse.org/index.php/Platform_Command_Framework

plugin.xml
----------
> <extension
> point="org.eclipse.ui.views">
> <view
> name="View"
> class="testcommandframework.View"
> id="TestCommandFramework.view">
> </view>
> </extension>
> <extension
> point="org.eclipse.ui.menus">
> <menuContribution
> locationURI="menu:file">
> <command
> commandId="TestCommandFramework.addEntry"
> label="Add Entry">
> </command>
> </menuContribution>
> </extension>
> <extension
> point="org.eclipse.ui.commands">
> <command
> defaultHandler="testcommandframework.commands.AddEntryCommandHandler "
> id="TestCommandFramework.addEntry"
> name="Add Entry">
> </command>
> </extension>


View.java:
----------
> public class View extends ViewPart {
> public static final String ID = "TestCommandFramework.view";
>
> private TableViewer viewer;
>
> private class CommandListener implements IExecutionListener {
>
> public void notHandled(String commandId, NotHandledException exception) {
>
> }
>
> public void postExecuteFailure(String commandId,
> ExecutionException exception) {
>
> }
>
> public void postExecuteSuccess(String commandId, Object returnValue) {
> if( commandId.equals(AddEntryCommandHandler.ID) ) {
> viewer.add(returnValue);
> }
> }
>
> public void preExecute(String commandId, ExecutionEvent event) {
>
> }
>
> }
>
> private CommandListener listener = new CommandListener();
>
> class ViewContentProvider implements IStructuredContentProvider {
> public void inputChanged(Viewer v, Object oldInput, Object newInput) {
> }
>
> public void dispose() {
> }
>
> public Object[] getElements(Object parent) {
> return new String[] { "One", "Two", "Three" };
> }
> }
>
> class ViewLabelProvider extends LabelProvider implements
> ITableLabelProvider {
> public String getColumnText(Object obj, int index) {
> return getText(obj);
> }
>
> public Image getColumnImage(Object obj, int index) {
> return getImage(obj);
> }
>
> public Image getImage(Object obj) {
> return PlatformUI.getWorkbench().getSharedImages().getImage(
> ISharedImages.IMG_OBJ_ELEMENT);
> }
> }
>
> public void createPartControl(Composite parent) {
> viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
> | SWT.V_SCROLL);
> viewer.setContentProvider(new ViewContentProvider());
> viewer.setLabelProvider(new ViewLabelProvider());
> viewer.setInput(getViewSite());
>
> ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(IComma ndService.class);
> Command cmd = service.getCommand(AddEntryCommandHandler.ID);
> cmd.addExecutionListener(listener);
> }
>
> @Override
> public void dispose() {
> ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(IComma ndService.class);
> Command cmd = service.getCommand(AddEntryCommandHandler.ID);
> cmd.removeExecutionListener(listener);
> }
>
> public void setFocus() {
> viewer.getControl().setFocus();
> }
> }


AddCommandHandler.java
----------------------
> public class AddEntryCommandHandler extends AbstractHandler {
> public static final String ID = "TestCommandFramework.addEntry";
>
> @Override
> public Object execute(ExecutionEvent arg0) throws ExecutionException {
> Object rv;
> if( arg0.getApplicationContext() != null
> && arg0.getApplicationContext() instanceof EvaluationContext
> && (rv = ((EvaluationContext)arg0.getApplicationContext()).getVariabl e(Activator.PLUGIN_ID+ "_ADD_ENTRY")) != null ) {
> return rv;
> } else {
> return "newEntry - " + System.currentTimeMillis();
> }
> }
>
> }


AddAction.java
--------------
> public class AddAction extends Action {
> public AddAction() {
> super("add entry");
> }
>
> @Override
> public void run() {
> ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(IComma ndService.class);
> Command cmd = service.getCommand(AddEntryCommandHandler.ID);
> EvaluationContext context = new EvaluationContext(null,ISources.ACTIVE_WORKBENCH_WINDOW);
> context.addVariable(ISources.ACTIVE_WORKBENCH_WINDOW+"", PlatformUI.getWorkbench().getActiveWorkbenchWindow());
> context.addVariable(Activator.PLUGIN_ID+"_ADD_ENTRY", "new entry - action - " + System.currentTimeMillis());
>
> ExecutionEvent evt = new ExecutionEvent(cmd,new HashMap<String, String>(),null,context);
>
> try {
> cmd.executeWithChecks(evt);
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
> }

ApplicationActionBarAdvisor.java
--------------------------------
> public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
>
> private IWorkbenchAction exitAction;
>
> public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
> super(configurer);
> }
>
> protected void makeActions(final IWorkbenchWindow window) {
> exitAction = ActionFactory.QUIT.create(window);
> register(exitAction);
> }
>
> protected void fillMenuBar(IMenuManager menuBar) {
> MenuManager fileMenu = new MenuManager("&File",
> IWorkbenchActionConstants.M_FILE);
> menuBar.add(fileMenu);
> fileMenu.add(exitAction);
> }
>
> @Override
> protected void fillCoolBar(ICoolBarManager coolBar) {
> ToolBarManager mgr = new ToolBarManager();
> mgr.add(new AddAction());
> coolBar.add(mgr);
> }
> }

You notice 2 things:
- I used the new menu-extension-point to directly execute a command with
out the need of an intermediate ActionDelegate
- I show you how you can handle use an Action to execute your command

I'd prefer solution 1 because it is more flexible than using the
Action/ActionDelegate-Interface.

Tom
Re: Design-Question regarding Actions and th UI [message #466636 is a reply to message #466630] Mon, 23 April 2007 10:47 Go to previous messageGo to next message
Eclipse UserFriend
This HowTo is great :-)

But I still have a tiny problem

>> <extension
>> point="org.eclipse.ui.menus">
>> <menuContribution
>> locationURI="menu:file">
>> <command
>> commandId="TestCommandFramework.addEntry"
>> label="Add Entry">
>> </command>
>> </menuContribution>
>> </extension>
>> <extension
>> point="org.eclipse.ui.commands">
>> <command
>>
>> defaultHandler="testcommandframework.commands.AddEntryCommandHandler "
>> id="TestCommandFramework.addEntry"
>> name="Add Entry">
>> </command>
>> </extension>

I dont know how to use this menuContribution with an <command...> since
I am using an actionSet and a popupMenu to extend my New-menu which is
provided by my main RCP-plugin.

This is a part from my plugin.xml
---------------------------------------
<extension
point="org.eclipse.ui.actionSets">
<actionSet
id="werkstattverwaltung.vehiclemanagement.actionSet"
label="Action Set"
visible="true">
<action
class="toolseye.vehiclemanagement.actions.NewVehicleAction"
id="toolseye.vehiclemanagement.action.newvehicleaction"
label="%newVehicleActionLabel"
menubarPath="file/new_submenu/new.ext"
style="push"/>
</actionSet>
</extension>
<extension
point="org.eclipse.ui.popupMenus">
<viewerContribution
id="toolseye.vehiclemanagement.viewerPopUpContribution"
targetID="toolseye.vehiclemanagement.views.garageexplorer">
<action
class="toolseye.vehiclemanagement.actions.NewVehicleAction"
id="toolseye.vehiclemanagement.action.newvehicleaction"
label="%newVehicleActionLabel"
menubarPath="additions"/>
</viewerContribution>
---------------------------------------

Best regards
--Marc
Re: Design-Question regarding Actions and th UI [message #466638 is a reply to message #466636] Mon, 23 April 2007 11:16 Go to previous messageGo to next message
Eclipse UserFriend
This is a multi-part message in MIME format.
--------------030903070308000005020806
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

that's what I demonstrated for you in the Action which I added manually
to the ToolBar.

Isn't is enough for you to just copy the contents to your
toolseye.vehiclemanagement.actions.NewVehicleAction class?

Eventually this code has to be executed:

> ICommandService service = (ICommandService)PlatformUI.getWorkbench().getService(IComma ndService.class);
> Command cmd = service.getCommand(AddEntryCommandHandler.ID);
> EvaluationContext context = new EvaluationContext(null,ISources.ACTIVE_WORKBENCH_WINDOW);
> context.addVariable(ISources.ACTIVE_WORKBENCH_WINDOW+"", PlatformUI.getWorkbench().getActiveWorkbenchWindow());
>
> ExecutionEvent evt = new ExecutionEvent(cmd,new HashMap<String, String>(),null,context);
>
> try {
> cmd.executeWithChecks(evt);
> } catch (Exception e) {
> e.printStackTrace();
> }

I'll attach you the whole RCP-App I used to extract what I posted before.

Tom

--------------030903070308000005020806
Content-Type: application/zip; x-mac-type="0"; x-mac-creator="0";
name="TestCommandFramework.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="TestCommandFramework.zip"

UEsDBBQACAAIAKiJlzYAAAAAAAAAAAAAAAAfAAAAVGVzdENvbW1hbmRGcmFt ZXdvcmsvLmNs
YXNzcGF0aJWPywrCMBBF1/YrQvamunPRByIVdFGl1LXUZGijcRLzEP17LVJ0 o+Bu7uVwLpPk
t7MiV7BOakzplE0oAeRaSGxTuquX4xnNsyjhqnHONL7LotE7AHp7JyeJIqXO ckr68nXGX0Gu
cQC1bRlwJY0DdhSeqSYg757TbF0V+8WmrOersqj+lxkBjGsLzMIlSAtiq0Ir 0f0w6eBN8IPs
ILFnk/jj8QdQSwcIPxxXqKMAAAAsAQAAUEsDBBQACAAIAKiJlzYAAAAAAAAA AAAAAAAdAAAA
VGVzdENvbW1hbmRGcmFtZXdvcmsvLnByb2plY3S9ksFOwzAMhs/sKabeSdiN Q9ZJgHYbQtp4
gJCYLqNxIicdPD5um010CAkJidv/27/zKXHU6sO38yNQcgGX1ULcVHNAE6zD Zlk979bXt9Wq
nqlI4QAmP0Ay5GLmcD27Uqg91DtI+T54r9GuiQvvgd6UHFocMdwBzLWSJ8XF clrqtfxqXjrX
2m0Ew6a4cnRfKMBAjQDTuphAHGwWJhALfdRDHugM5wFNTddT02jlxCt5SfgN MloQG43ule99
92/ErdmD13/mlUJ5YkbljmCMjvob+KntGoePQ7PnDqEf8pNt4OXISTLuvPXJ h/oEUEsHCGzt
2DXrAAAAjQIAAFBLAwQUAAgACACoiZc2AAAAAAAAAAAAAAAAKQAAAFRlc3RD b21tYW5kRnJh
bWV3b3JrL01FVEEtSU5GL01BTklGRVNULk1GdY5LjsIwEET3OYUPMLYYlkEs YAQrQAjQ7I1p
ohb+QLsNhNOPoxA+0rCt11X95trjHiLLX6CIwZfiW/WKcfI7C3J+hw/W78hC OyjFJrOf4Jz2
uynl5BLoIJY2VRJ9d7mu3TZYNJ8bAxHRVxY4fxgyJeiqr0pPqZFhPGsOVArO a6Zd23dr6sGL
FZwSEsi2WIpAlQJj8RhBJfwq3gITCBQlz+jgPwTXI0FsfGIxaYGc6Vu9Zk2c VRrvP1BLBwjJ
RMD+uAAAAE0BAABQSwMEFAAIAAgAqImXNgAAAAAAAAAAAAAAAD0AAABUZXN0 Q29tbWFuZEZy
YW1ld29yay9iaW4vdGVzdGNvbW1hbmRmcmFtZXdvcmsvQWN0aXZhdG9yLmNs YXNzpZJNUxNB
EIbfISFL4gIaCBqRTwWSoK6Ux1iWCMZKVYqiBHK1JsuwDG52t2ZnkZ/lxwHL gz/AH2XZswkE
owUHL7vdPT1Pv909P399/wFgA08sjDDMaxFrN+x2eXB4pHhXfAzVB2fT1fKU 61BZyDKshspz
hOvLKBZOIp3ITzwZOJudWCvu6oPmbhpgyO+2Dt42d943txmKrRN+yh2fB56z p5UMvDrD+FYY
xJoHus39RIwhzzC9TwK2egIaFwIYclGfudi6XiFRcy9kIPVLhkyl2mbIboWH ooAMbtuwMc4w
2ZKB2Em6HaH2eccXRlzocr/NlTR+P5jVxzJmGCWBSjOsVFqm7zD2pDOo+zoJ Dn1BbWhxpuum
XOHNmSsiLakzC/cYpgZ9X54YNfdtTKOUB8MDGwXcYrDcHoZh+eZSpC/WYWRI SzYWUKLKntDb
4ognvkFUqjdPqkg3ml3uiW0Ru0pGFGV4Vfl7VdXW1Z2fHHFXOErEYaLIGCLU C9TTmo0Kqgxl
+edhQ4Xdi+fx7h+F/rM0TSXi+phmsZcmNKTZ5MRlz08NHkskMEOPfgRljCJH npV6Y7QH2gTZ
oxSjt0LfCfKe05+ZaO0ck5/T1Dv0LdAfKCGLGRTJsntJmEoRzKyXMmbIzpJ3 N0U1KGJuFWrr
5yjXvmJ2wJtIRc0RYR55WqlhzvSy+0xjzdGpkbNwHZ0R2FRYHKavUvYa0SvX 0vNYxsN+84/S
rqjKF8x+uqTl0uizlGIYecpb6d/YoIg5tYpjtW9YHb5UvzIsCzWKmmGtp1mP fwNQSwcIzQTs
P1ECAACPBAAAUEsDBBQACAAIAKiJlzYAAAAAAAAAAAAAAABBAAAAVGVzdENv bW1hbmRGcmFt
ZXdvcmsvYmluL3Rlc3Rjb21tYW5kZnJhbWV3b3JrL0FwcGxpY2F0aW9uJDEu Y2xhc3OFUttu
00AQPVu7NXWc1oQGWgr0gimpe3HzDEKCclGlABKgVuJtYy/JFmcdeZ1G/Ap/ gURA8MAH8FGI
2SSo5QFsaT2zs+ecnTnan7++/wDQRNPBDMNmIXQRZ70eV8m7nPfEMMvfRw/7 /VTGvJCZCghn
M/in/IxHKVed6GX7VMSFgzmG2nn11UAp3k4Fw1zRlTo4IO1Wmfg9hsoZT4NE 6n7KPzBstLK8
E4k4lX0tIj0soqFMOqLQ0eMJhBhVwzBKbaHiLsPqX5yBjI5O/hwSeu6+VLJ4 wMAb5e2U3v6f
q7aPGezDLBHzYLjswcElk13xMA/XZHUPFXguLFzzUMUyg9UwpMWWVOLFoNcW +ZuJg7VWFvP0
mOfS7KdF29jKEJROETRpbCsfKBdr2HCwzrBWMpeHTdxmcKU2hUyLZNzc2wru 4K6DLYaVfw7u
oWG4s3FKPNJ4nQ3yWDyVpmf/Qlv75q3QtE+UQUrVeS6KbpY42GNYL5vJQ2QM s3WR9Rm8I6VE
fphyrYXGAXlr0ZqF5fvGdsCvGdPHkSyn5z5Dq4oFQi1S9oj2NsWlcGcEP9wd oRbujWj7FVc/
jdEr9HfHLMPYwnXKPMqJg1XcGNdvYnmq94yiOauHn1H7glsfUaVs6RsChpNz wQVqE+SWi22S
CS+I1qeiFp0YdIgdijZ2sU/jmVYmF9D3G1BLBwilZyJuAwIAAMADAABQSwME FAAIAAgAqImX
NgAAAAAAAAAAAAAAAD8AAABUZXN0Q29tbWFuZEZyYW1ld29yay9iaW4vdGVz dGNvbW1hbmRm
cmFtZXdvcmsvQXBwbGljYXRpb24uY2xhc3OVVGtT00AUPQspgRIEEQSKyBvb UgwPRSWKVkTN
WEURUT45S7pAsE1KkvL4N/4E4QOgzuhHZ/xRjndDh1acsTKd7r2b3T333HPv 7s9fX74BmICp
ooahLxB+YLn5PHeyax7Pix3X+6CnC4WcbfHAdh0VCkPLJt/meo476/rC6qaw AhV1DEOut64L
K2cXfKGLraLtuLs6LxR0s+I8Q91d27GDWYbaeGKZQZlzsyKKWjRqUFHP0Jyx HfGimF8V3hJf
zQmG1oxr8dwy92w5L31Ugg3bZxjIVGNsMET8gHsBQzqe+R+Oc64TiN3ASGTO 5mlEcQntKtoY
uiqRirb+MseDNdfLvzE1XEYHQ5PlCR6IR7ZfyPE9hsF44o/o/k6g79jZdRH4 emmToaKLYbxa
Rm9pviocayOd3bZ914uiE42S2RUNPbjK0H4SOu1kF4vl3Qyv4lUZZM6kxcth 9bNxjYTZgAj6
NPRjgEGbf2cuvV+cf72UXlxiuFShnkmCrguP5BvCiIphht4qRDRck82gZmnq +kLGSWhIyjhq
GGfhGXnWSaUYxs5V2BJuWJb+qpIwRD0RFD1HdioDM6n5/MAtSMWnNNzATcqd TlQI3XOm1iSk
ebpsNOIW7qi4/XcTlTdpmJFNFCXcEg8Vd6ndq/XG0EQUBmblXbrPwOPVr8e5 W6Iik8SyrGha
w0PMMdT7e441vyssho54RfWpCR15aQ153xt2yjJ1/wOacn/tFj1LPLbldW+p oHxdQpPmpuMI
by7HfV/41IL0otA/Qq+ZtPSW0NhAM50sIxtJHiG6T04NNBrrwo8amsIx3IAL aCZL0XCxdPgL
gdWRnT5G6/PUV3SuHCF2jO7ZHuUjmg/QOxNJHWKwK/LpAPFTf0YJHeU7xVIQ wxgh9GMktCfR
J8OxlVbbKFo7/S7Tvhiuku2n+zxCfpLsGLoogRim0B0yTdIJYlNiKr1RpIir QohjuE7oLfQG
6BgPRZg4FWGLsqgl23uMyczoDyj7o58xzSBzMlaSqdEj3DvEg7I8sTDtAQIe JJAhAhkm6BEi
mAqJ9J3AlYgoRO8R5kPpmktEavA4RHuCp2SjtGaElPEbUEsHCDPWDkoxAwAA dAYAAFBLAwQU
AAgACACoiZc2AAAAAAAAAAAAAAAATwAAAFRlc3RDb21tYW5kRnJhbWV3b3Jr L2Jpbi90ZXN0
Y29tbWFuZGZyYW1ld29yay9BcHBsaWNhdGlvbkFjdGlvbkJhckFkdmlzb3Iu Y2xhc3OdVWtX
01oQ3afUpqTxVRGvFBG8CH2gEa/v+oIq3mqr10uFpd8O6aEeTRNWkor+LF0K S1nLH+CPcjkn
LW0pgtUv6ZzJzOw9eyan375/+QpgFssaIgwXAuEHlluvc6e66vG6WHe91+bc 2potLR5I15mz
1HOee3PVN9J3PQ1Rhpzr1Uxh2XLNF2ZDmrwTb/YmMOjirQyaboarpd7c8IXf ylugo+u9mywu
E48V4Vgvm/48Q+ymdGRwm+FSeleNLvxim0DBdVZlreEJL59ZYogW3KrQMYCE AQ1xhsMl6YjH
jfqK8Cp8xRYMyZJrcXuJe1KdW85o8FL6DBdLvysVcdatNgeG2d+mzZCo89ei +Yo4TO7qvKPT
snSq7jp1OojjOKFhmML7kdrAXzhJXT59VqwwTPU1nrxOGCkDozhFc7E8wQMS 6kUf7P5w+oNg
OG3gAGI6WRMGzuBvhrgnatIPlLZnd2K/WuWWaBXfljZcgth6SIRq/JIrib8q bbssnAZNhSG7
H4SKKnOH18Jl05DpUX9HdFdwHDmGA1ML0hZxnKMxECQtaRqmWtILDNPp0iv+ hps2d2rmYuBJ
p5bf7cksJXARlzT8Q1L0xdLAZVxhGODVKoO5X2u0jwSy0lCnYiDqBKYIXlMV aAhafVug6T71
ocGpLpWrd+H2kml7GAXXtUOsc/szDqO653GX6O2ZUNkRr+MO5pX6BZInrZLv E82ffvzt7a1W
mzum4x7mVYFrCRTxSMNDhnS/RJWgpV+0VultjQZgbYuS7V8Taq1eo5TM3imV 3gx90W14llC7
yjC+z8V3Xu0ng1F0HOEVbO77wtfwjOHyH339DEd6XZiga2CA/scYIupWICtK Nl3r9Byk023y
R+g3ls1tQn9PVgQGPfXQe5xyhnGQrOFmFA7hMBBaR3CUakSRxLFWrf8ISUUN ZT9gKLeBkU8Y
y2Y/YmwD453Kh0I+J5HACGWmuqoPtasPYRJnw+pTmG5Vd+ikMke3kH6ezCZn NnG+nJv5jNkI
ZpooVzsoI2GvY/Q8Tb2OkW+c0CYI70yION6s1UYcxXXcICSD+srjJlWJ4hap 08QWFK3iU1u4
83wTc+WZLdwjY2EDDxSFfyPoQCcpFUQ8TtSP0QUwgkwXZKoNmUIZjwkgTlFP SDw1iKdhlf+x
GI6AoUIjWIoN/gBQSwcIgbK+k28DAACNCAAAUEsDBBQACAAIAKiJlzYAAAAA AAAAAAAAAABP
AAAAVGVzdENvbW1hbmRGcmFtZXdvcmsvYmluL3Rlc3Rjb21tYW5kZnJhbWV3 b3JrL0FwcGxp
Y2F0aW9uV29ya2JlbmNoQWR2aXNvci5jbGFzc51TwW7TQBB9m6RxapKWhrZA aWm4JVTUwAEk
AkhVSCVLEYpIlIoT2thbd8HZtdbr9LfgVAkkPoCPQqwdk0JURdDLjGd23pu3 M+sfP79+B/AE
DQsFgseaxdqTkwkV/qmiE3Yu1SfnKIpC7lHNpTgx8ZgJ7+zIn/JYKgslggOp Aod5IY9i5iTc
oZf1ziKAYK3ffTfodztDd9T94L4hqPc+0il1QioCZ6AVF0GboNaRItZU6BEN E1bBKkFjaMR1
ZuKOf4s7jJiKI+ZpPmUE5ZdccP2aoNhsjQhKHekzG0WsVWHjBsF6jwv2NpmM mRrSccjS5tKj
4YgqnsZ5sqTPeEzwtPe/4zDCdz3FqGbzkxMufHk+v33Y7C2ZlrsAM0M45UGi mGq3luGu7ta2
sE3w7J8v8RfYxhbupGO7S/Di2qLNEmxvHhM8vyYRwV7AtGuWy2k4O+1fLt71 CTabravekT2Q
ifLYMU/32liyusMUjAcwb8f8EAQ7WEHZeMtEBVRMlqRvyNiqyTjGE+NXHl6g 9iUrWTe2nCUt
3DS2OivABuoZ4S1s5uBXhqxg/Oo3bL0/uMDtzwsEtYxge1aUE6RfO7iX9d3F Xk71KNdRrFcW
STb+UFGcq7ifVe3/AlBLBwhSBxny1wEAAPgDAABQSwMEFAAIAAgAqImXNgAA AAAAAAAAAAAA
AFUAAABUZXN0Q29tbWFuZEZyYW1ld29yay9iaW4vdGVzdGNvbW1hbmRmcmFt ZXdvcmsvQXBw
bGljYXRpb25Xb3JrYmVuY2hXaW5kb3dBZHZpc29yLmNsYXNznVPtbhJBFD0D FMqWtkJtq1X7
YbUuULtF+6Vok9rEhIRoIw1N/eV0mcLoskt2l5L4FD6K/rHBJj6AD2W8AwQq Gpqym8zOzJ5z
7p1z5/76/eMngAx2IggwbPnC802nWuV26dTlVdFw3E/GXq1mSZP70rGPaH0i bLNyJO2S09gr
nUnPcSMIMWQct2wI05I1Txh1afAey/g/jSH8QtrS32V4rucH0HN9/H3HPpXl uivcbLLIENp3
SkJDENEYRhBmmMxLW7ypV0+Ee8hPLMGQyDsmt4rclWrd2Qz5Fekx7OSHO3WW QTO7mTBsD3kE
hhnTFdwXe6aCvuJu158Pg23pEi4bMojRHyEbwRTD+lXn76dpSGBaeT3DsDFE ilSzzLVZDOM1
V7Tde1sTNkNQTxY1MNyJ4S7uMUyVhd/vLsMzfaAlAwoTwQLD/GWu1/CNsstr FWl6xoEjbV/D
PJaUFfcZRvRcLlkcwwOsRPCQYXOosDE8gs4w4Qk/R80huVWQn+m2Lv9t9L+p ZNuxUzGksdoW
KFSUsmORk3Td9fdtxFoMhkLEO4iCz/26p3pmFBnqnnf7B4uXqq8oT2PYwCbD KFEOpa+6Z1rP
f+Rn3LC4XTYKvivtcquyWsGpu6Z4LRVo5couWlMiWKIyBqGeIM2oiWmM0GoX AXqBcCp9jtFv
NAtAo1Fr7SrfxzFGs5k2inbGWyphTGCSNBhuIN7ReknaChW9QOKY5G5+7cqp cCBgTyralYqS
1GxL6hZud6QaFFihjNR3zOXTF5g/jrMvcbZ6jsUmlgNIh5pI0ifYxGP6JNab eBJAL/85CglM
qxYi2Vks0LhC8mv0p5eE0UliBKnuebZaGtt/AFBLBwiOuDy6gAIAALkFAABQ SwMEFAAIAAgA
qImXNgAAAAAAAAAAAAAAAD8AAABUZXN0Q29tbWFuZEZyYW1ld29yay9iaW4v dGVzdGNvbW1h
bmRmcmFtZXdvcmsvUGVyc3BlY3RpdmUuY2xhc3OFUl1v0zAUPW67pGsztnUf sA9YWwakLVrE
cxESmqhUKXxInfKwNzfxirc0qRy3Yz+LJ1Qe+AH8KMRNUrRKFfBgX9v33HPO tf3z1/cfAF6h
Y6LAUNci0X48HvMouFJ8LG5jdeN8EiqZCF/LmTBRYti65jPuhDwaOR+H15Qw YTA0YzVyhB/K
SSKcqXT6S2U97utY3TEYr2Uk9RuGot3yGErncSAqKKJqwUSZYdOVkfgwHQ+F uuDDUDDU3Njn
oceVTPeLw5L+LBOSdP/nt8uw4yvBteiTruShy+/iqWY4sd0Vv3wk8nS35VWx gz0TuwyHf8dZ
2MdDho2R0O8CSR2+JSmGXbvl3l/RQCsZjbop4YGFQxwRIFku8GQi867sy1z4 sYUnKa5MuJ78
IoIy6gwHF9Tsed5s70+zZzMpbtOapoWnOGXY5kEw0AThYRwJj7IMbXvVz2W/ t3qYvokRLq7o
+F83xFARSy3XVrkIMYinyhc9mTa3tfQqZykYDdA3oLFGH7BAkT4Azeu0cygy imvtb6h8zdIW
zUZ2aGCDZisH4AE2KRI9thfFE0IUKTY7c9QY3neKczwqoFOa45hC7aRYsl7O 0TBwz7yfmVgn
CxVirGKPNBq0SpXqOdtCKV09w/PM7hFewM6stzKm9m9QSwcIaQs8T+kBAABO AwAAUEsDBBQA
CAAIAKiJlzYAAAAAAAAAAAAAAABIAAAAVGVzdENvbW1hbmRGcmFtZXdvcmsv YmluL3Rlc3Rj
b21tYW5kZnJhbWV3b3JrL1ZpZXckQ29tbWFuZExpc3RlbmVyLmNsYXNznVVb U9NAFP42hZaG
CBWtd7Aql16wEe9aBJ0CY2c6+ADTB30K6YLBNKm5AP4Uf4YzCo4P/gB/lOPZ bSi2UqA+7GbP
5pzvO3vOl82v3z9+ApjDqwQUhlzA/cB0Gw3DqW96RoPvut4HvWbx3clya7dq +QF3uJfAAENq
29gxdNtwtvQ3G9vcDBKIM8y63pbOTdtq+lw3XU9MMtbXK8t73AwDy3UOcRji wXvLn7zHcL3a
k71EbvOWYwULDBPZE/xyNYaBslvnSTCc05DAkIoYRjUkkWKIZYXDaNVy+GrY 2ODeurFhc4ax
qmsads3wLGFHmwMiMYZCb7ruolCaquMGr2nL5nWGpWz1qEJrgWc5W6Vq7+qs tkOX90zeFGWS
B0pGHpW6yPQfRHLgh/4Mep8EBNl0/aDVGL5iWHbo0eHL/aXe7mtn5sX+Qjpz WQtNk/vUgZnj
cumWHvEN4RbD+Dp1K+rLymG3ika9vuwE3icVdzCVwGSHdluQGqYxQzrjH0PD JtZ09hiOtypy
KCSQZ7jaUxYaZnGXYciQ+QtpL52o2Y4ibW8aJtd36AX3fF1KsSaNkgodcwkQ 3NSZAjTcxwPS
PJ29x2moQ8MeD0LPqRl2yDvVFTmRpJsej1rCsPi/utjhTotxkIslQ/7sYQyV kwrYxweaq6l0
McyL60Clk625oWfyFUt87kkRUBSHY9AqDnmXbcP3OUlhtAsGGQKJ0RgES6XE JUN3aByKQKXd
YbIekqXQU80XvkHLH2DkC1kKzktPRvMNjNGsybWKC7hIT+oTLkUIizRiYq87 MCMDM62XUaBY
XcYV+Z6kiWsUQTcqkZwCNnUGsHEJNoGbEdg7soV/ujCW2cftzxjJf4X2HdnZ fRSPCEakU5aK
kiPYwl9E6TZRuk2UppI9kkSP8eS0rPVTs36KZ1BSIPLnEdh0lHU8XzhA6fhu KHK8kPOCpBf9
pP8iXkL5A1BLBwiyeXL+0QIAACwHAABQSwMEFAAIAAgAqImXNgAAAAAAAAAA AAAAAEwAAABU
ZXN0Q29tbWFuZEZyYW1ld29yay9iaW4vdGVzdGNvbW1hbmRmcmFtZXdvcmsv VmlldyRWaWV3
Q29udGVudFByb3ZpZGVyLmNsYXNzhVJtbxJBEH6GtwOKFinW91orWkptT5Ma E6t+IRpJiDWh
IWn8dNxtYfHYI3sH/C39YExM9Af4o4yz10ujFDSX3Z2bmX3mmWfn569vPwA8 wb6FFGEvEmHk
BqORo7xT7YzELNAf7a4Us5rZmoGKhIre62AqPaEtZAjloTN1bN9RffuoNxRu ZCFHOAh03xau
L8ehsIenjivsKQMIHdqtTqQnbjTRwpvDI+SigQxrjwm32kuZHHLaC6lk9Iqw Uf9H3k6XkGkG
niiAcKkEC/ki0lgtoYAyIV03CattqcS7yagn9LHT8wWh0g5cx+86Wpr/xJkx xAj28nKLBGKq
JanGk6g5YH2ER2jV28uV6cbnYXte0QUeQ52mhK3/wxHyge+1DA3T3AUojisx S+KWJ8NxEHLH
K30RvfbFiNvhxrfrCzh8uOizsPnXSPBbS9XPY4v1PlIijxobx7Mgj4eE7PFA Cy6VGzuayxCK
nWCiXfFGGskLhv++gWIVW0oJ3fSdMBShhUeEG0sfgrC24CmwyUOQ5pUFlctm FnjsM7wKKLJ3
ha0DpPgDio3dLyg1vuLyZ/5L4QrvOc4BnqLCeym2i1hDlU/CVawnCK0Ek+Yv PosvNs6CyUVj
XcP1OM794GZcnEefLUP0NsoJ7G7sXwD7/A8+dM7nDjaSi2+5oAGt5r7j7km6 cq9zkqnc75xk
Kw86n+awXsZY62f55xSr2GY6xN56nL/DTSBWjJjWHvAbUEsHCGTwWvgoAgAA QQQAAFBLAwQU
AAgACACoiZc2AAAAAAAAAAAAAAAASgAAAFRlc3RDb21tYW5kRnJhbWV3b3Jr L2Jpbi90ZXN0
Y29tbWFuZGZyYW1ld29yay9WaWV3JFZpZXdMYWJlbFByb3ZpZGVyLmNsYXNz jVRZU9NQGD23
LQ0tAQoqiixWRSitEFFwKzKjgBonLDNFfGRu00ubmoVJUuBn6YMLPvgD/FGO X0IGShdwOrm9
Sc453/mWmz9/f/0GsIAVCTGGgi88X3csi9uVfZdb4shxPyu7hjiaChaNl4W5 7TqHRkW4EhIM
M45bVYRuGgeeUOr7XBfKIQGF6ykt4CTDXHewusPLprhAYUj6NcObesQwpnX1 VSTYsmEb/grD
ZO4S3OwuQ2LVqYgUGPplSOhNI45BGSlkGOK5ADCoGbbYbFhl4YaGGIY1R+fm LneN4D56mAiM
UT7dw7WXi4z2V4W/6pgNy94Rxz4VL6fV+SFXTG5Xla1yXeh+UZ1telbyXcOu FtPk+JaMUdxm
kEjjlD3dgd2BTKk55XqQSBuaocewK+KYgakMA2fuVItXKculzvaam+gd+UrV 5Qc1Q6ceBrTQ
7D0Z9zHF0EuSkdhiR7dXak0jJ2GGYbQZ2TCUbZP7+45rfVRlzCLPIFOoT1T9 srD1GsNE7qI4
UdSz18U+PMS8hLl23XOQDAU0eoOkW6pxV1RCS9T1bAfpZkSxF48ZMurGu72t Nx/21rX1jfXN
nVIfFvFUwhLD+GXsoHLPWsoVdfLKcjGkS07D1cVbI5jSVDCD84EMlUe1beGu mtzzhCdhmTLv
OrsMQ23Tiyy1NU5XD1gmExwe+mok6EohaHgf7RYRox+Qzhe+Qc7/wMBXuoth iNYkYYDXGKZV
DvdpXMN1+me4gZFIYY3Q8QCdL3zHzS8t7LWQnT1FROxgN4bx8H0SE5gkBsOd 0G2b4t1Wxff/
rUjTHClqUZaZn3hwggKdq4UTPInhXHsg1NOoQhuUpRbGGDnlnMXIRDFieB7y XuBlWBM6iSji
FfAPUEsHCPI5bvmUAgAAmAUAAFBLAwQUAAgACACoiZc2AAAAAAAAAAAAAAAA OAAAAFRlc3RD
b21tYW5kRnJhbWV3b3JrL2Jpbi90ZXN0Y29tbWFuZGZyYW1ld29yay9WaWV3 LmNsYXNzlVZp
V9tGFL1jAzJGYTFJydpAgGCbRdC0TRqnW1hat2ZpAAPpkozlAURkiUoytP+q PacxTdOTk8/9
UT19MxYY2+DQD9Zolvfuffe9efI///71BsAMyhoiDNcC4QemWypxp7jt8ZI4 dL0XRt4Shxra
GG663o4hTNva94VRtox97gVqd4VeGCLZOYZEbo8fcMPmzo6xGniWs5NhuDTr On7AnSDP7bKI
oZOg1ghqtgq1cAw1dUDOGDrkIDyGsdxpxL1tbgqjuucba7xgi7yaEELMtvxA ONJoPHduFCMh
YC48TIYdjyzHCj5jiCZTeYa2Wbco4ogioaMbPRouM6Qu7C+OfrwnDQcYssnz eWT+B8VUvhMk
lw4dlxh6cpYjlsqlgvCUAFJw1+R2nnuWnIeLbcGu5TPcaEGBoc/0BA+ETB7l J/Bcm+Fusk5y
/zAwDq3ijgh8g4jtu74VCKKkYYhh9ELJiWMQw1KTEcrnRbxnqxHf1RFHl4Yk w+T5asmHJC+c
YMVzD6yiBBxDWgKOM7zfKgmpvOQ2qWMKBunoi6DBE4ORbFGB2YbjSpcZKsDW dHO8IOwa2Wmk
JY0PdXyEjxl6iUbdCYaZliQec1/UGai4GB7o+AQPGbpIXgm7StrSFU6mcg23 OHu8m5E8Hun4
FHQdYsQj6+yX6V5fSZ6608uFPWEGCuMLPNbwJdVmg8MVmwfbrldaz+qYBfUE nShskAYF4Zi7
DLfO4HCyndGwQIXSsB+qqTRXb6vCO7BM0YWv8Y2GbDOJmkcd3yLHECcSoRWV 7umQZm3u+5lU
c5AxLBHbMxsVLxbn6cr82oV5rOj4Dk+qCOFBhvvJ5kZYH7bpeqIWWGhIOVgD ldE6w9A7D+vY
wCbDZUnmF2GWA8t1cid9sKFs6j1kmwwysv11UEunimYYvsBFZdD8Y0GbMnpe xsgqapaKjQhn
i0EIRcsnOCFl4ToKMt4BT5TcA3FGyLJoF1yz7MtKFjq2sXOclrC/DTfUXn1k 6hClwMILDXsM
t99xVIcJW306nhI4N03h+yPTDHMt286FP2rxVbfsmWLBki29Uy5PyZqiC5V1 KF5Vt4LafE/D
N4Oh/4y+SA2/qf1giDpFlP4BRHEN7eigmUazCGL0o/ar3unDQ2M77dEXkZ69 NJtTcyCRPkJf
+jX6t9LsCFde4urvyuY6PbuV5wG04R76aLxBM71qhZu4RSM1aNwOPf5NHtto 3CRvg1vjfdHI
Ee68xGj6D4y+xtgWAaUqmKhOp+X0gwruyWm6gvsVZP7E54n5V/gqgreYX5xI LL7CcgRLk3Tk
agWrNV53KDrgCcWyRvjrmEQeD7CJBWxhGU/pUn2vuKarfEKu8m2LdhmdS9CJ H8jbMjrxI36i
OBmenWizRzsy8sE6RrnxkNHiRJXR8xqjhEJ6Roo9J504aVJQDAarfkIG3SEu 3YAQN0Lv5gnu
QxqluroUpYJiBbsbNYw4jYCgnG6fyoRe9d0bQwlO6Gc09NMu/fx24qBDLV5X xhH1c9VzHz+r
9Sj9+WHwaGWMRp/WpmkMgP8AUEsHCCRMXECDBAAAZQoAAFBLAwQUAAgACACo iZc2AAAAAAAA
AAAAAAAARQAAAFRlc3RDb21tYW5kRnJhbWV3b3JrL2Jpbi90ZXN0Y29tbWFu ZGZyYW1ld29y
ay9hY3Rpb25zL0FkZEFjdGlvbi5jbGFzc41VW1fbRhD+FgxyhEoSEwKkIYHQ EJtgFBpyKU5o
iDGNibkUHFz3RoW8tgWy5EqyIb+oz3nhEs7p6XP/UV96OmsZ7GCH4nO8Gu3O zH4z883o738/
/glgGmUJHQzjHnc93S6VNCuXd7QS37OdXVXTPcO2XHU+l5uviRICDHdtp6By 3TTKLld38prO
64qqr8TQ/cKwDG+OoTMc2WQIxO0cD+IKwxUtlxvhlue8l9GJHgVdUBj6w6kd raqppmYV1A3P
MaxCTNhdTRkWX6mUtrmT1rZNzhBK2bpmbmqOId7rmwGvaLgM4dTlYogRLKdi yehDv4QbDEPN
8VQMdc3UvLztlN4lFdzEAINS4F6GfG1zSy8yDIcjqXMmybPjmIQhhgfnzuuo XDUZ96UN7lQN
nffgSwxLuN0KouFRwR3cZZAJRN2K4X5zxuKm5rqxSNPO6vYO171YEKOENk1Z qd+6eJqVKapD
QpShB4MYU/AV7vs31BUZnrWrySdh67bDG4HVDSn8BwxTLXp8v+xw161VIlHV zIomShG3LY/v
ezIieChhguF6484kHRW4o2ASUQZJ2PDVPMPNcLI51LpaTMY4VMGnRwyL4Vag zQCSLQhircmL
bAbxNUPX9NPHz2dEnWYUPMFThkFKk2BSlZ+VKGNYOXuPYewiZvhKNaDPFXyD WYYeKsMpmYk0
bVLeHtcLhjvtyro1v7CwlVhJr2clUPcNnHf3umKYOe4E8YqazuJ7fiuOREf8 JiFBxkv0yIgj
IWGB4VqTh/eux0sKFvEd1UmvOA4Zp40SXzZMU/Qf9fqSMKeuWcJbGgJaucwF lW6HlyItkdWh
xITFsoIVrDIEPds/ZLgRbjUhbn1Pbf55Dib2uV4RgSSqhE3CximhaNNU32hu cVkry1jHO0GU
bhlryAjpB4ZsG8q0cDvVcEaO2tSmXbVk/IifJfzEMPq/Nyj4Bb8SaF4LhGcM rxgvcn2Xsjt3
EcBPA283CmT8hm0JGkNf4yyxr/OyMFOgo5vmbZnS7G14mr6bdjQxZyT3dOK0 EPtzI02MV71E
ZR+7REbpBt3vQIZHFzdta8/SRbxKhhOXzwwDo1j6U21yQGfyhl1xdL5oiG7s PftgTAltjILu
g/h1kET0oVWitye1d0CaCAUPIX+oKXxBq0xPIESKfeglSfHVcBXX6ElVPnPx D0nd9Pz9CKHQ
4DFudeAvDKYehkaOca8DyycYz7Lrr3CE8CGmVqKhaVI8xmOGAzyLhmIneJkN fXuI+SO8PsCb
A6Ro/wRr2ckTrGcPkWbRQ2zOBiaHAgfIZv6APNs11HWArQ8EYAt5GMQOH/QE wQYGCPAgrUM0
q25hhoZfCsOkOUKao9jFPZTpkyGCmvOB14PqJR7lwMnrALE+jwJ5HcdbFMmu k+xD2CHrAP27
YKJEK4NVS5j9H1BLBwicJzCtKQQAAJAIAABQSwMEFAAIAAgAqImXNgAAAAAA AAAAAAAAAFMA
AABUZXN0Q29tbWFuZEZyYW1ld29yay9iaW4vdGVzdGNvbW1hbmRmcmFtZXdv cmsvY29tbWFu
ZHMvQWRkRW50cnlDb21tYW5kSGFuZGxlci5jbGFzc51U3U4TQRT+BgpbSxGo /KhAKYjY8tOi
IqhVtEKJkoKJNE24ItvtWBe3u83stJQH8CF8C7wpRhOjN1z4UMYz24IVakK8 2DkzZ8453zfn
Z3/++vINwF2kNHQwLEnuSsMplXS78FboJX7giPeJpsJNpAqFtC3F4VpD8ZI+ iwsNPoaYI4oJ
blhm2eXkIHiLV96VQjdk05yh49U6Qyizr1f1hKXbxcSOFKZdTDL0rjm2K3Vb 5nSrwv24wjCe
JUpNwI1TSnG9yYSh+4lpm3KVoTMayzH41pwCD6ATV4MIoIehL2PafLtSynOR 1fMWV8iOoVs5
XZjq3FT65DvTZVjO/E8GiLnGa9yoSIq0Gs38Oxdpz8p07HSV2zIZa0nC6/w+ NySFCqRrBi8r
I1fDCMP8ZcKdugRwA6MabjJEL8siiDGMMwwVuUyVy5Zp6OqKKiF5TTIMRtuw 1DDBEL+AwGtl
wV1XUU+kq1TD1lB+TDKE25VzL7W+vpfezr7ZDSCMW0FM4zZDDxE6rRLDTPRi w7Qldodh5Lzl
i4ppFbjwI0ZhbX7g1TCyEAlgBnOqUebp/e0AcgHEsaghwdDfcnvoSl4K0tjc YxgwKkJQGrNm
iW+ZlqXaiHpxU8VeCuIBlqlJ9XKZ2wWGsehm7AJMk11SeTwM4hEeM/il07g8 X4CzWfHporjI
MHv5bqPJE9W/J+9P0+04FWHwDVPlerR9m8eVHyZB76N/BqNO60I3SY1OHfDT x9TM0RokTYIk
I9k1e4zeT55JH63dnjKAflqDDQMMIOQFvIZBshqivY9Ow16YDwSm4Fbm6rh+ gogSPxD+iGG1
+45wKFLH1O7WCbrmj75iZjcUPcbsZyzUcb+OlaMz4GECAsFqBKcApwhumsAU kUgDoklE7ZJ4
QhQmyOcpVr2XPfMiPf8NUEsHCEM6ypmuAgAAMgUAAFBLAwQUAAgACACoiZc2 AAAAAAAAAAAA
AAAAJQAAAFRlc3RDb21tYW5kRnJhbWV3b3JrL2J1aWxkLnByb3BlcnRpZXMr zi8tSk7V01Ow
VSguStbnyi8tKSgtAfOTMvP0uYCEXmZeck5pSmoxUKwgpzQdKFKRm6MTw6WA CnxdQxx1Pf3c
9DGl9LgAUEsHCJtnMYZGAAAAaAAAAFBLAwQUAAgACACoiZc2AAAAAAAAAAAA AAAALAAAAFRl
c3RDb21tYW5kRnJhbWV3b3JrL2ljb25zL2FsdF93aW5kb3dfMTYuZ2lmAX0C gv1HSUY4OWEQ
ABAA5gAAi4Ea1teYfpVNyuinMVcKVJcx4+252fOrzeia8/O55e+q5uGV4eum p6NWzcaGmZ1Y
iHwV7fq71eGjpbRzosxnnKNTjYIloatk6PyH8/PLrLd1BAwApbN8pLJtq7p9 rrianqZdkock
wt2g3+SNp7SGusybhXcLg3MGxuaOvcSmt8V5qrFo9fXQW1oJpq93sb2cmJBC tq1nm6FMrsCJ
SnM7SWkYovCFd2YC0O6d3+GVwuaHy+WMtMOIus2Do69ox9eah3kP5/9/ytO1 ///jnq5u5PKv
rsl9ttp40uao0e2l1uiq2eKn3Oap2Oqk2+qruulxkYc9n5o9r8CSqJ1jsrqG xN+Dprh83MWB
jopWvtKIkI5DlcBnhqRh2+ayn75kZ1kCRWQyt7+uRnwkVmcvwMB21N1/y9Ko 0d2noLVjxsOU
rrxvuLNdusOD///J0+ebiY1kX34x1eeD2OGEtqxzy+KA4PS1tcKD4t2tx82o /v+RusSIv7R5
usG+qa1lwdqTtMRvIfkEAAAAAAAsAAAAABAAEAAAB9qAf4KDhIWCATkjcmVx dFU7CG5NTmeC
CyMYQU8UFEc6KDgHB0qWGGhgYjUCaio9fggHSIJXeTQbGw0xfSsadn5JA4Jk XgUbWFMPIBcd
GjwiwX8JNgRaDg/JFz4THiUigicnNyZAJuNAEOgWIYJbcC1rDTIV88ouVHqC IQBfEPoA/xYs
QIER5ZAHAgLqTOgwgQOJD3yESBA0504SAkRKWHH4IQweCZX+ZBjCZgwcLjOk vEhhhkmRiX9Y
OHjTJosAIz/OLFEQIUIXQWn2ZEjAgIGCowoMKA1pqKmgQAA7UEsHCDiba1+C AgAAfQIAAFBL
AwQUAAgACACoiZc2AAAAAAAAAAAAAAAALAAAAFRlc3RDb21tYW5kRnJhbWV3 b3JrL2ljb25z
L2FsdF93aW5kb3dfMzIuZ2lmAagEV/tHSUY4OWEgACAA5gAA1vSpx9anytK5 xtSY7Pq1YF0T
tMp20+aK09rJrbF15O2Xs7p8w8mH5vGx2/azb5NM6/i68Py8paduFBoWu8aK tcCE3OiPyuiX
jYUip6lWkIgp8/7EvMmUtsOKwsuql5I73uustvyTy9uL+vy7lI0z4+6svrt8 ucKBqa1xsrp3
192LtL5/vsmht8SSm5dFoZ1PzeWk4/q01/OcucWWuOV/8v3L4/qtjIIYvcmO wcyVZHxDk7Zh
xOWF6PWz6++hvcudq9R0weKNzOmO6fS5o7lmuNt5u8abyOOCoZ9s4fWq3OGl 2t+d9vu23Oad
09y60eur4+yyt9aF4fSj7P2w0e+TgYpOydZ/8PCpmbJYfnscxs6w1d2mf6BT 1OmmmZdl/v3F
5ve34ve3zvChPTgNrsFtr7Rxr7Z4z+aw7vvD///Jlp5Y1u2YgJZO0+SmnMdk xOmK4NySoNxs
yv+W0PiNjJU4k5AsvM56or90s7pusa1ursmDsMFo9vS3+PO+4+iatMRvIfkE AAAAAAAsAAAA
ACAAIAAAB/+Af4KDhIWGh4VXVz4+Co4WFgeSkwdUazJSmUk2BJ0REBCCi40K kJJHqDyqPEJU
VDKwAJsxMQQQYIKMj6dHRUU0wMA8bxfFawAADrQxYLh/jZEHVnYGBkBAvtdA UUHdQRdiyA7j
YWG5pQd2ZEQ7O25uO1w7BnYMDAP4xeHiDuZ/fpFEkOGiQ8eDBzrY4DFhr+G9 AQEuwICRrJ8g
OJGKENExoWMBNSZMLFiw4sQJBhQY5IA4gCK5iypEGNjBsWMVCSgSJDAzsuQJ CjhWBoDxZJwD
QSpUWPkTr6MOL0hw6uS5omQHoEJdHv1jpZoBGg/GVIEaVSpPkhUqXOWQI0CA J8n/BB2IcodI
nDFZUEjYuzenGaor1GKF+BaAoDVCeIAdQ8SEXr5+Aatd+8MtjC6HhbyRUyCL ARNlUIgWvTMF
ycCCOXCwjPnPjdcYOmOYTRuDhtu3Segm8aG3CxcvXmTIPCfEGCwMUpRZvvyv 6aqo164WEKCN
oNt1YmP4sHt37+8ffv8OLjxDnuF/RIgQQuM4gxMp4ss/XTVthw4tjLAIIGCL ddewdabBbLgV
2B1vvgEXHHpSwDLFGHSIQIFJ0NWX1mQtzMCCB1oIgMAWIAiSiQxMPFBAECiZ dKF99+GnIYce
OrFEiH9MscYJSNwxxh4B4EABBS0GmaF+HngggIcg0ijB/00XpMFFARcMgIOP LbaQ4QxEGhmj
EiDQaIIUUwBgw4MZPDGAahxYOQOWWR6JAAJLQFFCCYKMQMAUSQAwgg2MnTFA Dmhy8AMLG3bo
IQJcNtAAnX8w0ckUNgCwQBQfnRHAAD9kuqGWb8IJxRA9KFqnowQ04MUAX8TA RhUdOOGWW26+
6UQTn4IyRAN1jjBCD1UMEIENNkSgBxdYnBCAE8gi4IQSSpQwBAQRRAvBELky IcEAG3RCQBJd
xAAADAc0Ia4fJTTQA7TRbrABGqH88QUfeSzxBROklgBCD52A0cO+5xIQbQTq blBDDWgI0scJ
SqSh6wj0loCvtv7+C3DAA1eMyAXFGBsSCAA7UEsHCNffu5qtBAAAqAQAAFBL AwQUAAgACACo
iZc2AAAAAAAAAAAAAAAAHwAAAFRlc3RDb21tYW5kRnJhbWV3b3JrL3BsdWdp bi54bWyllE1v
wyAMhu/5FRH3kX1cpikkqqpV622a2t1pcCs0AhEhbffvBwtroE2mSuVmm9f2 Y5zk5bEW6R50
y5Uk6AHfoxRkpRiXO4LWq8XdMyqLJC+hErxpYbj6hB9/I43odlwWSZKmaQ5H A9LFndUfzgii
TSN4RY0NoCHSKC4NQUrvsM+OK6UB604aXgMOVC0qvC4PvMWQK7eiwepPJWjb EmSgNZWqayrZ
VtMaDkp/4VnQUZgms3lOpbLzWnl2AiymeEeoOo4bO7YGKsP3ELAE3qh5adsk 6H2Ioij8H9ik
yL3DyirmvWJxUgRNDJ1lgfdG9D2HQ8DszBHYT+u+nvLy9iSeqxdwOfNGoBpk FwA5c66k0XzT
mUhuj1D9+qw/lgS5my9bLiBaOQ93sb29eznFRRl7tUW/0blQ0A0IgmaMpf2F aL992mEg5+3f
OByfP5jPGB+DLe2EebN+AXrikf9S4ZlH9TPwqivff3xO/dJdzigeUDSGxH4U /l/3A1BLBwiK
DMU5eQEAADYFAABQSwMEFAAIAAgAqImXNgAAAAAAAAAAAAAAADwAAABUZXN0 Q29tbWFuZEZy
YW1ld29yay9zcmMvdGVzdGNvbW1hbmRmcmFtZXdvcmsvQWN0aXZhdG9yLmph dmGtVMFunDAQ
PcNXjNILu2rgA1ClpNmmoqqqqE3OkWMG1o2xLduQVFX+vQMGNtCN0lY9INB4 3pv3xjMYxu9Z
jeDRea6bhqmysqzBB23v8zgWjdHWg7Z1ilwK4zD9XjGOqUWnW0sfRUPwHTpu hfHa5scgrUiN
bGuh0vM75y3j/qa4GgKLdO1qkc7V0/etKiVeaOXx0ZOWbLuNYQvXewRiEB2j csAlcw44JVkt
HXg67EudCgVSVAj8B5dIsCw27Z0UfASczwTEjaqkyEoZ/IzjKMuGchNjsYuj kcZ55ulVCcUk
fPNWqBquPt98LL7cFjt4ByfX1NCL0NDLydJJfuB0e2axBKGISXEkYtsrwon5 oNCMnYoISy2I
xh6QZ1LcckrpY9ksbUYmGzIRPfU1AyxRWp1+Yh0rNd8MkTOH+IdX9YaEWZ+8 dlGbpZhOixIC
cpE2XFmfTldm9YODD48cjRe6b3wUudagTQNuyqQOREEb9dfvhcv/qzlt/tEb Af/G2mxBtVLm
z7wSzzOrwVmw9hV9a1WY7t/mBkLOmR2SXsrJ1pN7mK8a/Q4r1kofBiYamea5 OyaFKRD95kM5
rz5U9PTlw0ElJC2qHyK16FAN+GmVLEqS0dFuMb8/mDCMOj/EwiqPhwt367pH 7a1+S73JVSgZ
t7avsfAtlnmXVjdhSJJ5wd8G1NCbp/gXUEsHCA6M0nIFAgAARAUAAFBLAwQU AAgACACoiZc2
AAAAAAAAAAAAAAAAPgAAAFRlc3RDb21tYW5kRnJhbWV3b3JrL3NyYy90ZXN0 Y29tbWFuZGZy
YW1ld29yay9BcHBsaWNhdGlvbi5qYXZhrVNNj9MwFDzHv+IhDqQVpD+gWolq t4eCxKKQFXtD
rvPamnVsYztNK5T/juOk+YCyYiUusRXPmzdvxtaUPdE9gkPrmCoKKvOdoQVW yjwtCeGFVsaB
MvsEmeDaYoI/Si7VKaFaJ5uV1oIz6riSy5eAb5V0eHJXa2zlkorne3Q2ueNW C3q+iit5svnq
ZW5RssPfEJ8FdTtlioeNn2YxnxOYQ3bgFpig1n+9DqOEBSoEUKuROQtqB+6A QAe5byzgCVnZ
7D3Dguhy6886ktFc4FUILFB6mvG88JOQaDGHWCr57gM90lyxGYm8mPcW8Z8s e20dNS5+gbuh
wYJEndj77Xc/HrQ0V+DBjKbMi42iznnIu/UGBisTZpA67CDxbOnxzpxDXcSl A4OuNJ43x2t1
K5mnpeyji7sWb0FiNTazR6zyI7fKxLPQKeI7iMcdJi3SdfaQfvqWrr9kqzRr Z4miFj6JJFk/
brILLvDW5Dnk/ccGVMOOS39ZumE76UmzKoutFZ6n/h9xKx3/FuFR8Rzag9A/ aIHhFUDV7yam
+Lc02B00Nh6OwDcgSyFmgwHLnv3Pi9DXNbyTS3Cxw54lW/sHEzeJ+qwl3Qrs NE9mMaW8/A6S
Xl0YuL1rLc196uE4Gtoy0XsdQqubbU1q8gtQSwcIqn6r5ugBAADOBAAAUEsD BBQACAAIAKiJ
lzYAAAAAAAAAAAAAAABOAAAAVGVzdENvbW1hbmRGcmFtZXdvcmsvc3JjL3Rl c3Rjb21tYW5k
ZnJhbWV3b3JrL0FwcGxpY2F0aW9uQWN0aW9uQmFyQWR2aXNvci5qYXZhlVTR SsMwFH1uvyL4
IBlIfmAITnFQcIig+ChZclvj2qQk6aaI/+5d0m1dtzr31N6ce849p01Sc7Hg BRAPzgtTVVzL
3PIKVsYuxmmqqtpYT4wtGIhS1Q7YR84FMC68Mppld8aUt9zOuEYVOz5NmIFu /t19VvPzaSuN
YtkrJpuDFu+TQLsz2nmuvTtNeFVamtVQX3ThWJSdYmns11nNB94G2XVdKsFD 6tiJuSdyqZwZ
zN3lZFsSps9V0dj199oQj22FnWEpN97SupmjJBEld45Mdvp9SwQ+PWiJPX3g O02T2qol90D6
4ZGl/HZW0g77Yww9FouI7esIxyWJa2qwtLM6TpOfYMN4EB4kWRolScUXEOUc zZXmJenvA7IK
j6i680quyf5PfXrJnpmwgBlpS8GRiYVCOY9WdtQBK7kqy/VBwFy0e3xIFRej gy6ADFjX6EXD
inQgenE5RfDiChlJMngW2Oxtmj3cB6PtFMalpBvhAGyKgBymuHlcgrVKwtFA 7b1BexcI/q5Q
xkz7J5pUhW0T7QM0+iyixzW+3aV0FLBWNeDYFy3+/AJQSwcIGuG1WaYBAAD8 BAAAUEsDBBQA
CAAIAKiJlzYAAAAAAAAAAAAAAABOAAAAVGVzdENvbW1hbmRGcmFtZXdvcmsv c3JjL3Rlc3Rj
b21tYW5kZnJhbWV3b3JrL0FwcGxpY2F0aW9uV29ya2JlbmNoQWR2aXNvci5q YXZhlZDBTsMw
EETP9leseiqX/EDEoQpByi2iFT0i19mEVRPbsjcJEuq/YxRICBQJbivtvpnZ cUqfVYPAGFjb
rlOmqr3qcLT+nEpJnbOewfomQd2SC5j0lCjnWtKKyZqkOMbLExr9fCRT2TGz pqam9+jTP9Az
vKsGCvZ/zGQ4k9L1p3gEulUhwG4hvpsAvjCaKsCPxauUwnkaFCMEjrCGmoxq Yc+eTANl/rAv
8+xQPOZPxR3cwuYQe8um3u4/e0sc+uBQMw24Sd8lp2DXg4P2GP2uL7dSCPF7 xaDn8SaGF8Ij
996AwfFqAWvtL3AqxWUJ+vFtg1wYYlLtxJXLW0W1XRmui5nULvINUEsHCF9Q FpoFAQAAXQIA
AFBLAwQUAAgACACoiZc2AAAAAAAAAAAAAAAAVAAAAFRlc3RDb21tYW5kRnJh bWV3b3JrL3Ny
Yy90ZXN0Y29tbWFuZGZyYW1ld29yay9BcHBsaWNhdGlvbldvcmtiZW5jaFdp bmRvd0Fkdmlz
b3IuamF2YZWSMWvDMBCFZ+tXiEwKFGFot9AhzRQoNDSFzIp8cY7IkpBOcWnJ f6/dlMS4Nk0n
Cel97+6d5JU+qBI4QSTtqkrZYhdUBbULhxljWHkXiLtQStAGfQQZa5JlUH6P OsqVQ0uzIVlC
qbw3qBWhs3Ku2+VJhXlxxOjCLczyAi2c3WGZAtzGbZrmt2D1foO2cPX/6B58 6Zf5tG1EXBsV
I59fiWGAwzuBLSIfuf5kLPtx/NNLjCfi+rKdNp5ZFpOHIDqnM5adOrV678B1 AEXQPxaNUzY0
/1/1AlAKlluouzl++Y02dHRYcB/gHOzFgxVn45sy80deAvUFoq2RXVUyAi0t Eiqzxg8QbbPf
P1c85Pkdv8/z6QCx3reezjQpBIUEI5I1KUrxGS2InTJxSPaGZEBMXher7owm 50mc2BdQSwcI
7DSt8TkBAACEAwAAUEsDBBQACAAIAKiJlzYAAAAAAAAAAAAAAAA+AAAAVGVz dENvbW1hbmRG
cmFtZXdvcmsvc3JjL3Rlc3Rjb21tYW5kZnJhbWV3b3JrL1BlcnNwZWN0aXZl LmphdmF1kMFq
wzAQRM/WV+zRASPSs+mh0BgMORRSct9Ia7NEloy0ThpK/r1KYlpT2osEmnmP QSOaI/YEQklM
GAb0tos40DnEY60UD2OIAiH2mozjMZGeWLdvGdniJUxS/1uhmEYywidq0EiI l6wbp4NjA8Zh
SrBoQJY4GshLgj9I+FSqmNlTYAsmEgq1noXRPYaUi1Hg7tcqc0Wxk8i+B7Kc VS8ZhOc51z3J
5vu5XNW5PSdpmew58cFR2aFL9KvV8AfZUuL0CH4ytHYn+TfRBU97pnN5O3T7 WgHcRRUsFuvt
pnmv4Emvu2ox9ea8KnVVX1BLBwithjZf7AAAAKcBAABQSwMEFAAIAAgAqImX NgAAAAAAAAAA
AAAAADcAAABUZXN0Q29tbWFuZEZyYW1ld29yay9zcmMvdGVzdGNvbW1hbmRm cmFtZXdvcmsv
Vmlldy5qYXZh1VVbb9owFH4Ov8LiKUhV/gCqtI3RlYmWatD2YZoq4xzAbRJn thM6df3vO75A
LgTaPk6C2LG/c//OSU7ZE10D0aA0E2lKs3glaQpbIZ+GvR5PcyE1EXIdAUt4 riBiQpqHhapo
5DbDt5HjZ2CF5iIbl5DpDwk8M8jN5h1Ck73UlCsNGch3CF0LfYmbBOLTph5X lEFUctiCRFNz
LQumCwnxSGRoS99IUfL4iMmW8IIuE5jSJSQfkPoo3hq5sy/vQJ8Aqq2O5veL o3drSfMNZxhX
imw6CtvyeA3asiYXiutuZMExtxuKebXa1DHQTUL1Ssj0dnIMUdHC83QOsuTs qNmcSm3TcIOb
iv5dzVHp/hzH40zLP96EYxKmsZcXy4QzwhKqFDFaCTwjTWL3YkyQl17gUUpT jcuKZzQhyCye
rcnkKzkn/QVa97ov9tZNzfpoI8glL6kGUis1KX0hq1vng9ey6wyC4SWQInEV Oewb9K0X7Lwr
BY9Jtm+T0DvoczCJz0hHD2G4fjcwgQYB/l/bSpEH2tmGC8oT7KZD5UY2OBwH H9U/LxgDpTqc
ny0fgWkiAbs5u6NJAV4jX4UVLoLfBU1U2F3waPJ1QLxY4CoQ0TgO60qH5vK1 000J3ssO95qj
k4B51kM2Cz6rcrcLnew25yRDGrauQ+NXL6h42hpnDZ4cHXrWn3pIPMsLPdrQ bI2E2TFzn2uR
xBMD2B+gY/bABXaQoJgrLCWEh9dO/ucvgqNl7P0MvVJs6CpXrhI2Ay7HKPNC +rMM+mfYZlth
l40E6JPXocusMVQlpjF/993cPK2SZWx2zPl6onyt0fORSIo0W6DOne9i+XiG SdT4j+G5GQMK
WChiBsNWPuzQrFTa13fqdNiTStvqmjqqkRwh9h4n1RIytgkH5rU+092JU2Y7 JmiM/Ghy9e1h
9uX7w3g6vhpfLwa1ctRZwSQg380oNWyUIgn3n5ZG7V0/evrXRmXoQGcEP27R 1e10MSF/7f7y
YT76MZtOrW/u6M4fWV98gyvQrTYIjYWOJgoHLbkGJ/ZSzdO2jG2QEBNnoHMM 0iPw1/rCEeXX
cxK2rgani+RAbaHINoE15i8IS2PU7u1Elm/24sR8NOIoZubiwfcm3A0pgzJ1 /jQrQUrMQ+/E
IPivwpaQihLejrweLlb9QrBChXUiO7OO8IOoglj5139QSwcIUntAd3cDAADU CwAAUEsDBBQA
CAAIAKiJlzYAAAAAAAAAAAAAAABEAAAAVGVzdENvbW1hbmRGcmFtZXdvcmsv c3JjL3Rlc3Rj
b21tYW5kZnJhbWV3b3JrL2FjdGlvbnMvQWRkQWN0aW9uLmphdmGFVF1v2jAU fU5+hZUnRzD/
AdZpDKIRbYWq0EZ7Qsa5gIvzIdsJVBP/vXZigkqhfUgc+55zr8/xdUrKdnQD SIPSrMgymqdr
STPYF3JHKNO8yNXA93lWFlKjF1pTUmkuyISq7T0tz6FCbggwwUsFhBXSvpps iozaj8HXyOgA
rLIloxpyfZsAh1KCUnZvJKqpqKgljYpcw+E67WVNGTg9ZNgMV3EVJ/G8qCQD dSv+IKheFzJ7
im8hOj2xkz4HWXMGZ7Ouum23VVNdyMGnsC77ME2jXMtXV2RiHgGG7JfVSnCG mKBKIYNq9SLj
DRgectP/vueAHQSHdtVTVQkSBzRNEdgCQTjwvaPvez9nNUjJU+iodcFTJKsT 80IwUm68Q/gi
FJ5tJBvQiVG2gpxtcWinDnRJIo0kuxvPBRDLUpPd1bFUF8DX3SHxuKF/6BrE 3HiHctijD3Gc
V0L0T71BhqNF/Bwtk9njn1/RdDRZJvF0PEua3C4TMf49U8npShghXxB7QdBH n1rSdAd0iwnP
02KPw5sVu24iD3+ffsfTZTzuBcvheLyMpovHf6ZcYIU2B4y+ofZqmI8A9dD8 VWnICKukNPEF
z+CeC8GVK2f9e3dTEdSdce8C2BxP3y6738X3uZY83/RRO/7AYb/x1Qk4Zbdb su3kGbq57DYj
JFxvR1tgO4VNtQZ5RIxqtkU4OjAo2x5v+9ADUpoCeq7N720hzd3HLcP28dF/ A1BLBwjBQx0m
JAIAAPUEAABQSwMEFAAIAAgAqImXNgAAAAAAAAAAAAAAAFIAAABUZXN0Q29t bWFuZEZyYW1l
d29yay9zcmMvdGVzdGNvbW1hbmRmcmFtZXdvcmsvY29tbWFuZHMvQWRkRW50 cnlDb21tYW5k
SGFuZGxlci5qYXZhlVFda9tAEHzW/YqtHoJEqOi7CVTYTmtok9I4gTyZ83mt XHO6E3sr2aHk
v3flKM6H05SCHrTamdmZUaPNra4QGCObUNfar9aka9wEui2GD3GklK2bQAyB qgKNs01E2RLu
IUW5jEza8FeZHNLo34zpFk3LNvhph57/i7A12PQvfyfhtiGMUTDC67RrdY8f B8+45ac8b8Yu
DdtOc5AQqmmXzhowTscI5Wo19Ux34wfGEBVEEcUfvKoAfqtkoEeW8wbW1msH F0zWVzCbwAmk
czEwyJ3uDejhTjpSiUo+n3dIZFe4lztf/kLDcrfvA7OXRYKm6lMOfENhE+Gw s95WMihQNwKZ
7DrbsYoKuWwaOfG8rSyHDyfgW+d6bJIcHb0Ptl7ieoNhDXBQ/aNCRp3Ez7ID QP6edt4vrjRZ
vXSY7f9T8ePb5ZfZ2WI2OU4X5WSymJ7Nf16n+ZPxfJc6IeSWfB9bpntAF/HF IvW42TUPHyGF
Y7i4i4x1YVoiaXZua/xunbMxy3cCSh51r/4AUEsHCJDTgjiJAQAARAMAAFBL AQIUABQACAAI
AKiJlzY/HFeoowAAACwBAAAfAAAAAAAAAAAAAAAAAAAAAABUZXN0Q29tbWFu ZEZyYW1ld29y
ay8uY2xhc3NwYXRoUEsBAhQAFAAIAAgAqImXNmzt2DXrAAAAjQIAAB0AAAAA AAAAAAAAAAAA
8AAAAFRlc3RDb21tYW5kRnJhbWV3b3JrLy5wcm9qZWN0UEsBAhQAFAAIAAgA qImXNslEwP64
AAAATQEAACkAAAAAAAAAAAAAAAAAJgIAAFRlc3RDb21tYW5kRnJhbWV3b3Jr L01FVEEtSU5G
L01BTklGRVNULk1GUEsBAhQAFAAIAAgAqImXNs0E7D9RAgAAjwQAAD0AAAAA AAAAAAAAAAAA
NQMAAFRlc3RDb21tYW5kRnJhbWV3b3JrL2Jpbi90ZXN0Y29tbWFuZGZyYW1l d29yay9BY3Rp
dmF0b3IuY2xhc3NQSwECFAAUAAgACACoiZc2pWcibgMCAADAAwAAQQAAAAAA AAAAAAAAAADx
BQAAVGVzdENvbW1hbmRGcmFtZXdvcmsvYmluL3Rlc3Rjb21tYW5kZnJhbWV3 b3JrL0FwcGxp
Y2F0aW9uJDEuY2xhc3NQSwECFAAUAAgACACoiZc2M9YOSjEDAAB0BgAAPwAA AAAAAAAAAAAA
AABjCAAAVGVzdENvbW1hbmRGcmFtZXdvcmsvYmluL3Rlc3Rjb21tYW5kZnJh bWV3b3JrL0Fw
cGxpY2F0aW9uLmNsYXNzUEsBAhQAFAAIAAgAqImXNoGyvpNvAwAAjQgAAE8A AAAAAAAAAAAA
AAAAAQwAAFRlc3RDb21tYW5kRnJhbWV3b3JrL2Jpbi90ZXN0Y29tbWFuZGZy YW1ld29yay9B
cHBsaWNhdGlvbkFjdGlvbkJhckFkdmlzb3IuY2xhc3NQSwECFAAUAAgACACo iZc2UgcZ8tcB
AAD4AwAATwAAAAAAAAAAAAAAAADtDwAAVGVzdENvbW1hbmRGcmFtZXdvcmsv YmluL3Rlc3Rj
b21tYW5kZnJhbWV3b3JrL0FwcGxpY2F0aW9uV29ya2JlbmNoQWR2aXNvci5j bGFzc1BLAQIU
ABQACAAIAKiJlzaOuDy6gAIAALkFAABVAAAAAAAAAAAAAAAAAEESAABUZXN0 Q29tbWFuZEZy
YW1ld29yay9iaW4vdGVzdGNvbW1hbmRmcmFtZXdvcmsvQXBwbGljYXRpb25X b3JrYmVuY2hX
aW5kb3dBZHZpc29yLmNsYXNzUEsBAhQAFAAIAAgAqImXNmkLPE/pAQAATgMA AD8AAAAAAAAA
AAAAAAAARBUAAFRlc3RDb21tYW5kRnJhbWV3b3JrL2Jpbi90ZXN0Y29tbWFu ZGZyYW1ld29y
ay9QZXJzcGVjdGl2ZS5jbGFzc1BLAQIUABQACAAIAKiJlzayeXL+0QIAACwH AABIAAAAAAAA
AAAAAAAAAJoXAABUZXN0Q29tbWFuZEZyYW1ld29yay9iaW4vdGVzdGNvbW1h bmRmcmFtZXdv
cmsvVmlldyRDb21tYW5kTGlzdGVuZXIuY2xhc3NQSwECFAAUAAgACACoiZc2 ZPBa+CgCAABB
BAAATAAAAAAAAAAAAAAAAADhGgAAVGVzdENvbW1hbmRGcmFtZXdvcmsvYmlu L3Rlc3Rjb21t
YW5kZnJhbWV3b3JrL1ZpZXckVmlld0NvbnRlbnRQcm92aWRlci5jbGFzc1BL AQIUABQACAAI
AKiJlzbyOW75lAIAAJgFAABKAAAAAAAAAAAAAAAAAIMdAABUZXN0Q29tbWFu ZEZyYW1ld29y
ay9iaW4vdGVzdGNvbW1hbmRmcmFtZXdvcmsvVmlldyRWaWV3TGFiZWxQcm92 aWRlci5jbGFz
c1BLAQIUABQACAAIAKiJlzYkTFxAgwQAAGUKAAA4AAAAAAAAAAAAAAAAAI8g AABUZXN0Q29t
bWFuZEZyYW1ld29yay9iaW4vdGVzdGNvbW1hbmRmcmFtZXdvcmsvVmlldy5j bGFzc1BLAQIU
ABQACAAIAKiJlzacJzCtKQQAAJAIAABFAAAAAAAAAAAAAAAAAHglAABUZXN0 Q29tbWFuZEZy
YW1ld29yay9iaW4vdGVzdGNvbW1hbmRmcmFtZXdvcmsvYWN0aW9ucy9BZGRB Y3Rpb24uY2xh
c3NQSwECFAAUAAgACACoiZc2QzrKma4CAAAyBQAAUwAAAAAAAAAAAAAAAAAU KgAAVGVzdENv
bW1hbmRGcmFtZXdvcmsvYmluL3Rlc3Rjb21tYW5kZnJhbWV3b3JrL2NvbW1h bmRzL0FkZEVu
dHJ5Q29tbWFuZEhhbmRsZXIuY2xhc3NQSwECFAAUAAgACACoiZc2m2cxhkYA AABoAAAAJQAA
AAAAAAAAAAAAAABDLQAAVGVzdENvbW1hbmRGcmFtZXdvcmsvYnVpbGQucHJv cGVydGllc1BL
AQIUABQACAAIAKiJlzY4m2tfggIAAH0CAAAsAAAAAAAAAAAAAAAAANwtAABU ZXN0Q29tbWFu
ZEZyYW1ld29yay9pY29ucy9hbHRfd2luZG93XzE2LmdpZlBLAQIUABQACAAI AKiJlzbX37ua
rQQAAKgEAAAsAAAAAAAAAAAAAAAAALgwAABUZXN0Q29tbWFuZEZyYW1ld29y ay9pY29ucy9h
bHRfd2luZG93XzMyLmdpZlBLAQIUABQACAAIAKiJlzaKDMU5eQEAADYFAAAf AAAAAAAAAAAA
AAAAAL81AABUZXN0Q29tbWFuZEZyYW1ld29yay9wbHVnaW4ueG1sUEsBAhQA FAAIAAgAqImX
Ng6M0nIFAgAARAUAADwAAAAAAAAAAAAAAAAAhTcAAFRlc3RDb21tYW5kRnJh bWV3b3JrL3Ny
Yy90ZXN0Y29tbWFuZGZyYW1ld29yay9BY3RpdmF0b3IuamF2YVBLAQIUABQA CAAIAKiJlzaq
fqvm6AEAAM4EAAA+AAAAAAAAAAAAAAAAAPQ5AABUZXN0Q29tbWFuZEZyYW1l d29yay9zcmMv
dGVzdGNvbW1hbmRmcmFtZXdvcmsvQXBwbGljYXRpb24uamF2YVBLAQIUABQA CAAIAKiJlzYa
4bVZpgEAAPwEAABOAAAAAAAAAAAAAAAAAEg8AABUZXN0Q29tbWFuZEZyYW1l d29yay9zcmMv
dGVzdGNvbW1hbmRmcmFtZXdvcmsvQXBwbGljYXRpb25BY3Rpb25CYXJBZHZp c29yLmphdmFQ
SwECFAAUAAgACACoiZc2X1AWmgUBAABdAgAATgAAAAAAAAAAAAAAAABqPgAA VGVzdENvbW1h
bmRGcmFtZXdvcmsvc3JjL3Rlc3Rjb21tYW5kZnJhbWV3b3JrL0FwcGxpY2F0 aW9uV29ya2Jl
bmNoQWR2aXNvci5qYXZhUEsBAhQAFAAIAAgAqImXNuw0rfE5AQAAhAMAAFQA AAAAAAAAAAAA
AAAA6z8AAFRlc3RDb21tYW5kRnJhbWV3b3JrL3NyYy90ZXN0Y29tbWFuZGZy YW1ld29yay9B
cHBsaWNhdGlvbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YVBLAQIUABQA CAAIAKiJlzat
hjZf7AAAAKcBAAA+AAAAAAAAAAAAAAAAAKZBAABUZXN0Q29tbWFuZEZyYW1l d29yay9zcmMv
dGVzdGNvbW1hbmRmcmFtZXdvcmsvUGVyc3BlY3RpdmUuamF2YVBLAQIUABQA CAAIAKiJlzZS
e0B3dwMAANQLAAA3AAAAAAAAAAAAAAAAAP5CAABUZXN0Q29tbWFuZEZyYW1l d29yay9zcmMv
dGVzdGNvbW1hbmRmcmFtZXdvcmsvVmlldy5qYXZhUEsBAhQAFAAIAAgAqImX NsFDHSYkAgAA
9QQAAEQAAAAAAAAAAAAAAAAA2kYAAFRlc3RDb21tYW5kRnJhbWV3b3JrL3Ny Yy90ZXN0Y29t
bWFuZGZyYW1ld29yay9hY3Rpb25zL0FkZEFjdGlvbi5qYXZhUEsBAhQAFAAI AAgAqImXNpDT
gjiJAQAARAMAAFIAAAAAAAAAAAAAAAAAcEkAAFRlc3RDb21tYW5kRnJhbWV3 b3JrL3NyYy90
ZXN0Y29tbWFuZGZyYW1ld29yay9jb21tYW5kcy9BZGRFbnRyeUNvbW1hbmRI YW5kbGVyLmph
dmFQSwUGAAAAAB0AHQBJDAAAeUsAAAAA
--------------030903070308000005020806--
Re: Design-Question regarding Actions and th UI [message #466640 is a reply to message #466638] Mon, 23 April 2007 11:19 Go to previous messageGo to next message
Eclipse UserFriend
Hi,

by the way the menu-extension point is the new standard way to add
things to menus, toolbars, ... . But using Actions is not wrong and when
runing on 3.2 you are forced to use this mechanism.

Tom

Tom Schindl schrieb:
> Hi,
>
> that's what I demonstrated for you in the Action which I added manually
> to the ToolBar.
>
> Isn't is enough for you to just copy the contents to your
> toolseye.vehiclemanagement.actions.NewVehicleAction class?
>
> Eventually this code has to be executed:
>
>> ICommandService service =
>> (ICommandService)PlatformUI.getWorkbench().getService(IComma ndService.class);
>>
>> Command cmd = service.getCommand(AddEntryCommandHandler.ID);
>> EvaluationContext context = new
>> EvaluationContext(null,ISources.ACTIVE_WORKBENCH_WINDOW);
>> context.addVariable(ISources.ACTIVE_WORKBENCH_WINDOW+"",
>> PlatformUI.getWorkbench().getActiveWorkbenchWindow());
>> ExecutionEvent evt = new ExecutionEvent(cmd,new
>> HashMap<String, String>(),null,context);
>> try {
>> cmd.executeWithChecks(evt);
>> } catch (Exception e) {
>> e.printStackTrace();
>> }
>
> I'll attach you the whole RCP-App I used to extract what I posted before.
>
> Tom
Re: Design-Question regarding Actions and th UI [message #466775 is a reply to message #466636] Tue, 24 April 2007 14:12 Go to previous messageGo to next message
Eclipse UserFriend
Marc Schlegel wrote:
> I dont know how to use this menuContribution with an <command...> since
> I am using an actionSet and a popupMenu to extend my New-menu which is
> provided by my main RCP-plugin.
>
> This is a part from my plugin.xml
> ---------------------------------------
> <extension
> point="org.eclipse.ui.actionSets">
> <actionSet
> id="werkstattverwaltung.vehiclemanagement.actionSet"
> label="Action Set"
> visible="true">
> <action
> class="toolseye.vehiclemanagement.actions.NewVehicleAction"
> id="toolseye.vehiclemanagement.action.newvehicleaction"
> label="%newVehicleActionLabel"
> menubarPath="file/new_submenu/new.ext"
> style="push"/>
> </actionSet>
> </extension>
> <extension
> point="org.eclipse.ui.popupMenus">
> <viewerContribution
> id="toolseye.vehiclemanagement.viewerPopUpContribution"
> targetID="toolseye.vehiclemanagement.views.garageexplorer">
> <action
> class="toolseye.vehiclemanagement.actions.NewVehicleAction"
> id="toolseye.vehiclemanagement.action.newvehicleaction"
> label="%newVehicleActionLabel"
> menubarPath="additions"/>
> </viewerContribution>
> ---------------------------------------

Like Tom mentioned, if you are in 3.2 you can continue to use actions.
An actionSets action has access to the IWorkbenchWindow, which means you
can do a window.getActivePage().findView(*) to find your view.

Your popupMenus action should have been given the active part (your
view), no?

In 3.3 you can write thing slightly differently using
org.eclipse.ui.commands to define your command, org.eclipse.ui.handlers
to provide an implementation, and org.eclipse.ui.menus to provide menu
items/toolbar items for your command.


PW
Re: Design-Question regarding Actions and th UI [message #466828 is a reply to message #466775] Wed, 25 April 2007 05:55 Go to previous messageGo to next message
Eclipse UserFriend
Thanks to you all, it was very helpfull. I already migrated to 3.3 M6 :-)

Paul Webster schrieb:
> Like Tom mentioned, if you are in 3.2 you can continue to use actions.
> An actionSets action has access to the IWorkbenchWindow, which means you
> can do a window.getActivePage().findView(*) to find your view.
>
> Your popupMenus action should have been given the active part (your
> view), no?
>
> In 3.3 you can write thing slightly differently using
> org.eclipse.ui.commands to define your command, org.eclipse.ui.handlers
> to provide an implementation, and org.eclipse.ui.menus to provide menu
> items/toolbar items for your command.
>
>
> PW
Re: Design-Question regarding Actions and th UI [message #466835 is a reply to message #466828] Wed, 25 April 2007 09:17 Go to previous messageGo to next message
Eclipse UserFriend
One final question :-)

In 3.2 I created a submenu "New" in the File-menu and added a group as a
placeholder ( *new Separator(NEW_GROUP)* ) for contribution and I used
it from my plugin.xml with

*menubarPath="file/new_submenu/new.ext"*

In 3.3 there is this locationURI for example menu:file which is actually
more easy to understand *thumbs up*. But how can I
contribute now to my placeholder? I tried menu:file:new_ext (where
new_ext is my placeholder)

Thanks again.
Re: Design-Question regarding Actions and th UI [message #466925 is a reply to message #466835] Thu, 26 April 2007 10:11 Go to previous messageGo to next message
Eclipse UserFriend
If you've added a submenu to file with the ID new_submenu (and the
groupmarker in new_submenu), then your locationURI would be:

menu:new_submenu?after=new.ext

PW
Re: Design-Question regarding Actions and th UI [message #467561 is a reply to message #466775] Mon, 07 May 2007 08:41 Go to previous message
Eclipse UserFriend
What does this mean for the ActionBarContributor interface and using the
contributorClass element of the editor extension point? How does this
still fit in?

Do you handle more sophisticated enablement and disenablement in this
class now and handle (more than before) creating actions and menus etc.
in the XML directly?


Paul Webster wrote:
> Marc Schlegel wrote:
>> I dont know how to use this menuContribution with an <command...> since
>> I am using an actionSet and a popupMenu to extend my New-menu which is
>> provided by my main RCP-plugin.
>>
>> This is a part from my plugin.xml
>> ---------------------------------------
>> <extension
....

>> label="%newVehicleActionLabel"
>> menubarPath="additions"/>
>> </viewerContribution>
>> ---------------------------------------
>
> Like Tom mentioned, if you are in 3.2 you can continue to use actions.
> An actionSets action has access to the IWorkbenchWindow, which means you
> can do a window.getActivePage().findView(*) to find your view.
>
> Your popupMenus action should have been given the active part (your
> view), no?
>
> In 3.3 you can write thing slightly differently using
> org.eclipse.ui.commands to define your command, org.eclipse.ui.handlers
> to provide an implementation, and org.eclipse.ui.menus to provide menu
> items/toolbar items for your command.
>
>
> PW
Previous Topic:How to create a palette ?
Next Topic:Database Access from a RCP Application.
Goto Forum:
  


Current Time: Fri May 16 23:54:48 EDT 2025

Powered by FUDForum. Page generated in 0.05627 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top