[mapguide-commits] r4916 - in sandbox/maestro-2.5: Generated Maestro.Base Maestro.Base/Commands Maestro.Base/Editor Maestro.Base/Services Maestro.Base/UI Maestro.Editors Maestro.Editors/Common Maestro.Editors/FeatureSource Maestro.Editors/FeatureSource/Providers Maestro.Editors/Generic Maestro.Editors/Properties Maestro.Shared.UI MaestroAPITests MaestroBaseTests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/Capability OSGeo.MapGuide.MaestroAPI/Commands OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Resource OSGeo.MapGuide.MaestroAPI/Resource/Conversion OSGeo.MapGuide.MaestroAPI.Http

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu May 20 19:28:36 EDT 2010


Author: jng
Date: 2010-05-20 19:28:34 -0400 (Thu, 20 May 2010)
New Revision: 4916

Added:
   sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.cs
   sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.resx
   sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.cs
   sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.resx
   sandbox/maestro-2.5/Maestro.Editors/EditorBase.cs
   sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/
   sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
   sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.resx
   sandbox/maestro-2.5/Maestro.Shared.UI/WaitCursor.cs
Removed:
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.resx
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.resx
Modified:
   sandbox/maestro-2.5/Generated/FeatureSource-1.0.0.designer.cs
   sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceAsCommand.cs
   sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceCommand.cs
   sandbox/maestro-2.5/Maestro.Base/Editor/EditorContentBase.cs
   sandbox/maestro-2.5/Maestro.Base/Editor/IEditorViewContent.cs
   sandbox/maestro-2.5/Maestro.Base/Editor/ResourceEditorService.cs
   sandbox/maestro-2.5/Maestro.Base/Editor/XmlEditor.cs
   sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin
   sandbox/maestro-2.5/Maestro.Base/Services/OpenResourceManager.cs
   sandbox/maestro-2.5/Maestro.Base/UI/RepositoryTreeModel.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.cs
   sandbox/maestro-2.5/Maestro.Editors/IEditorService.cs
   sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj
   sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs
   sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs
   sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj
   sandbox/maestro-2.5/MaestroAPITests/CapabilityTests.cs
   sandbox/maestro-2.5/MaestroAPITests/ResourceTests.cs
   sandbox/maestro-2.5/MaestroBaseTests/EditorTests.cs
   sandbox/maestro-2.5/MaestroBaseTests/MaestroBaseTests.csproj
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/DrawingSource.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LoadProcedure.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceItems.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolDefinition.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolLibrary.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/UntypedResource.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/WebLayout.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/IResourceConverter.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceConverter.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceUpgrader.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceIdentifier.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceTypeDescriptor.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs
   sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
Log:
This submission includes the following changes:
 - Modify most of the APIs so that when working with resource types, that we use the ResourceTypes enumeration instead of strings.
 - Change IEditorViewContent and child editor controls to use a more fleshed out IEditorService, which provides the following services.
   - Dirty state notification
   - Upload/Download/Deletion/Listing of resource data
   - Pre-save hooks.
   - Isolated resource editing
     - Copy target resource to session repository and work off the session copy
     - When saving, copy the session resource back to the target resource
     - This way, the only time the target resource is ever changed, is when the save button is hit.
   - Long story short, we can now modify and save resources (and resource data) with the generic xml editor.
 - Modify the generic XML editor to hook into this dirty state notification
 - Fixed the Maestro API unit tests which broke as a result of string -> ResourceTypes conversion. Maestro Base tests are still broken from the IEditorViewContent changes. These will be fixed at a later revision.

Modified: sandbox/maestro-2.5/Generated/FeatureSource-1.0.0.designer.cs
===================================================================
--- sandbox/maestro-2.5/Generated/FeatureSource-1.0.0.designer.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Generated/FeatureSource-1.0.0.designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -167,7 +167,8 @@
                 }
             }
         }
-        
+
+        [XmlIgnore] //HACK: Disable and only worry about it if the schema is revved
         public ExtendedDataType ExtendedData1 {
             get {
                 return this.extendedData1Field;
@@ -437,7 +438,8 @@
                 }
             }
         }
-        
+
+        [XmlIgnore] //HACK: Disable and only worry about it if the schema is revved
         public ExtendedDataType ExtendedData1 {
             get {
                 return this.extendedData1Field;
@@ -897,7 +899,8 @@
                 }
             }
         }
-        
+
+        [XmlIgnore] //HACK: Disable and only worry about it if the schema is revved
         public ExtendedDataType ExtendedData1 {
             get {
                 return this.extendedData1Field;
@@ -1276,6 +1279,7 @@
             }
         }
         
+        [XmlIgnore] //HACK: Disable and only worry about it if the schema is revved
         public ExtendedDataType ExtendedData1 {
             get {
                 return this.extendedData1Field;
@@ -1543,7 +1547,8 @@
                 }
             }
         }
-        
+
+        [XmlIgnore] //HACK: Disable and only worry about it if the schema is revved
         public ExtendedDataType ExtendedData1 {
             get {
                 return this.extendedData1Field;
@@ -1794,7 +1799,8 @@
                 }
             }
         }
-        
+
+        [XmlIgnore] //HACK: Disable and only worry about it if the schema is revved
         public ExtendedDataType ExtendedData1 {
             get {
                 return this.extendedData1Field;
@@ -2091,7 +2097,8 @@
                 }
             }
         }
-        
+
+        [XmlIgnore] //HACK: Disable and only worry about it if the schema is revved
         public ExtendedDataType ExtendedData1 {
             get {
                 return this.extendedData1Field;

Modified: sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceAsCommand.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceAsCommand.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceAsCommand.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -20,10 +20,15 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using ICSharpCode.Core;
 
 namespace Maestro.Base.Commands
 {
-    internal class SaveResourceAsCommand : NotImplementedCommand
+    internal class SaveResourceAsCommand : AbstractMenuCommand
     {
+        public override void Run()
+        {
+            throw new NotImplementedException();
+        }
     }
 }

Modified: sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceCommand.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceCommand.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Commands/SaveResourceCommand.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -20,10 +20,25 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using ICSharpCode.Core;
+using Maestro.Base.Editor;
+using Maestro.Shared.UI;
 
 namespace Maestro.Base.Commands
 {
-    internal class SaveResourceCommand : NotImplementedCommand
+    internal class SaveResourceCommand : AbstractMenuCommand
     {
+        public override void Run()
+        {
+            var wb = Workbench.Instance;
+            var ed = wb.ActiveDocumentView as IEditorViewContent;
+            if (ed != null)
+            {
+                using (new WaitCursor(wb))
+                {
+                    ed.EditorService.Save();
+                }
+            }
+        }
     }
 }

Modified: sandbox/maestro-2.5/Maestro.Base/Editor/EditorContentBase.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Editor/EditorContentBase.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Editor/EditorContentBase.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -7,6 +7,7 @@
 using System.Windows.Forms;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Editors;
 
 namespace Maestro.Base.Editor
 {
@@ -23,41 +24,56 @@
             private set { upgradePanel.Visible = value; }
         }
 
-        private IResource _resource;
+        private IEditorService _svc;
 
-        public IResource Resource
+        public IEditorService EditorService
         {
             get
             {
-                return _resource;
+                return _svc;
             }
             set
             {
-                _resource = value;
-                this.Title = ResourceIdentifier.GetName(_resource.ResourceID);
-                this.Description = _resource.ResourceID;
-                this.Connection = _resource.CurrentConnection;
-                Bind(value);
+                _svc = value;
+                _svc.DirtyStateChanged += new EventHandler(OnDirtyStateChanged);
+
+                this.Resource = _svc.GetEditedResource();
+                this.Title = ResourceIdentifier.GetName(_svc.ResourceID);
+                this.Description = _svc.ResourceID;
+                this.CanUpgrade = _svc.IsUpgradeAvailable;
+
+                Bind(_svc);
             }
         }
 
-        protected virtual void Bind(IResource value) { }
+        const string DIRTY_PREFIX = "* ";
 
-        private IServerConnection _conn;
-
-        public IServerConnection Connection
+        void OnDirtyStateChanged(object sender, EventArgs e)
         {
-            get
+            if (_svc.IsDirty)
             {
-                return _conn;
+                if (!this.Title.StartsWith(DIRTY_PREFIX))
+                    this.Title = DIRTY_PREFIX + this.Title;
             }
-            set
+            else
             {
-                _conn = value;
-                this.CanUpgrade = _conn.Capabilities.GetMaxSupportedResourceVersion(_resource.ResourceType) > _resource.ResourceVersion;
+                if (this.Title.StartsWith(DIRTY_PREFIX))
+                    this.Title = this.Title.Substring(1);
             }
         }
 
+        public IResource Resource { get; private set; }
+
+        /// <summary>
+        /// Binds the specified resource to this control. This effectively initializes
+        /// all the fields in this control and sets up databinding on all fields.
+        /// </summary>
+        /// <param name="value"></param>
+        protected virtual void Bind(IEditorService service) 
+        {
+            throw new NotImplementedException();
+        }
+
         private static ResourceTypes[] PREVIEWABLE_RESOURCE_TYPES = new ResourceTypes[] 
         {
             ResourceTypes.FeatureSource,
@@ -74,7 +90,7 @@
                 var res = this.Resource;
                 if (res != null)
                 {
-                    var rt = (ResourceTypes)Enum.Parse(typeof(ResourceTypes), res.ResourceType);
+                    var rt = res.ResourceType;
                     return Array.IndexOf(PREVIEWABLE_RESOURCE_TYPES, rt) >= 0 && res.CurrentConnection.Capabilities.SupportsResourcePreviews;
                 }
                 return false;

Modified: sandbox/maestro-2.5/Maestro.Base/Editor/IEditorViewContent.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Editor/IEditorViewContent.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Editor/IEditorViewContent.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -22,6 +22,7 @@
 using System.Text;
 using OSGeo.MapGuide.MaestroAPI;
 using OSGeo.MapGuide.MaestroAPI.Resource;
+using Maestro.Editors;
 
 namespace Maestro.Base.Editor
 {
@@ -30,12 +31,12 @@
         /// <summary>
         /// Gets or sets the current resource being edited
         /// </summary>
-        IResource Resource { get; set; }
+        IEditorService EditorService { get; set; }
 
         /// <summary>
-        /// Gets or sets the current connection
+        /// Gets the current resource being edited
         /// </summary>
-        IServerConnection Connection { get; set; }
+        IResource Resource { get; }
 
         /// <summary>
         /// Indicates whether this current resource can be upgraded.

Modified: sandbox/maestro-2.5/Maestro.Base/Editor/ResourceEditorService.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Editor/ResourceEditorService.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Editor/ResourceEditorService.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -23,37 +23,61 @@
 using Maestro.Editors;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using Maestro.Base.Services;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI;
+using Maestro.Editors.Generic;
+using System.ComponentModel;
+using System.IO;
 
 namespace Maestro.Base.Editor
 {
     public class ResourceEditorService : IEditorService
     {
-        private IResource _resource;
         private IUrlLauncherService _launcher;
+        private IServerConnection _conn;
 
-        public ResourceEditorService(IResource res, bool isNew, IUrlLauncherService launcher)
+        private IResource _editCopy;
+
+        public ResourceEditorService(string resourceID, IServerConnection conn, IUrlLauncherService launcher)
         {
-            this.IsNew = isNew;
-            _resource = res;
+            this.IsNew = ResourceIdentifier.IsSessionBased(resourceID);
+            this.ResourceID = resourceID;
+            _conn = conn;
             _launcher = launcher;
-            _resource.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(OnResourcePropertyChanged);
         }
 
-        void OnResourcePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+        public event EventHandler DirtyStateChanged;
+
+        public string EditExpression(string currentExpr, OSGeo.MapGuide.MaestroAPI.FeatureSourceDescription.FeatureSourceSchema schema, string providerName, string featureSourceId)
         {
-            this.IsDirty = true;
-            var handler = this.DirtyStateChanged;
-            if (handler != null)
+            throw new NotImplementedException();
+        }
+
+        public IResource GetEditedResource()
+        {
+            if (_editCopy == null)
             {
-                handler(this, EventArgs.Empty);
+                string copy = _conn.GenerateSessionResourceId(ResourceIdentifier.GetResourceType(this.ResourceID));
+
+                _conn.ResourceService.CopyResource(this.ResourceID, copy, true);
+
+                _editCopy = _conn.ResourceService.GetResource(copy);
+                _editCopy.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(OnResourcePropertyChanged);
             }
+            return _editCopy;
         }
 
-        public event EventHandler DirtyStateChanged;
+        void OnResourcePropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+        {
+            this.IsDirty = true;
+            OnDirtyStateChanged();
+        }
 
-        public string EditExpression(string currentExpr, OSGeo.MapGuide.MaestroAPI.FeatureSourceDescription.FeatureSourceSchema schema, string providerName, string featureSourceId)
+        void OnDirtyStateChanged()
         {
-            throw new NotImplementedException();
+            var handler = this.DirtyStateChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
         }
 
         public bool IsDirty
@@ -73,29 +97,138 @@
             _launcher.OpenUrl(url);
         }
 
-        public IResource Resource
+        public string ResourceID { get; private set; }
+
+        public string SelectAnyResource()
         {
-            get { return _resource; }
+            var picker = new ResourcePicker(_conn.ResourceService);
+            if (picker.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                return picker.ResourceID;
+            }
+            return string.Empty;
         }
 
-        public string[] SelectMultipleResources(OSGeo.MapGuide.MaestroAPI.ResourceTypes resType)
+        public string SelectResource(OSGeo.MapGuide.MaestroAPI.ResourceTypes resType)
         {
-            throw new NotImplementedException();
+            var picker = new ResourcePicker(_conn.ResourceService, resType);
+            if (picker.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                return picker.ResourceID;
+            }
+            return string.Empty;
         }
 
-        public string SelectResource(OSGeo.MapGuide.MaestroAPI.ResourceTypes[] resTypes)
+        public string SelectFolder()
         {
-            throw new NotImplementedException();
+            var picker = new ResourcePicker(_conn.ResourceService);
+            picker.SelectFoldersOnly = true;
+            if (picker.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                return picker.ResourceID;
+            }
+            return string.Empty;
         }
 
-        public string SelectResource(OSGeo.MapGuide.MaestroAPI.ResourceTypes resType)
+        public string SelectUnmanagedData(string startPath, System.Collections.Specialized.NameValueCollection fileTypes)
         {
             throw new NotImplementedException();
         }
 
-        public string SelectUnmanagedData(string startPath, System.Collections.Specialized.NameValueCollection fileTypes)
+        public void Save()
         {
-            throw new NotImplementedException();
+            if (!OnBeforeSave())
+            {
+                //_conn.ResourceService.SaveResourceAs(_editCopy, this.ResourceID);
+                _conn.ResourceService.CopyResource(this.EditedResourceID, this.ResourceID, true);
+
+                this.IsDirty = false;
+                OnDirtyStateChanged();
+            }
         }
+
+        public void SaveAs(string resourceID)
+        {
+            if (ResourceIdentifier.IsSessionBased(resourceID))
+                throw new ArgumentException("Resource ID must not be session-based"); //LOCALIZE
+
+            if (!OnBeforeSave())
+            {
+                _conn.ResourceService.SaveResourceAs(_editCopy, resourceID);
+                this.ResourceID = resourceID;
+                this.IsNew = false;
+                this.IsDirty = false;
+                OnDirtyStateChanged();
+            }
+        }
+
+        public bool IsUpgradeAvailable
+        {
+            get 
+            {
+                if (_editCopy == null)
+                    return false;
+                return _conn.Capabilities.GetMaxSupportedResourceVersion(_editCopy.ResourceType) > _editCopy.ResourceVersion;
+            }
+        }
+
+
+        public OSGeo.MapGuide.ObjectModels.Common.ResourceDataList EnumerateResourceData()
+        {
+            return _conn.ResourceService.EnumerateResourceData(_editCopy.ResourceID);
+        }
+
+        public void AddResourceData(string dataName, OSGeo.MapGuide.ObjectModels.Common.ResourceDataType type, System.IO.Stream stream)
+        {
+            _conn.ResourceService.SetResourceData(_editCopy.ResourceID, dataName, type, stream);
+            this.IsDirty = true;
+            OnDirtyStateChanged();
+        }
+
+        public System.IO.MemoryStream GetResourceData(string dataName)
+        {
+            return _conn.ResourceService.GetResourceData(_editCopy.ResourceID, dataName);
+        }
+
+        public void RemoveResourceData(string dataName)
+        {
+            _conn.ResourceService.DeleteResourceData(_editCopy.ResourceID, dataName);
+            OnDirtyStateChanged();
+        }
+
+        public string EditedResourceID
+        {
+            get { return _editCopy.ResourceID; }
+        }
+
+        public void RegisterCustomNotifier(INotifyResourceChanged irc)
+        {
+            irc.ResourceChanged += (sender, e) =>
+            {
+                this.IsDirty = true;
+                OnDirtyStateChanged();
+            };
+        }
+
+
+        public void UpdateResourceContent(string xml)
+        {
+            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
+            {
+                _conn.ResourceService.SetResourceXmlData(this.EditedResourceID, ms);
+            }
+        }
+
+        private bool OnBeforeSave()
+        {
+            var e = new CancelEventArgs();
+            var handler = this.BeforeSave;
+            if (handler != null)
+                handler(this, e);
+
+            return e.Cancel;
+        }
+
+        public event System.ComponentModel.CancelEventHandler BeforeSave;
     }
 }

Modified: sandbox/maestro-2.5/Maestro.Base/Editor/XmlEditor.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Editor/XmlEditor.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Editor/XmlEditor.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -30,6 +30,7 @@
 using ICSharpCode.Core;
 using OSGeo.MapGuide.MaestroAPI;
 using System.Xml;
+using Maestro.Editors;
 
 namespace Maestro.Base.Editor
 {
@@ -84,12 +85,22 @@
             warnings = warn.ToArray();
         }
 
-        protected override void Bind(OSGeo.MapGuide.MaestroAPI.Resource.IResource value)
+        protected override void Bind(IEditorService service)
         {
-            //HACK: Scrub out junk <ExtendedData1> elements.
-            editor.XmlContent = value.Serialize().Replace("<ExtendedData1 />", "");
+            service.RegisterCustomNotifier(editor);
+            service.BeforeSave += new CancelEventHandler(OnBeforeSave);
+            editor.Bind(service);
+            editor.ReadyForEditing(); //This turns on event broadcasting
+            this.Title = "XML Editor: " + ResourceIdentifier.GetName(this.EditorService.ResourceID); //LOCALIZE
+        }
 
-            this.Title = "XML Editor: " + ResourceIdentifier.GetName(value.ResourceID); //LOCALIZE
+        void OnBeforeSave(object sender, CancelEventArgs e)
+        {
+            //Because we're working with raw XML, we need to save the XML back to our session
+            //copy first before the save operation starts
+            this.EditorService.UpdateResourceContent(this.XmlContent);
+            
+            e.Cancel = false;
         }
 
         public string XmlContent

Modified: sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Maestro.Base.addin	2010-05-20 23:28:34 UTC (rev 4916)
@@ -145,11 +145,11 @@
         <ToolbarItem id="Save"
                      icon="disk"
                      tooltip="${res:Menu_File_SaveResource}"
-                     class="Maestro.Base.Commands.NotImplementedCommand" />
+                     class="Maestro.Base.Commands.SaveResourceCommand" />
         <ToolbarItem id="SaveAs"
                      icon="disk__arrow"
                      tooltip="${res:Menu_File_SaveResourceAs}"
-                     class="Maestro.Base.Commands.NotImplementedCommand" />
+                     class="Maestro.Base.Commands.SaveResourceAsCommand" />
         <ToolbarItem id="Preview"
                      icon="document_search_result"
                      tooltip="${res:Menu_File_PreviewResource}"

Modified: sandbox/maestro-2.5/Maestro.Base/Services/OpenResourceManager.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/Services/OpenResourceManager.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/Services/OpenResourceManager.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -59,7 +59,9 @@
                 }
 
                 var ed = svc.OpenContent<XmlEditor>(ViewRegion.Document);
-                ed.Resource = res;
+                var launcher = ServiceRegistry.GetService<UrlLauncher>();
+                var editorSvc = new ResourceEditorService(item.ResourceId, conn, launcher);
+                ed.EditorService = editorSvc;
                 _openItems[item.ResourceId] = ed;
                 ed.ViewContentClosing += (sender, e) =>
                 {

Modified: sandbox/maestro-2.5/Maestro.Base/UI/RepositoryTreeModel.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Base/UI/RepositoryTreeModel.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Base/UI/RepositoryTreeModel.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -51,7 +51,7 @@
 
         public string ResourceType
         {
-            get { return _item.ResourceType; }
+            get { return _item.ResourceType.ToString(); }
         }
 
         public string Owner
@@ -80,23 +80,23 @@
             {
                 switch (_item.ResourceType)
                 {
-                    case "DrawingSource":
+                    case ResourceTypes.DrawingSource:
                         return Properties.Resources.blueprints;
-                    case "FeatureSource":
+                    case ResourceTypes.FeatureSource:
                         return Properties.Resources.database_share;
-                    case "Folder":
+                    case ResourceTypes.Folder:
                         return Properties.Resources.folder_horizontal;
-                    case "LayerDefinition":
+                    case ResourceTypes.LayerDefinition:
                         return Properties.Resources.layer;
-                    case "MapDefinition":
+                    case ResourceTypes.MapDefinition:
                         return Properties.Resources.map;
-                    case "WebLayout":
+                    case ResourceTypes.WebLayout:
                         return Properties.Resources.application_browser;
-                    case "ApplicationDefinition":
+                    case ResourceTypes.ApplicationDefinition:
                         return Properties.Resources.applications_stack;
-                    case "SymbolLibrary":
+                    case ResourceTypes.SymbolLibrary:
                         return Properties.Resources.images_stack;
-                    case "PrintLayout":
+                    case ResourceTypes.PrintLayout:
                         return Properties.Resources.printer;
                     default:
                         return Properties.Resources.document;
@@ -140,9 +140,9 @@
             {
                 var it = new RepositoryItem(item);
                 if (it.IsFolder)
-                    folders.Add(it.Name, it);
+                    folders.Add(it.ResourceId, it);
                 else
-                    docs.Add(it.Name, it);
+                    docs.Add(it.ResourceId, it);
             }
             foreach (var folder in folders.Values)
             {

Added: sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,117 @@
+namespace Maestro.Editors.Common
+{
+    partial class ResourceDataCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.grdDataFiles = new System.Windows.Forms.DataGridView();
+            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
+            this.btnAdd = new System.Windows.Forms.ToolStripButton();
+            this.btnDelete = new System.Windows.Forms.ToolStripButton();
+            this.btnDownload = new System.Windows.Forms.ToolStripButton();
+            ((System.ComponentModel.ISupportInitialize)(this.grdDataFiles)).BeginInit();
+            this.toolStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // grdDataFiles
+            // 
+            this.grdDataFiles.AllowUserToAddRows = false;
+            this.grdDataFiles.AllowUserToDeleteRows = false;
+            this.grdDataFiles.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.grdDataFiles.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grdDataFiles.Location = new System.Drawing.Point(0, 25);
+            this.grdDataFiles.Name = "grdDataFiles";
+            this.grdDataFiles.ReadOnly = true;
+            this.grdDataFiles.Size = new System.Drawing.Size(453, 185);
+            this.grdDataFiles.TabIndex = 3;
+            this.grdDataFiles.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.grdDataFiles_CellClick);
+            this.grdDataFiles.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.grdDataFiles_CellContentClick);
+            // 
+            // toolStrip1
+            // 
+            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.btnAdd,
+            this.btnDelete,
+            this.btnDownload});
+            this.toolStrip1.Location = new System.Drawing.Point(0, 0);
+            this.toolStrip1.Name = "toolStrip1";
+            this.toolStrip1.Size = new System.Drawing.Size(453, 25);
+            this.toolStrip1.TabIndex = 2;
+            this.toolStrip1.Text = "toolStrip1";
+            // 
+            // btnAdd
+            // 
+            this.btnAdd.Image = global::Maestro.Editors.Properties.Resources.document__plus;
+            this.btnAdd.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnAdd.Name = "btnAdd";
+            this.btnAdd.Size = new System.Drawing.Size(49, 22);
+            this.btnAdd.Text = "Add";
+            this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
+            // 
+            // btnDelete
+            // 
+            this.btnDelete.Image = global::Maestro.Editors.Properties.Resources.document__minus;
+            this.btnDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDelete.Name = "btnDelete";
+            this.btnDelete.Size = new System.Drawing.Size(60, 22);
+            this.btnDelete.Text = "Delete";
+            this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
+            // 
+            // btnDownload
+            // 
+            this.btnDownload.Image = global::Maestro.Editors.Properties.Resources.drive_download;
+            this.btnDownload.ImageTransparentColor = System.Drawing.Color.Magenta;
+            this.btnDownload.Name = "btnDownload";
+            this.btnDownload.Size = new System.Drawing.Size(81, 22);
+            this.btnDownload.Text = "Download";
+            this.btnDownload.Click += new System.EventHandler(this.btnDownload_Click);
+            // 
+            // ResourceDataCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Controls.Add(this.grdDataFiles);
+            this.Controls.Add(this.toolStrip1);
+            this.Name = "ResourceDataCtrl";
+            this.Size = new System.Drawing.Size(453, 210);
+            ((System.ComponentModel.ISupportInitialize)(this.grdDataFiles)).EndInit();
+            this.toolStrip1.ResumeLayout(false);
+            this.toolStrip1.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.DataGridView grdDataFiles;
+        private System.Windows.Forms.ToolStrip toolStrip1;
+        private System.Windows.Forms.ToolStripButton btnDelete;
+        private System.Windows.Forms.ToolStripButton btnDownload;
+        private System.Windows.Forms.ToolStripButton btnAdd;
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,187 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.ObjectModels.Common;
+using System.IO;
+using Maestro.Shared.UI;
+
+namespace Maestro.Editors.Common
+{
+    public partial class ResourceDataCtrl : UserControl
+    {
+        public ResourceDataCtrl()
+        {
+            InitializeComponent();
+        }
+
+        public event EventHandler DataListChanged;
+
+        private void EvaluateCommands()
+        {
+            btnAdd.Enabled = (_edSvc != null);
+            btnDelete.Enabled = (_edSvc != null && this.SelectedItem != null);
+            btnDownload.Enabled = (_edSvc != null && this.SelectedItem != null);
+        }
+
+        private IEditorService _edSvc;
+
+        private BindingList<ResourceDataListResourceData> _data;
+
+        private ResourceDataListResourceData SelectedItem
+        {
+            get
+            {
+                if (grdDataFiles.SelectedRows.Count == 1)
+                {
+                    return grdDataFiles.SelectedRows[0].DataBoundItem as ResourceDataListResourceData;
+                }
+                return null;
+            }
+        }
+
+        protected override void OnLoad(EventArgs e)
+        {
+            EvaluateCommands();
+        }
+
+        private string _resourceID;
+
+        public void Init(IEditorService service)
+        {
+            _edSvc = service;
+            _resourceID = service.EditedResourceID;
+
+            LoadResourceData();
+
+            EvaluateCommands();
+        }
+
+        private void LoadResourceData()
+        {
+            var list = _edSvc.EnumerateResourceData();
+            _data = list.ResourceData;
+
+            grdDataFiles.DataSource = _data;
+            grdDataFiles.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+        }
+
+        private void btnAdd_Click(object sender, EventArgs e)
+        {
+            using (var open = new OpenFileDialog())
+            {
+                if (open.ShowDialog() == DialogResult.OK)
+                {
+                    using (new WaitCursor(this))
+                    {
+                        try
+                        {
+                            using (var fs = new FileStream(open.FileName, FileMode.Open))
+                            {
+                                _edSvc.AddResourceData(Path.GetFileName(open.FileName), ResourceDataType.File, fs);
+                                LoadResourceData();
+                                OnDataListChanged();
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+                            MessageBox.Show(ex.Message);
+                        }
+                    }
+                }
+            }
+        }
+
+        private void OnDataListChanged()
+        {
+            var handler = this.DataListChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        private void btnDelete_Click(object sender, EventArgs e)
+        {
+            var item = this.SelectedItem;
+            if (item != null)
+            {
+                try
+                {
+                    using (new WaitCursor(this))
+                    {
+                        _edSvc.RemoveResourceData(item.Name);
+                        _data.Remove(item);
+                        OnDataListChanged();
+                    }
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show(ex.Message);
+                }
+            }
+        }
+
+        private void btnDownload_Click(object sender, EventArgs e)
+        {
+            var item = this.SelectedItem;
+            if (item != null)
+            {
+                using (var save = new SaveFileDialog())
+                {
+                    if (save.ShowDialog() == DialogResult.OK)
+                    {
+                        try
+                        {
+                            using (new WaitCursor(this))
+                            {
+                                var stream = _edSvc.GetResourceData(item.Name);
+                                File.WriteAllBytes(save.FileName, stream.GetBuffer());
+                            }
+                            MessageBox.Show(Properties.Resources.FileDownloaded);
+                        }
+                        catch (Exception ex)
+                        {
+                            MessageBox.Show(ex.Message);
+                        }
+                    }
+                }
+            }
+        }
+
+        private void grdDataFiles_CellContentClick(object sender, DataGridViewCellEventArgs e)
+        {
+            grdDataFiles.ClearSelection();
+            grdDataFiles.Rows[e.RowIndex].Selected = true;
+            EvaluateCommands();
+        }
+
+        private void grdDataFiles_CellClick(object sender, DataGridViewCellEventArgs e)
+        {
+            grdDataFiles.ClearSelection();
+            grdDataFiles.Rows[e.RowIndex].Selected = true;
+            EvaluateCommands();
+        }
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.resx	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Common/ResourceDataCtrl.resx	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file

Copied: sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.Designer.cs (from rev 4913, sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.Designer.cs)
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.Designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,266 @@
+namespace Maestro.Editors.Generic
+{
+    partial class ResourcePicker
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ResourcePicker));
+            this.trvFolders = new Aga.Controls.Tree.TreeViewAdv();
+            this.nodeIcon1 = new Aga.Controls.Tree.NodeControls.NodeIcon();
+            this.nodeTextBox1 = new Aga.Controls.Tree.NodeControls.NodeTextBox();
+            this.lstResources = new System.Windows.Forms.ListView();
+            this.resImageList = new System.Windows.Forms.ImageList(this.components);
+            this.btnOK = new System.Windows.Forms.Button();
+            this.btnCancel = new System.Windows.Forms.Button();
+            this.label1 = new System.Windows.Forms.Label();
+            this.lblFilter = new System.Windows.Forms.Label();
+            this.txtResourceId = new System.Windows.Forms.TextBox();
+            this.cmbResourceFilter = new System.Windows.Forms.ComboBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label4 = new System.Windows.Forms.Label();
+            this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+            this.splitContainer1.Panel1.SuspendLayout();
+            this.splitContainer1.Panel2.SuspendLayout();
+            this.splitContainer1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // trvFolders
+            // 
+            this.trvFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.trvFolders.BackColor = System.Drawing.SystemColors.Window;
+            this.trvFolders.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.trvFolders.DefaultToolTipProvider = null;
+            this.trvFolders.DragDropMarkColor = System.Drawing.Color.Black;
+            this.trvFolders.LineColor = System.Drawing.SystemColors.ControlDark;
+            this.trvFolders.LoadOnDemand = true;
+            this.trvFolders.Location = new System.Drawing.Point(12, 31);
+            this.trvFolders.Model = null;
+            this.trvFolders.Name = "trvFolders";
+            this.trvFolders.NodeControls.Add(this.nodeIcon1);
+            this.trvFolders.NodeControls.Add(this.nodeTextBox1);
+            this.trvFolders.SelectedNode = null;
+            this.trvFolders.Size = new System.Drawing.Size(168, 237);
+            this.trvFolders.TabIndex = 0;
+            this.trvFolders.Text = "treeViewAdv1";
+            this.trvFolders.SelectionChanged += new System.EventHandler(this.trvFolders_SelectionChanged);
+            // 
+            // nodeIcon1
+            // 
+            this.nodeIcon1.DataPropertyName = "Icon";
+            this.nodeIcon1.LeftMargin = 1;
+            this.nodeIcon1.ParentColumn = null;
+            this.nodeIcon1.ScaleMode = Aga.Controls.Tree.ImageScaleMode.Clip;
+            // 
+            // nodeTextBox1
+            // 
+            this.nodeTextBox1.DataPropertyName = "Name";
+            this.nodeTextBox1.IncrementalSearchEnabled = true;
+            this.nodeTextBox1.LeftMargin = 3;
+            this.nodeTextBox1.ParentColumn = null;
+            // 
+            // lstResources
+            // 
+            this.lstResources.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.lstResources.LargeImageList = this.resImageList;
+            this.lstResources.Location = new System.Drawing.Point(3, 31);
+            this.lstResources.MultiSelect = false;
+            this.lstResources.Name = "lstResources";
+            this.lstResources.Size = new System.Drawing.Size(348, 237);
+            this.lstResources.SmallImageList = this.resImageList;
+            this.lstResources.TabIndex = 1;
+            this.lstResources.UseCompatibleStateImageBehavior = false;
+            this.lstResources.View = System.Windows.Forms.View.List;
+            this.lstResources.SelectedIndexChanged += new System.EventHandler(this.lstResources_SelectedIndexChanged);
+            // 
+            // resImageList
+            // 
+            this.resImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("resImageList.ImageStream")));
+            this.resImageList.TransparentColor = System.Drawing.Color.Transparent;
+            this.resImageList.Images.SetKeyName(0, "document.png");
+            this.resImageList.Images.SetKeyName(1, "database-share.png");
+            this.resImageList.Images.SetKeyName(2, "layer.png");
+            this.resImageList.Images.SetKeyName(3, "map.png");
+            this.resImageList.Images.SetKeyName(4, "application-browser.png");
+            this.resImageList.Images.SetKeyName(5, "images-stack.png");
+            this.resImageList.Images.SetKeyName(6, "printer.png");
+            this.resImageList.Images.SetKeyName(7, "blueprints.png");
+            this.resImageList.Images.SetKeyName(8, "applications-stack.png");
+            // 
+            // btnOK
+            // 
+            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnOK.Enabled = false;
+            this.btnOK.Location = new System.Drawing.Point(382, 317);
+            this.btnOK.Name = "btnOK";
+            this.btnOK.Size = new System.Drawing.Size(75, 23);
+            this.btnOK.TabIndex = 2;
+            this.btnOK.Text = "OK";
+            this.btnOK.UseVisualStyleBackColor = true;
+            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.btnCancel.Location = new System.Drawing.Point(463, 317);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(75, 23);
+            this.btnCancel.TabIndex = 3;
+            this.btnCancel.Text = "Cancel";
+            this.btnCancel.UseVisualStyleBackColor = true;
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+            // 
+            // label1
+            // 
+            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(12, 291);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(67, 13);
+            this.label1.TabIndex = 4;
+            this.label1.Text = "Resource ID";
+            // 
+            // lblFilter
+            // 
+            this.lblFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+            this.lblFilter.AutoSize = true;
+            this.lblFilter.Location = new System.Drawing.Point(12, 317);
+            this.lblFilter.Name = "lblFilter";
+            this.lblFilter.Size = new System.Drawing.Size(29, 13);
+            this.lblFilter.TabIndex = 5;
+            this.lblFilter.Text = "Filter";
+            // 
+            // txtResourceId
+            // 
+            this.txtResourceId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtResourceId.Location = new System.Drawing.Point(85, 288);
+            this.txtResourceId.Name = "txtResourceId";
+            this.txtResourceId.ReadOnly = true;
+            this.txtResourceId.Size = new System.Drawing.Size(453, 20);
+            this.txtResourceId.TabIndex = 6;
+            // 
+            // cmbResourceFilter
+            // 
+            this.cmbResourceFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.cmbResourceFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+            this.cmbResourceFilter.FormattingEnabled = true;
+            this.cmbResourceFilter.Location = new System.Drawing.Point(85, 314);
+            this.cmbResourceFilter.Name = "cmbResourceFilter";
+            this.cmbResourceFilter.Size = new System.Drawing.Size(255, 21);
+            this.cmbResourceFilter.TabIndex = 7;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(9, 9);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(41, 13);
+            this.label3.TabIndex = 8;
+            this.label3.Text = "Folders";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(3, 9);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(98, 13);
+            this.label4.TabIndex = 9;
+            this.label4.Text = "Resources in folder";
+            // 
+            // splitContainer1
+            // 
+            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Top;
+            this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+            this.splitContainer1.Name = "splitContainer1";
+            // 
+            // splitContainer1.Panel1
+            // 
+            this.splitContainer1.Panel1.Controls.Add(this.label3);
+            this.splitContainer1.Panel1.Controls.Add(this.trvFolders);
+            // 
+            // splitContainer1.Panel2
+            // 
+            this.splitContainer1.Panel2.Controls.Add(this.lstResources);
+            this.splitContainer1.Panel2.Controls.Add(this.label4);
+            this.splitContainer1.Size = new System.Drawing.Size(550, 282);
+            this.splitContainer1.SplitterDistance = 183;
+            this.splitContainer1.TabIndex = 10;
+            // 
+            // ResourcePicker
+            // 
+            this.AcceptButton = this.btnOK;
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.CancelButton = this.btnCancel;
+            this.ClientSize = new System.Drawing.Size(550, 352);
+            this.ControlBox = false;
+            this.Controls.Add(this.splitContainer1);
+            this.Controls.Add(this.cmbResourceFilter);
+            this.Controls.Add(this.txtResourceId);
+            this.Controls.Add(this.lblFilter);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.btnCancel);
+            this.Controls.Add(this.btnOK);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Name = "ResourcePicker";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "Select Resource";
+            this.splitContainer1.Panel1.ResumeLayout(false);
+            this.splitContainer1.Panel1.PerformLayout();
+            this.splitContainer1.Panel2.ResumeLayout(false);
+            this.splitContainer1.Panel2.PerformLayout();
+            this.splitContainer1.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private Aga.Controls.Tree.TreeViewAdv trvFolders;
+        private System.Windows.Forms.ListView lstResources;
+        private System.Windows.Forms.Button btnOK;
+        private System.Windows.Forms.Button btnCancel;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Label lblFilter;
+        private System.Windows.Forms.TextBox txtResourceId;
+        private System.Windows.Forms.ComboBox cmbResourceFilter;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label4;
+        private Aga.Controls.Tree.NodeControls.NodeIcon nodeIcon1;
+        private Aga.Controls.Tree.NodeControls.NodeTextBox nodeTextBox1;
+        private System.Windows.Forms.ImageList resImageList;
+        private System.Windows.Forms.SplitContainer splitContainer1;
+    }
+}
\ No newline at end of file

Copied: sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.cs (from rev 4913, sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.cs)
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,353 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using Aga.Controls.Tree;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.ObjectModels.Common;
+using System.Security.AccessControl;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+
+namespace Maestro.Editors.Generic
+{
+    /// <summary>
+    /// A generic dialog for selecting folders or resource documents
+    /// </summary>
+    public partial class ResourcePicker : Form
+    {
+        const int RES_UNKNOWN = 0;
+        const int RES_FEATURESOURCE = 1;
+        const int RES_LAYERDEFINITION = 2;
+        const int RES_MAPDEFINITION = 3;
+        const int RES_WEBLAYOUT = 4;
+        const int RES_SYMBOLLIBRARY = 5;
+        const int RES_PRINTLAYOUT = 6;
+        const int RES_DRAWINGSOURCE = 7;
+        const int RES_APPLICATIONDEFINITION = 8;
+
+        private ResourceTypes[] _resTypes;
+
+        private ResourcePicker()
+        {
+            InitializeComponent();
+            _resTypes = new ResourceTypes[] 
+            {
+                ResourceTypes.ApplicationDefinition,
+                ResourceTypes.DrawingSource,
+                ResourceTypes.FeatureSource,
+                ResourceTypes.Folder,
+                ResourceTypes.LayerDefinition,
+                ResourceTypes.LoadProcedure,
+                ResourceTypes.MapDefinition,
+                ResourceTypes.PrintLayout,
+                ResourceTypes.SymbolDefinition,
+                ResourceTypes.SymbolLibrary,
+                ResourceTypes.WebLayout
+            };
+            cmbResourceFilter.DataSource = _resTypes;
+        }
+
+        private IResourceService _resSvc;
+
+        private bool _resourceMode = false;
+
+        /// <summary>
+        /// Constructs a new instance. Use this overload to select any resource type. If only
+        /// folder selection is desired, set <see cref="SelectFoldersOnly"/> to true before
+        /// showing the dialog
+        /// </summary>
+        /// <param name="resSvc"></param>
+        public ResourcePicker(IResourceService resSvc)
+            : this()
+        {
+            _resSvc = resSvc;
+            trvFolders.Model = new RepositoryFolderTreeModel(_resSvc);
+            this.UseFilter = true;
+        }
+
+        /// <summary>
+        /// Constructs a new instance. Use this overload to select only resources of a specific type.
+        /// You cannot select folders in this mode. Attempting to set <see cref="SelectFoldersOnly"/> to
+        /// true will throw an <see cref="InvalidOperationException"/>
+        /// </summary>
+        /// <param name="resSvc"></param>
+        /// <param name="resFilter"></param>
+        public ResourcePicker(IResourceService resSvc, ResourceTypes resFilter)
+            : this(resSvc)
+        {
+            this.Filter = resFilter;
+            this.UseFilter = true;
+
+            _resourceMode = true;
+            cmbResourceFilter.Enabled = false;
+        }
+
+        /// <summary>
+        /// Gets or sets the resource filter. If a filter value is specified, browsing
+        /// is locked to that particular resource type, otherwise al 
+        /// </summary>
+        public ResourceTypes Filter
+        {
+            get { return (ResourceTypes)cmbResourceFilter.SelectedItem; }
+            set
+            {
+                if (Array.IndexOf<ResourceTypes>(_resTypes, value) < 0)
+                    throw new InvalidOperationException("Cannot use specified resource type as filter: " + value); //LOCALIZE
+
+                cmbResourceFilter.SelectedItem = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets whether to use a resource filter. If set to false, when selecting a folder
+        /// all resource types are returned, otherwise only children of the specified type are returned
+        /// </summary>
+        internal bool UseFilter
+        {
+            get { return cmbResourceFilter.Visible; }
+            set 
+            {
+                if (value && this.SelectFoldersOnly)
+                    throw new InvalidOperationException("Cannot specify a filter when SelectFoldersOnly is true"); //LOCALIZE
+                cmbResourceFilter.Visible = value; lblFilter.Visible = value; 
+            }
+        }
+        
+        /// <summary>
+        /// Gets or sets whether to select folders only. If true, the document view is disabled and 
+        /// <see cref="UseFilter"/> is set to false
+        /// </summary>
+        public bool SelectFoldersOnly
+        {
+            get { return splitContainer1.Panel2Collapsed; }
+            set 
+            {
+                if (_resourceMode && value)
+                    throw new InvalidOperationException("Cannot specify to select folders when dialog is initialized with a resource filter"); //LOCALIZE
+
+                if (value)
+                    this.UseFilter = false;
+
+                splitContainer1.Panel2Collapsed = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets the resource id of the selected item
+        /// </summary>
+        public string ResourceID
+        {
+            get { return txtResourceId.Text; }
+        }
+
+        private void btnCancel_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.Cancel;
+        }
+
+        private void btnOK_Click(object sender, EventArgs e)
+        {
+            this.DialogResult = DialogResult.OK;
+        }
+
+        private void trvFolders_SelectionChanged(object sender, EventArgs e)
+        {
+            var node = trvFolders.SelectedNode;
+            if (node != null)
+            {
+                RepositoryFolder folder = node.Tag as RepositoryFolder;
+                btnOK.Enabled = false;
+                if (this.SelectFoldersOnly)
+                {
+                    txtResourceId.Text = folder.ResourceId;
+                    btnOK.Enabled = true;
+                }
+                else
+                {
+                    ResourceList list = null;
+                    if (!this.UseFilter)
+                        list = _resSvc.GetRepositoryResources(folder.ResourceId, 1);
+                    else
+                        list = _resSvc.GetRepositoryResources(folder.ResourceId, this.Filter.ToString(), 1);
+
+                    PopulateDocumentList(list);
+                }
+            }
+        }
+
+        private void PopulateDocumentList(ResourceList list)
+        {
+            lstResources.Clear();
+            foreach (var item in list.Items)
+            {
+                var doc = item as ResourceListResourceDocument;
+                if (doc != null)
+                {
+                    var li = new ListViewItem(doc.Name);
+                    li.Tag = doc;
+
+                    try
+                    {
+                        var rt = ResourceIdentifier.GetResourceType(doc.ResourceId);
+                        switch (rt)
+                        {
+                            case ResourceTypes.ApplicationDefinition:
+                                li.ImageIndex = RES_APPLICATIONDEFINITION;
+                                break;
+                            case ResourceTypes.DrawingSource:
+                                li.ImageIndex = RES_DRAWINGSOURCE;
+                                break;
+                            case ResourceTypes.FeatureSource:
+                                li.ImageIndex = RES_FEATURESOURCE;
+                                break;
+                            case ResourceTypes.LayerDefinition:
+                                li.ImageIndex = RES_LAYERDEFINITION;
+                                break;
+                            case ResourceTypes.MapDefinition:
+                                li.ImageIndex = RES_MAPDEFINITION;
+                                break;
+                            case ResourceTypes .PrintLayout:
+                                li.ImageIndex = RES_PRINTLAYOUT;
+                                break;
+                            case ResourceTypes.SymbolLibrary:
+                                li.ImageIndex = RES_SYMBOLLIBRARY;
+                                break;
+                            case ResourceTypes.WebLayout:
+                                li.ImageIndex = RES_WEBLAYOUT;
+                                break;
+                            default:
+                                li.ImageIndex = RES_UNKNOWN;
+                                break;
+                        }
+                    }
+                    catch
+                    {
+                        li.ImageIndex = RES_UNKNOWN;
+                    }
+
+                    lstResources.Items.Add(li);
+                }
+            }
+        }
+
+        private void lstResources_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            btnOK.Enabled = false;
+            if (lstResources.SelectedItems.Count == 1)
+            {
+                var item = lstResources.SelectedItems[0];
+                var doc = item.Tag as ResourceListResourceDocument;
+                if (doc != null)
+                {
+                    txtResourceId.Text = doc.ResourceId;
+                    btnOK.Enabled = true;
+                }
+            }
+        }
+    }
+
+    internal class RepositoryFolder
+    {
+        private IRepositoryItem _item;
+
+        public RepositoryFolder(IRepositoryItem item)
+        {
+            _item = item;
+        }
+
+        public string Name { get { return _item.Name; } }
+
+        public string ResourceId { get { return _item.ResourceId; } }
+
+        public bool HasChildren { get { return _item.HasChildren; } }
+
+        public Image Icon
+        {
+            get { return Properties.Resources.folder_horizontal; }
+        }
+    }
+
+    internal class RepositoryFolderTreeModel : ITreeModel
+    {
+        private IResourceService _resSvc;
+
+        public RepositoryFolderTreeModel(IResourceService resSvc)
+        {
+            _resSvc = resSvc;
+        }
+
+        private System.Collections.IEnumerable GetSorted(ResourceList list)
+        {
+            //Sort them before returning them
+            SortedList<string, RepositoryFolder> folders = new SortedList<string, RepositoryFolder>();
+            foreach (var item in list.Children)
+            {
+                if (item.IsFolder)
+                    folders.Add(item.Name, new RepositoryFolder(item));
+            }
+            foreach (var folder in folders.Values)
+            {
+                yield return folder;
+            }
+        }
+
+        public System.Collections.IEnumerable GetChildren(TreePath treePath)
+        {
+            if (treePath.IsEmpty())
+            {
+                var list = _resSvc.GetRepositoryResources("Library://", ResourceTypes.Folder.ToString(), 1);
+                return GetSorted(list);
+            }
+            else
+            {
+                var node = treePath.LastNode as RepositoryFolder;
+                if (node.HasChildren)
+                {
+                    var list = _resSvc.GetRepositoryResources(node.ResourceId, 1);
+                    return GetSorted(list);
+                }
+                else
+                {
+                    return new RepositoryFolder[0];
+                }
+            }
+        }
+
+        public bool IsLeaf(TreePath treePath)
+        {
+            return !((RepositoryFolder)treePath.LastNode).HasChildren;
+        }
+
+        public event EventHandler<TreeModelEventArgs> NodesChanged;
+
+        public event EventHandler<TreeModelEventArgs> NodesInserted;
+
+        public event EventHandler<TreeModelEventArgs> NodesRemoved;
+
+        public event EventHandler<TreePathEventArgs> StructureChanged;
+    }
+
+}

Copied: sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.resx (from rev 4913, sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.resx)
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.resx	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Common/ResourcePicker.resx	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,711 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="resImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="resImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADQ
+        EQAAAk1TRnQBSQFMAgEBCQEAAWABAAFgAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAAfAIBwG8Af81AAG8
+        CPMBvAH/NQAB8AH0BvMB9AHwNgAB8AH/BvQB/wG8A/8zAAHxCP8BkgIHAfAzAAHwAgcD7wL3AZIB7ALz
+        AbwzAAHxAfAB8QHwAbwBBwO8Ae8B8wH0AfAzAAH0AfIB8QXvAQcB8gH0Af8BvAP/MwAB8Qj/AZICBwHw
+        MwAB8AIHA+8C9wGSAewC8wG8MwAB8QHwAfEB8AG8AQcDvAHvAfMB9AHwMwAB9AHyAfEF7wEHAfIB9AH/
+        AfA2AAHxCP8B8TYAAfACBwPvAvcBkgG8NgAB8QHwAfEB8AG8AQcDvAHxNgAB9AHyBvEB8gH0QAAM/wcA
+        AbwIBwG8AwAB9AG1CLQBtQH0BAAQ/wG8CgcBvAQAA/8BBwj/AQcE/wG0AdwBGQTbAQkB3AG0Af8EAAG8
+        Au8MrgG1AbwB/wj0Af8BBwL/AgABBwPvAfIBswEJAbsCbAGLAfID7wEHAQABtAIZAQkBGQIJARkBCQG0
+        Bf8BBwHzAfIBiwmzAdUBrQGRAbwB9AQqATABNwEwASoB9AHsAQcBvAIAAwcK6gMHAQABtAHbAgkB2wEJ
+        AdsBCQHbAa0DtAG1AfQBvAHzAfIBiwHbBrMBtALbAbMBtAG8AfQFMQFYATcBMQH0AfcB/wEHAv8BvAEH
+        Ae8BbQLtBuwB6wIHAbwBAAG0AdsBCQHbAdwB2wIJAdsBswHbAQkB3AG0AQABvAHzAfICtAOzArQBugG0
+        AbMB3AHbAbQBvAH/AREBFQFLAVEBeQGgAeUBWAH/AbQB9AHsAQcBvAHwAQcB9wEQCBIBEAGSAe8B8AEA
+        AbQB2wEZAtsB3AHbAQkB2wGzAQkBGQEJAbQBAAG8AfQB8wEJAbMBtAG6AQkBuwG6AQkBGQG6AQkB4QG0
+        AfAB/wFEAUsCWAFZAeUBWQFYAf8BtAH0AfcB/wG8AfEB8AEHAUMBEgcUAUMB5AEHAfEBAAG0AdsCCQPb
+        AQkB2wGzAdsBCQHbAbQBAAHwAfQC8wG0AboBuwIZAgkEGQG0AfAB/wFSB1gB/wHvAf8BSgH0AbwB8wK8
+        ARQBbQIUBBUCFAHvAQcB8wEAAboB2wEZAdsB3ALbAQkB2wGzAgkB2wG0AQAB8AP0AfIBtAG7AQkBGQIJ
+        ARkC4gHcAbsB8AH/CDEB/wEHAf8BUQH0AbwB9AG8AfEB6gHrAW0B6gESARQBFQFDARMB6gIHAfQBAAG6
+        AdsCCQHbAdwB2wEJAdsBswHbAQkB2wG0AQAB8AT/AfMCugMJAhkB2wG6AvAK/wG7Af8BUQH/AbwB/wHw
+        AfMBbQjsAW0B8gHwAf8BAAG6AdsBCQHbAQkB2wOzAa0B2wEJAdsBtAEAAfAG/wEZAtsB1ALbARkB/wHw
+        AfMB8QHvAbwCswG0AbMDtAG7Af8BUQH/AfAB/wHyAfEB9wjrAfcB8QHyAf8BAAG6AQkBGQMJAbQB/wK0
+        AdsBCQHbAboBAAHxDv8B8QIAAfAK/wFRAf8B8AMAAfAB/wL0AvMC8QH0AfAEAALbAQkD2wO0AdwB2wEJ
+        AdsBugEAAfADBwbvA/cCkgG8AgAB8wHxAe8BvAhRAf8B8AMAAfAB/wH0AvMB8QP3AbwEAAEJA9sC1AHV
+        AbQBCQHbA7MBtAEAAfEB8ALxAvACvAIHBbwB8QQAAfAK/wHwAwAB8AH/AvMC8QHvAf8B8AH/CAABugEJ
+        ARkDCQG0Af8B8AH0AQAB9AHyDPEB8gH0BAAB8wrxAfMDAAHxAf8E9AEHAfEB9AkAAtsBCQPbAbQB8AH0
+        JQAB8wbyAfQKAAEJBtsB9AMAAf8B9AG8CgcBvAH0Af8F9AHzAfABHANuARwB8iL/AQAC/wEHCv8BBwL/
+        AhEB7wEHAfABHAFzAXQDmgJ0AZkB8wEAAf8B8wy8AfMB/wG8DQcBvAMAAbwK/wG8AgACZgHyAQcBcwF0
+        AXkCdAJLAXQBmQJ0ARsBAAHxAfAK8gHwAfEBAAEHAf8L9AH/AQcDAAG8CP8B9AH/AbwCAAFmARUB8QGS
+        AZoEdAKaAUsBdAKaAZkBAAHwDPIB8AEAAbwB9AZzAngBHAKZAfQBvAMAAbwH/wL0Af8BvAIAARIBZgHz
+        AfcFmgF0AUsBcwEcAnQBGgEAAfAM8gHwAQABvAH0AXMBHAF4AXMCeAGZARwBnwHDAQgB9AG8AwABvAb/
+        A/QB/wG8AgABrgHqAf8B7wOaAZkBdAFzAZIB7wEHAfABvAIAAfEM8gHxAQABvAH0AXMBHAF4AXMBeAKZ
+        AZgBnwEbAQcB9AG8AwABvAX/BPQB/wG8AgAC6gLxA3QBkwG8AQcB7wEHAbwB8QHwAgAB8QHzC/IB8QEA
+        AbwB9ANzA3gBmAKZAQgBuwH0AbwDAAG8BP8G9AG8BgAB9AHvApIE7AHtAe8B9AIAAfEB8wvyAfEBAAG8
+        Af8BcwN4ApkBnwGZARsBGQG7Af8BvAMAAfAD/wX0AfMB9AHwBgAB8QHyAbwBBwHvAvcB7wG8AfEB8AIA
+        AfED8wnyAfEBAAG8Af8BcwN4ApkBnwGZAfEB3AG6Af8BvAMAAfAC/wX0AvMB9AHwBgAB8QHyAbwBBwHv
+        AvcB7wG8AfIB8AIAAfIG8wfyAQAB8AH/AXMBeAGZAXgBmQGfAcMBCAEJAdwBugH/AfADAAHwAf8F9ALz
+        AfEB9AHwBgAB8QHzAfEB8AG8AgcBvAHwAfMB8AIAAfIB9ArzAfQB8gEAAfAB/wN4A5kBCAK7AroB/wHw
+        AwAB8AH/BPQC8wLxAfQB8AYAAfQB7wKSBOwB7QHvAfQCAAHyAfQK8wH0AfIBAAHwAf8BeAOZAcMBGwHx
+        AbsC3AG6Af8B8AMAAfAB/wP0AvMB8QP3AbwGAAHxAfIBvAEHAe8C9wEHAbwB8gHwAgAB8gH0CvMB9AHy
+        AQAB8AH/AXgDmQHDAcIBCQG6AdwB2wG6Af8B8AMAAfAB/wL0AvMC8QHvAf8B8AH0BgAB8QHyAbwBBwHv
+        AvcBBwG8AfMB8AIAAfMB8gr0AfIB8wEAAfAB/wF4AZgCmQEIArsDugG0Af8B8AMAAfEC/wX0AQcB8QH0
+        BwAB8QHzAfEB8AG8AgcBvAHwAfMB8AIAAf8B8wryAfMB/wEAAfEN/wHxAwAB8wjyAfQIAAHyCfEB8hEA
+        AfMN8gHzAQABQgFNAT4HAAE+AwABKAMAAUADAAEwAwABAQEAAQEFAAGAAQEWAAP/AgABHwcAAR8HAAE/
+        BwABBwcAAQcHAAEHBwABBw4AAeAHAAHgBwAB4AcAAeAHAAH8BwAB/AcAAfwHAAH8BwAC/wEAAQ8B4AEH
+        AQABDwMAAQ8DAAEPAwABAwIAAYAEAAEDAgABgAcAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYA
+        AYABAQYAAYABAQIAAcABAAHgAQcBgAEBAgABwAEAAeABBwGAAQECAAHwAQAB4AEHAfgBAQIAAfABAAHg
+        AQ8B+AEDBP8B4AEfAfgBBwcAAQEDAAEBAwABAQHAAQMCAAGAAQEBAAEBAcABAwIAAYABAQEAAQEBwAED
+        AgABgAEBAQABAQHAAQMBAAEBAYABAQEAAQEBwAEDAQABAQGAAQEBAAEBAcABAwHwAQEBgAEBAQABAQHA
+        AQMB8AEBAYABAQEAAQEBwAEDAfABAQGAAQEBAAEBAcABAwHwAQEBgAEBAQABAQHAAQMB8AEBAYABAQEA
+        AQEBwAEDAfABAQGAAQEBAAEBAcABAwHwAQEBgAEBAQABAQHAAQcB8AEBAYABAQEAAQEBwAEPAfABAQL/
+        AQABAQs=
+</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        AAD8PwAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAATDwgACxsFABgS
+        BwAADhMAARYdACUOCgA2FQ4AKhUUADwQEAAMIwsAGD8GABkkEQARMhUANigIAD8wDgAnIxQANioXAAAd
+        JwAMJy0AAiw6ADYvIQAuOCwANTMvACAwMQBFHhUAQT42ABpQGgAkWQIAI0sQACx0DAA1dwYAK3kYAD5+
+        HwATUC4AJF8kADhcLAAebDsAJX44AGxTGwBCfA4AUkQjAFpXOQABOUgAAkFPAAFDVgASSlYAGndJABdy
+        WQA2Zl4AKn1VAAFVcAA9WGwAEm5hABBzZQAEYXkAGmF5AAlzfQA/YHcAUk1OAHxRUwBRcEMAemZWAExV
+        YwBlYmEAnCwqAJ8wKwCMLzEAnjAwAKQ3KwCjOjYArEEsALJKLAC3US8ArEY3ALJMNQC4VTcAiG83AKtK
+        RQCrUUkAtVdHAK9UUwCyW1kAkXxAAK1kTQC7ZVQAn312ALhmYwC/cGUAu3l3AMVyVwDEeGkAwnx5ADeI
+        BgA3jRMAOJIXADWNKQA4myYAKogzADWYPgA5ozcAQ4sLAEmOEgBViRgATZIYAFaUGQBnmR8AW5ooAFeL
+        OQBmmyUAcZ8qAGiaNwB0oS0AZ6A1AHmmOgAbg18AIYZMADWeQQAkjVQAKptbADmsRwAuoFgAG4ZmAC6D
+        awAklWUAd5NTAHalSgBWgn8AfZ9hAHaZdwCIqTkA/LkeAMyfOADcoygA26k6AOerJgDssS0A/rwnAOKs
+        MwDvuj0A/78wAP7BNwCZnksAmZpWAK+OQgCzkkkAvJ9eAImsRACXsEgAiKhcALi3RQCtrV8AoLlcALK7
+        WQCtmnsAt5pzAIKlZgCapW0AmbhhAJuwfACjoWoAqLFpAKugdwDJoEEA3KxEAN+xTADEt1kA2rFWAOm5
+        TgDnulcAyoVrAMqIdQDQjnoAw5J2ANCQfQDBtmgA1L1tAOi/ZAC6wmgAvMVzAMvDXgD+xkYA/MpXAP/Q
+        XgDHxGcA2sVpANnNdgDpxWkA+8xjAP3QaQDnyXsA8ct3AOzRcwD91HYAAmiIAAd2iAAAbpMAB3GRABp5
+        kwAle4gARWyCAGR6iAAvgpMAR4aBAG6VigB5o5YAup2FAI6nhACYqYUAjKyaALihhwCttYUAurCFAKq4
+        lwC/v58AyImGAMqUiQDUmYgAzZSSANOckwDLo4YAz6yfANillwDfsqMA47+zAKnGgQC9xJ8AxMeMAN3H
+        jADFyZUA2suTAM3UlgDc15MA59OFAPzYhgDv3JsA+9uTAP3hnADLwqQA1sOkANnYpQDWzrQA7d6sAOfG
+        uADs1roA+N+yANfgtQD946cA/ui5ANrSyQDu08MA89zGAPvpxQD56dMA/vHVAP///wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAA2tfX2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxOQkJC
+        QkJERERBRE5ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANdOQkJCSlJc19ra11tSREFEQUbX
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXR0ZQW976/vz39+3t7ff8/vTXT0RERNcAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAE5HT62VaOfsu6mlpIaGpKSoscHt/PNXREFGAAAAAAAAAAAAAAAAAAAAAAAAAADX
+        R0JY02VeXiiOp6SKiIiIiIeFhYWkqer481FBRNcAAAAAAAAAAAAAAAAAAAAAAFhHRdv+nl1jY2Afgry1
+        jY2MjIyJiYiHhYWp6vzXREFXAAAAAAAAAAAAAAAAAAAAVUVL8/jqlx5jeHhkXZS3tY2NjY2MjImDiYeH
+        irz34EZEUQAAAAAAAAAAAAAAAABYR07797+nsF1keHh4ZGWZt7W1jY2NjIyJiYODh4eo9/FXRFcAAAAA
+        AAAAAAAAANdHS/v3u6m2wW5eeHh4eGRdlMG1tY2NjY2MiYmDg4OHu2aVUkFcAAAAAAAAAAAAAEdK8/i7
+        sba2vbpdeHh4eHhkXW7AtrW1jY2MjImJg4ODqGddnU9EAAAAAAAAAAAAUEfe+L+xtry8vexlZHh4eHh4
+        eF5wwbW1jY2NjYyJiYODtmVeXZpGRgAAAAAAAABWBwYXFRERERERERUCCg0jeHh4eHhduLe1oycPDg4O
+        Dg4OEQICAgwICVkAAAAAAAAZAAAAAAAAAAAAAAAAAAAADXh4eHhhasGjAwAAAAAAAAAAAAAAAAAAAEMA
+        AAAAANgZEhISEhISEhISEhISEgUACnV4eHh4XbqQAAQFEhISEhISEhISEhISBUPXAAAAAEvExMTExMTE
+        xMTExMTExMTCMHh4eGRfXbKxMcTExMTExMTExMTExMTExDRGAAAAAEjExMTExMTExMTExMTExMTExXhk
+        ZWWUsuqwxcTFxMTExMTExMTExMTExDpEAAAAq0jExMTExMTExMTExMTExMTFfGQfoeS+u7G7gcXExMTE
+        xMTExMTExMTExMhEWQAAUEj54p/FxMTExMTCMnR3d3l4dQsAAQAAAQGRvLGvnyZ2NsXExMTExMN8YpxO
+        RgAASEz+7b7FxMTExMQ4IWF4eGRkHAAEBAQEBAQQp7e9gl94JcLExMTExMN4ZHFXRAAASFv+7L7FxMTE
+        xMQ3Hl1dXV0fAS3ExMTExMQrKbbqXmR4JcLExMTExMN4ZF3XRAAASK786r7FxMTExMQ3bOPw8PQaK8TE
+        xMTExMTEFE3pXWR4JcTFxMTExMN4eF2tRADZSN746unFxMTExMQ31vj49T4UxMTExMTExMTEwhOSgl94
+        JcLExMTExMN4eF3SRNeuSN/46unFxMTExMTC7vj4mhPCxMTExMTExMTExDcWr2VfJcLExMTExMNfX13S
+        RlyuSN/495XFxMTExMTCleXuGDfExMTExMTExMTExMQzKrlqI8LExMTExMeWgnDdQlzZSN78k17ExMTE
+        xMU3Hm87M8TExMTExMrKxMTExMTEM1OyG8LExMTExMe2wfjeQtcASN7hXV3ExMTExMQ3IB0zxMTExMTE
+        yubjxsXExMTExC6OIzfExMTExMpqamveQgAASdldXV3ExMTExMQ3JSvExMTExMTG5ezq08bExMTExMQi
+        G8LExMTExDldX12tRAAASatlYXXExMTExMQ3K8TExMTExMXV7Orq6s/ExMTExMTCK8LExMTExDlkYWtY
+        RAAATFpvYXjExMTExMTExMTExMTExNHs7Orqwb/MxMTExMTEwsTExMTExMN4X5VPSgAAqlCPXXnFxMTE
+        xMTExMTExMTEe/L37OrqwcG8y8TExMTExMTExMTExMN4XaJKWAAAAEytXWTExMTExMTExMTExMQ2XWVy
+        6+rBwcG9ucfExMTExMTExMTExDlfaK1CAAAAAExUJCLFxMTExMTExMTExDl1ZGFds+rBwby8t6bCxcTE
+        xMTExMTExDkbPU9GAAAAAK04xMTExMTExMTExMTExXl4ZF2T7MHBvby3traPwsTExMTExMTExMTExD9Z
+        AAAAAADExMTExMTExMTExMTEdnh4X3LswcHBwby2trW1fcTExMTExMTExMTExDQAAAAAAADGxMTExMTE
+        xMTExMQlZF1dXenBwemTmcG3tbW1izHExMTExMTExMTExMwAAAAAAAAAPkB/L3p6ejLNgdBoXWVllOrB
+        6WhfXbC3t7W1jYZ9fYB9gICBzck7PAAAAAAAAAAAAElbcl54ZGbqweqZZmVdaerqlF54YWWUu7e1jIyM
+        iYmDibXq+kpHAAAAAAAAAAAAAKtJqm9deF1xuOxyXWFfXXHqaV94eGRfZYK5toyDiYOMter7T0dcAAAA
+        AAAAAAAAAABaTKtvXWRdXWqyXWRhZYLqgl14eHh4ZF9dpo2JjIy16vtVR1UAAAAAAAAAAAAAAAAAWkyq
+        cl1dXV3pal1dmb3Ba2F4eHh4eHhfcLWMjbf3+lBFUAAAAAAAAAAAAAAAAAAAAFpMW9T2aF3pcG24vbe5
+        XXh4eHh4eHhkZbS3wfjfS0dVAAAAAAAAAAAAAAAAAAAAAACqSUzZcl3o7cHBwcFuX3h4eHh4eHh4X4L4
+        +6pHR1sAAAAAAAAAAAAAAAAAAAAAAAAAAExMWtz9+PiYZWhdeHh4eHh4ZGFlZZXeS0dKAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAACsSUlMqvOTXV1dXV9dX2VdZnKdrVVLR1sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAKpMSUxarZuboaCgoZubq1pMS0urAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtMSUlM
+        TExMTExJSEtYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADerKurrNkAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAD///w///8AAP//gAH//wAA//wAAD//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/
+        AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAA
+        AAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+        AACAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAACAAAAAAAEAAIAA
+        AAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAH
+        AADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/g
+        AAAH/wAA//AAAA//AAD//AAAP/8AAP//gAH//wAA///4H///AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
+        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAoIBAAcCwkACRcGABIXBQAAExkAJBsJACQcEwAkIR0AAiYtABkv
+        LgAeMjYAXyIkABxJCwApYw0ANW0SABpPIQANTj4AIGQkACp9NABYRBcARUgxAGpGPwB6YiwAB05VAB9X
+        XgAee0cADWNZAANXawAAV3QALF52ABZmYAADYXgAHm97AAhxegAmbnEASU5FAHlFRQBWe18Af3RLAJws
+        LACfMzIAojUtAKc7LgCpPi8Aozk3AKxCLQCySS4ArEQzAKZBPgCqRDkAr0s7ALJMNAC6VzcAh0hIAINb
+        TgCnRkUAqUZDAKtJQwC4XUkAr1ZWALJbWQCUdE0AvWRNALdhVwC2Yl8AuGVeAKFwXACwdV8AhH9uALZk
+        YgC6amUAumxrAL9wZQC/f2MAtXdrAL5xawCyf2wAvXJwAMFpTADBbFUAw3NYAMBxZADGemQAxHpsAMl+
+        aADCenYAwXt5ADeGAAA3iQYAPIgFADSECAA7gw8AN4oMADuLCwA2jhIAPI4SADiTGAA4miYAKIY0AC+R
+        NQA2mDAANZY/ADabOAA5oC8AOqc+AEWMDABEjBMASIkWAEaRFQBUkxoAV44iAFiXIgBCjDYAYJAiAGad
+        KAB/misAZZ02AHGWOQB5pDUAJIRAADKFQQAql1UAMJ9RADqrRwAuoFkAMaRUACaWYABimkQAfpNAAHSd
+        QQB6mEcAZ4VqAIalNQD7uB4A3KUuAN+sOwDtriMA4KcqAOOqLADxsSEA/rskAP6+LADjqzEA7LQyAP/A
+        MwD/wToAiJlHAImWVwCZnFwApp9HALGQRwCrjF4ArZtWAIyvVQCKtFwAnLZUAKaiTwCmtEkAsrdKAKW3
+        VAC4u1IAs7xZALq6XACaj2EAt4diAJa2ZwCup2YAuK5jAKayYAC/tm4A3K1CAMi7RgDes1UA6rpMAOm9
+        WQDKgGgAy4d0AMOxYADlvGYAxsFZAP7EQgD/x0gA/chLAOzIVwD8ylcAycNhANzGaADJyHMA1sd1AO3A
+        YAD+zmIA/dFrAO3MegD2z3YA6NF4APzUeQACZ4cABXOJABZ2jQAAbpMABHCSAC1rhgA8eYUAPHeQADKB
+        igBSj4wARY2WAGWalQB3oJAAioiKAImpkwClsoQAtreDAMuOigDOkIQA0paFANSZhQDUnI4Ay5GSANKc
+        kwDIqY8A1qGRANmmlgDfsJkA2rymAMnPkQDlyoIA8c+CAOvSgwDz1IIA/taDAPXVigD+2owA69mWAPTX
+        kwD62pIA+dyZANvLpQDnwawA6MSpAOzJqwDk3KkA6siwAPLXtwD23bMA9t67AO/hpwD74qYA/eSsAP7m
+        sgD75roA/ei4AOHbxAD+68EA////AAAAAAAAAAAAAAAAAAAAV0hIVwAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAEwqKjpCTExBOSgoSAAAAAAAAAAAAAAAAAAAAAAAAEAyRN32+evk5Oj49d89KDwAAAAAAAAAAAAA
+        AAAAANwrTINgb7Krj4+Li4eIr+zwPSjbAAAAAAAAAAAAAABULN77XGZna6G1kpGRjo2Jiq7t2ihIAAAA
+        AAAAAAAAVDDv7LNyfHx8bru1kpKRjo6NjI/C4ThIAAAAAAAAANww7+ivuaJhfHxpbbS5kpKRjo2NhpCF
+        lDHbAAAAAAAALt/svr+/5mF8fHx8YaG5tZKRjo2NjXRdpCkAAAAAABYCCAcGBwYHAwMQfHx8bcCrFAYG
+        BgYGBAMDAjYAAAAABwUFBQUFBQUFBQFjfHxonxcBBQUFBQUFBQUFDAAAAFPIyMjIyMjIyMjIxXtpYmGf
+        p8XIyMjIyMjIyMgeRgAAL8jIyMjIyMjIyMjGe2yp48Oqx8jIyMjIyMjIyMopAAAv/dXJyMjIIWN9fnwN
+        AAEAAZe+vXF6IMjIyMl+gDgA2j/+5MnIyMgbYWFhDgkcHB0cCq26YXwcyMjIxnxtRtaxsPrkycjIyB/i
+        8u4LxcjIyMjFFaNiaSDIyMjJfGFLTlOx+eTJyMjIy/v1JCDIyMjIyMggJ3BlHMjIycZiYU1GU7H7m8jI
+        yMgjpkUdyMjIyMjIyMgcmXIcyMjJx6ycV0exsaZeycjIyBsPHMjIyMjT0cjIyMgZkxzIyMnHhZxXTN6w
+        XmHJyMjIHBjIyMjI0OzozsjIyMgRHMjIycZhbUTbAE9ufMjIyMjFycjIyM/r7ObBzcjIyMXFyMjJxnx1
+        MwAANYFnyMjIyMjIyMgipurpxMS7x8jIyMjIyMnGYpQsAABTPhLIyMjIyMjIyWRhcOnEwL+oyMjIyMjI
+        yckOQ0IAAADFyMjIyMnJych6fGG8xMS/ubmUyMjIyMjJyMgeAAAAAMnIyMjIycnIGmhhnMTkosK5t7Um
+        yMjIyMnJyMwAAAAAADeEeH951NVwXlrD53NhhcC3kpCdnZad1NIlAAAAAAAA2U92aGGg6HdhYYW9YXxi
+        bZ64kY2NjsDxNNcAAAAAAAAAsFF2YV1tnGFhnsNefHx8aG23jpHA8TNEAAAAAAAAAAAAsE+Vm168bp+/
+        n2J8fHx8Yp+57OA0UwAAAAAAAAAAAAAA2TWld/fpu7RufHx8fHxoc/VULtcAAAAAAAAAAAAAAAAAAE81
+        sfF1WV1iYmFhcJOYND8AAAAAAAAAAAAAAAAAAAAAAABTNU+lpZmYpaVPNVIAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAANmwUVGw2gAAAAAAAAAAAAAAAAD//D///8AD//8AAP/8AAA/+AAAH/AAAA/gAAAH4AAAB8AA
+        AAPAAAADgAAAAYAAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AA
+        AAPgAAAH4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP///gf/ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
+        AAAAAAAAAAEAAAABAAAAAAAABg8DAAQMDAAXCAYAGQkJAAkQBAAHFggAGxQEABASCAAaFQoAGxgUADs1
+        HgANNT0ACD07ABpNIAAiQCUAVEEWAHRpPAAARV0ACVJWABBeUgATZ08AD2BSABJhXwAaZF8AHnFdAB16
+        WwAicEwALmVdAC92WgAIVW0AF1poAANYcgAAXXoAD2liAAxqbAAHbXkAD3x8AHBMVgB3WlcAWVpgAKM9
+        PQCvSjwAsE08AI5OUgCZV1MAp0VFAKlIRwCsTksAs1hPALleSwCvVFMAr1ZWALJaVwCyW1kAs11ZALVf
+        XACYYV4AlWpbAJF7UAC9YEIAs3hPAK5mVQC3YFUAu2VTALBrVwC2YFgAtWBdALR1VQC6bGkAoHNkALxx
+        bwC+c3AAwGlKAMJuVADDcFcAwnBYAMZ6ZgDJfGQAyH9rADSGCAA5kRUAOZQaADWMJQAzjysAN5cnADqX
+        IAA4mSMANpgsADmfLgAxjD4ALpI7ADSaNgA3nj0AOaEyADegOAA5pTsAOqg/AECLCgBBhxAATpMWAEaX
+        HwBLlh4ATJUfAFSWHQBEmCIASpkiAFGbJABcmiMAZ54pAGWbNQBumD0AdZI5AHKRPQB4kT0AZqAsAH2k
+        LwBmoDUAKpFGAC+YRQAxmkEAOqtEADOjTgA5rEgAfotFAHiTRABshFsAU4t/AICpPAC8pz8A1a45AO+x
+        JADxsiIA/rshAPu6KAD+vigA/78tAOauMgDirDQA4a04APi+OAD+wDEA/sE1AP/COgD+wjwAjodCAI+I
+        RgCMhk8Ajo5MAJKATgCUjUsAjJNKAIyTUgCwgVUAgKNCAIGtTgCSrkQAmK9DAI+wVQCNsFgAoqZKALyn
+        QACrtkoAtbZCAKK2UgC3vFUAiYJsAJeZYACSnm4Ao6NnAKSzYgCnu2UAuLlkALy0aAC3t3oAtbl8ANWx
+        SADhsEQA5rZMAMqAagDKiXwAzIx+AMu3YADEvWgA1rxpALvAYADNwFAA18RZAP7FRADyx04A/slOAOLF
+        VADkx1kA78RbAPfKVwD/zFIA9MVbAM7FZQDXy3UA7sNgAOvDZADpx28A/s5jAPXPaAD6z20A8813APDK
+        eADyzn4A/tRyAPrUewAAY4MAD22FAAFtjwALe4UAA3KMAA10jQASdY4AAG6TAARwkwAMdJMALHmAACJ7
+        jAB9n4MAaJKQAJ6OhwCPrJcApLOMALm6gwCyu5MAiK67AMuQjgDRmoUA1JqJANafkQDYoI0A26aPANyp
+        jwDfrI0Aw7aJAN2rkADkuJQA5ryWAOO3nADlu58A6L6YAM7KhwDPxo0A7NOBAPLThAD91oEA89SIAPvZ
+        jgDsyqwA/uOhAP3kuAD///8AAAAAAAAAAAAAAEhDOEcAAAAAAAAAAAAAAAAAAAAAADFDte/w8O+1MC8A
+        AAAAAAAAAAAAAAA/QXFuuLGLiouyz/A4MwAAAAAAAAAAACvq9VNdZ7+PjoiIg4rN5ykAAAAAAAAAK/LP
+        yGV7YWzAvI+IiIWEx6cuAAAAAABA6s/Hypxhe3tpu7yPjYiFjWOTMwAAAAADCgkHCQgGDnthc8cQBwcH
+        BwEFBAAAACcSEhISEhISDXt7UrYMEhISEhISEiwAACjZ2dnZ2dnZ1Viat8nd2dnZ2dnZ2SYA6ef22dnZ
+        GXd6VAYCAgvBrFsj2dnZd5XmT/P42dnZG5ufD9LZ2SERnWEi2dnWYXxFTPz429nZ3/6mIdnZ2dkglFYi
+        2dnWXn04S/ye2dnZHage2dnb29nZH6AW2dnYuu41s6lQ2dnZFRPZ2dvk4tnZ2RwU2dnXZJhF6pFf2dnZ
+        IdnZ2eH7+d7Z2dkh2dnWXpXmAD1V2dnZ2dnZGqv70cx/2dnZ2dnWUj8AADoX2dnZ2dklYGf30MrH3NnZ
+        2dnZGC0AAOXZ2dnZ2SRfUcbRxcq+sNPZ2dnZ2QAAAABGfnZa46piaPmAVqLCj4Khoa3gOQAAAAAASXFX
+        baRSUbloYV5ro4iIw/QrAAAAAAAAAEmXdZxsostpe3t7ar3Q7ysAAAAAAAAAAABLma79pXRhe3thUq5N
+        MgAAAAAAAAAAAAAAADxOlnFvb3KSRDIAAAAAAAAAAAAAAAAAAAAA6E5LS03oAAAAAAAAAAAA/8P/AP4A
+        fwD4AB8A8AAPAOAABwDAAAMAwAADAIAAAQCAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABAIAA
+        AQCAAAMAwAADAOAABwDwAA8A+AAfAP4AfwD/gf8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
+        AAAAAQAAAAEAAAAAAAAEFQ8ABRQQAA0WEAASFxAAERgVABEZGAAuHx4AAis4AAQsOABEIiQAH10nACFe
+        IQBsViIAHX1UACN5RQA8eE0AP31QAARdbwAEX3MAB1p0ABFdcAAZfWAANWxsACNldwB+e0AAp2pPAKx6
+        SwC4ZV4Au35dALVuZgC6amcAu29qAL1wbwC/dHAAvnV0AMh8ZgDIfmkAwHh0AD2VIgA4miUAP5okADSa
+        NgAykzkAOqAxADmjNABRlR0ARZkoAFqCOgBDnT0AYoA6AHSXOgBAoDIAS6EwAFShMABfpDIAWKA3AGKh
+        LwB2pDQAfqo+ACCHVgA4okEAOqlBADqsRgA6rUgAGoZrAECTTQBvgkwAdJZBAHeQZABgjnoAgYw/AIyq
+        MgCDrD4Akaw/ALurLgDTrjcA8rQmAP67IgD+vi0A/8E2APbAPgD/wjsAg45JAKePSgCKrkAAhalKAJ60
+        SwCerlQAobJDAKS0SQC5t0QArrZXALGRewCWtmEAqqxwALy9eADStEkA7r1OAOu+WgDrv14AyoFqAMqC
+        bgDKh3QAzIt0AMmHfADPjHgAz5V2ANeefwDcp3cA3qV5AO3FTwD2xUkA/spSAM/IcwDpymUA6ctoAPLH
+        aQDrxHEA7dJ7AP7TdAACb44AFWqKABtsigADcY4AAG6SAARukAAAb5QAAnGRAAxzkAARdpQAHnuSACN+
+        kwCGpYwAxYOEAMyMggDTloIA2qKCAMC1kQDNwoQA1MmSAOTHggDqw5UA9tuZAOLUogAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///wAAAAAAAAAiHx8hAAAAAAAAAAAAABpTjWRkdm0cAAAAAAAAh2xYPTlwUE9NYmuG
+        AAAAAIl1cyw/N29ST05LGQAAAAcGBQUBC0BVDQQEAwIKAAB9fX19fUE3XEZ9fX19egBmkH19DyoMCAhU
+        VhZ9gDEiJY+Af4WKFH19FTMOfYAoHmZefX0RGH2Eg30XEX2BWiBqJ319FICCjIuBfRR9gC8mADB9gH+A
+        QnJ4X319fX0yAAB9fX9/PDZ3dHFFfX19ewAAAEMrYC46VzVbUUxhXQAAAACIRy47WUlAP0hxbmkAAAAA
+        AAAbjkooLDREJQAAAAAAAAAAAABqHR1nAAAAAAAA/D8AAPAPAADAAwAAwAMAAIABAACAAQAAAAAAAAAA
+        AAAAAAAAAAAAAIABAACAAQAAwAMAAMADAADwDwAA/D8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChMSsCoDErHKAwK0ifLytqny8rgZ4uK4yeLiuMnS0qgZ0t
+        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
+        K/83jg//O61I/zuuSf87rkn/Oq1I/zmgMP84iAT/mLBG//zUcv//ylD//8VC///DPv//wjr//8E2///A
+        Mv//vy7//74p//+9Jf//vCH//7sf//e2H//mqyf/6cJr/0uOEf+HpFv/slxb/5wsLP+bKiqWAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq0ArVatAK/2tRDH/6Me5/v7mrv7ux3L/6Lta/vnI
+        Wv/+zFv+/tBm/t7Pev43hwL/OqtE/jqtSP47rkn/Oq1I/jqtSP46pTr/N4oI/mydKP7s0XP//spR/v7G
+        RP7/xED//sI7/v7BN/7/wDL//r8u/v++Kf/+vCX+/rsh/v+7Hf/8uR7+67tN/lWJGP83hgH+mqVt/qtN
+        TP+bKir9mysrVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACINCIVrEEs56xBLP/Xo5b//+u9//PO
+        fP/rvl///Mtf///OYf//zmP//9Bn//zbjv8+iQb/OqY6/zuuSf87rkn/O65J/zuuSf87rkn/OqpD/zeP
+        Ef9zoS3//tR0///IS///x0X//8RB///CPP//wTf//8Ay//+/Lf//vSj//7wk//+7IP//ux7/+8xW/0GB
+        CP82jR3/PYoI/6+be/+jPDz/mikp54YkJBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeJBiXNhUO/iUO
+        Cv41My//Ni8h/jIpFv40KhT/NiwV/jYsFf82LBb+Ni0Z/jMuH/4MHQD/DCML/hEyFf4gXyj/NqFD/jqt
+        SP47rkn/Oq1I/jqpQf43iQX/xcNl/v7OXv7+x0v/zJ84/mxTG/4/MA7/NikL/jYoCv82KAn+NigI/jYo
+        B/82KAb+NisS/g4dAf8LHwr+Cx0C/hkkEf8qFRT+PBAQ/ockJJcAAAAAAAAAAAAAAAAAAAAAAAAAAIEz
+        IyJBGRD5AAAA/gAAAP4AAAD/AAAA/gAAAP4AAAD/AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD/AAAA/gAA
+        AP4AAAD/ETMV/jinRv47rkn/Oq1I/jqtSP45miX/Ypoi/v3We/7JoEH/GBIH/gAAAP4AAAD/AAAA/gAA
+        AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/pEnJ/mQKCgiAAAAAAAA
+        AAAAAAAAAAAAAKFDLpU/IRv/ABoi/gAeKP4AHij/AB4o/gAeKP4AHij/AB4o/gAeKP8AHij+AB4o/gAe
+        KP4AHij/AB0n/gAWHf4ABQb/CBkK/jejRP47rkn/Oq1I/jqtSP46qkH/N4cC/tXLcv6vjkL/BgUC/gAH
+        Cv4AGCD/AB0n/gAeKP8AHij+AB4o/gAeKP8AHij+AB4o/gAeKP8AHij+AB4o/gAeKP8AHSf+ABYd/owv
+        Mf+YLCyVAAAAAAAAAAAAAAAArEYuD69GLfAFa47/AG6T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8Ab5T/AG6T/wBtkv8AZIT/F3JZ/zmrSf87rkn/OqxG/zmiNP84lBn/N4cC/77C
+        Zv/pw2P/MGFe/wBniv8AbpL/AG6T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8AbpP/AG2S/z1WbP+bKyrwmysqEAAAAAAAAAAAsEYsXLBGLP4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBu
+        k/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/B3eJ/jepTf44mSL/N4kF/kWN
+        Df6Mrkn/vcNs/vvYhv7RvWz/DnSQ/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBv
+        lP8AbpP+AG6T/gBvlP8AbpP+AG6T/j9gd/+cLCv+nCsqXAAAAAAAAAAAsEcsqrBHLP4Eb5L/AG+U/gBu
+        k/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/AG6T/gBvk/4Ec47/IZNp/jij
+        P/4yeQD/qLFp/t3HjP7kxH7/5MBv/ui/ZP7wyGb/c5l8/glykf4Ab5P/AG6T/gBvlP8AbpP+AG6T/gBv
+        lP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/kVsgv+hNjT+nCwqqgAAAACxSC0FsUgt6bFH
+        Lf/a0sn/vcSf/5+ug/8GcZL/AG+U/wBvlP8Ab5T/AG+U/wBvlP8HaYj/K3tT/yGGTP8nmGL/KZtf/y6g
+        WP82qU7/OKE2/xg/Bv8DBgD/CQgG/wkIBf8JCAT/CQgE/xMPCP+zkkn//c1i/+fDYP/Btmn/m7B8/yV+
+        OP8ijFj/Em5h/wBpi/8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wZ2i/8omF//Kogz/4KlZv+oRUL/nCwq6Zws
+        KgWxSC0osUgs/rlZQP7+9N///N2X/ubKfP4JcpH/AG6T/gBuk/4Ab5T/AG6T/gBvlP8JY33+Pn4f/jiX
+        H/46rUf/OqtD/jqnPv44mSX/JFkC/gIJBf4ADxP/AA8U/gAPFP4ADxT/AA8U/gAOE/4nIxT/27JW/v7N
+        Xf7/03H/h6o8/jiQE/86rUj+H24//gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5h/86rEn+OJsp/mOg
+        N/+2Y2D+nSwq/pwsKiiySS1Wskks/sd6Zv7+8ND/+9qP/ufLfP4JcpH/AG6T/gBuk/4Ab5T/AG6T/gBv
+        lP8DYHb+LHQM/jeJBv43iAP/N4cB/jaGAP47dg7/ChQJ/gBEWv4AbJD/AGyQ/gBskP4AbJD/AGyQ/gBr
+        jv4AOUz/UkQj/vLEXf721oH/QosI/jmjNf86rUj+H24//gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5
+        h/86rUn+OaM3/j6KCP/Fh4P+ni8s/p0tKlazSi15s0ot/9KUgv/+7MT//NmK/+jMff8JcpL/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8DYHb/V4s5/8DMjP/W16L/3dqo/+vatv9BPjb/ADdJ/wBskP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8Aao3/Ay47/4hvN//u04D/OYcC/zqkOP86rUj/H24//wBlhv8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wl5iP86rUn/OqpD/zeGAf/Alof/oDEv/50tKnmzSi2Qs0os/tmkk/7+6r3//dmJ/ujM
+        fv4JcpL/AG6T/gBuk/4Ab5T/AG6T/gBvlP8IYnz+v7+f/v3kt/7+5Lb/+N+y/ndrVf4CKzn/AGqO/gBu
+        k/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5P/AGWH/g8qLv68n17/i6tA/jiQE/86rUj+H24//gBl
+        hv8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5h/86rUn+Oq1H/jeIA/+6nYX+oDQx/p4tKpCzSy2cs0ss/t2t
+        nf7+6bn//dqL/ujRjv4JcpP/AG6T/gBuk/4Ab5T/AG6T/gBvlP8NZYD+y8Kk/v3mvP7947f/q5l7/gol
+        Lf4AZYf/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBggP4uOCz/wrZn/kOM
+        Cv84lRv+H208/gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/ghzff83jA3+OJUd/jeHAv+4oYf+oTUx/p4u
+        K5u0TC2dtEst/92unf/+6rz/+uGh/4yvXP8EcI//AG+U/wBvlP8Ab5T/AG+U/wBvlP8NZYH/fZ9h/8TP
+        lP/Ww6T/IDAx/wBffv8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8AVXH/Wlc5/9rHb/9ZlRr/HV4i/wBlhv8Ab5T/AG+U/wBvlP8Ab5T/AG+U/yB7if+4t0X/iak2/2uh
+        M//PrJ//oDMu/54uK520TC2StEwt/tqmlf787sv/ha1K/jKEDP4Cb43/AG6T/gBuk/4Ab5T/AG6T/gBv
+        lP8FYXn+LXUN/meaN/5HTkn/AFZz/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG+T/jiHk/4rgJL/AG6T/gBu
+        k/4Ab5T/AG6T/gBuk/4AbpP/A01k/pF8QP/CwV/+H1oa/gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/ih9
+        h//3y1X++9Vy/v7ptv/UoJv+nzAr/p4vKpK1TS18tU0u/tiikv6pxoH/N4YA/jKEDP4Cb43/AG6T/gBu
+        k/4Ab5T/AG6T/gBvlP8DYHf+K3kY/iNLEP4CTGT/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5P/LIGU/trL
+        k/7Jw43/HHqS/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG2R/hJKVv+cmlD+KV8h/gBlhv8AbpP+AG6T/gBv
+        lP8AbpP+AG6T/id+jf9nmR/+Ypoh/luZI//Snpr+oDIs/p8vKn21TS1btk8w/9Scif84hgH/N4gE/zKF
+        D/8Cb47/AG+U/wBvlP8Ab5T/AG+U/wBvlP8DYnr/HWIz/wFDU/8AbpL/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8YeZT/xsSW//7akf/92Ir/r7aI/w50kv8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBrj/8LRz7/GE4c/wBl
+        hv8Ab5T/AG+U/wBvlP8Ab5T/AG+U/w10f/82hwT/OJAS/zmHA//JjYj/oTIs/6AwK1u1Ti4utk8v/s+J
+        dP48iQb/OZwp/jWjRv4CcJD/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AXHn+AkFP/gBskP4Ab5T/AG6T/gBu
+        k/4Ab5T/AG6T/gtzk/6quJf//NqU/v3Zjv7+14f//NWA/o6nhP4EcJL/AG6T/gBuk/4Ab5T/AG6T/gBv
+        lP8AZ4r+AztD/gBlh/8AbpP+AG6T/gBvlP8AbpP+AG6T/ghzfv85ozf+OZ4s/lycLv+7bGf+oTIr/qAx
+        Ky62Ti4Itk8u7cNuU/5snDv/OJkj/jWoT/4CcJD/AG6T/gBuk/4Ab5T/AG6T/gBvlP8Aa4/+AGyQ/gBu
+        k/4Ab5T/AG6T/gBuk/4Ab5T/BXGU/oysmv772pb//dqQ/v3Yiv7+14T//dV9/vfQdv5rloH/AW6T/gBu
+        k/4Ab5T/AG6T/gBvlP8AbpP+AGqN/gBtkf8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5h/86rUn+OJMX/oSp
+        W/+uTkf+oTIr7aEyKwgAAAAAtk8us71fQf+Wm1n/N4wM/zWoTv8CcJD/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8AbpL/LoNr/+3erP/94af//tuR//7Xhv/+1oD//tR5//7S
+        cv/vy23/R4aB/wBuk/8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wl5
+        h/86q0X/N4cD/6ugd/+nPjb/ojMrswAAAAAAAAAAtk8uZrhTM/7BkXD/OogE/jWfP/4CcJD/AG6T/gBu
+        k/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/AG6T/gBuk/4Qc2X/NYUK/j6JB/5zpDj/79yb/v3X
+        hf7+1Hv//dN1/v3Rbv7+z2f/3cBl/iZ3g/4AbpP/AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBv
+        lP8AbpP+AG6T/ghzff83jA7+S5IZ/sOEe/+jNi3+ojQrZgAAAAAAAAAAtlAvFrZQLvWtZE3/OFws/xNN
+        LP8AbY//AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wp1gP8znUD/OZwp/zmf
+        Lf83hgH/vMVz//7XhP/+03b//tJw//7Qav//zmP//81c/8KwXv8Pbof/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wZpgv8YSRr/UXBD/6tRSf+iNCv1ojUrFgAAAAAAAAAAAAAAAKtS
+        NKUaYXn/AGyQ/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/BG+H/i+e
+        Vf46rUn/Oqg//jeIBf6HrUf/99yW/v3UeP7+0nD//tBr/v7PZf7/zV7//stY/v7KUv6bm1r/BWyM/gBv
+        lP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AGqN/kxVY/+dOC+lAAAAAAAA
+        AAAAAAAAAAAAAGZcWTAAb5T/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBu
+        k/4Baof/J45R/jqsRv46rEX/N48R/n+oP/793ZT//dR5/v3UeP7+1n7//tR1/v7OYv7/zFn//spT/v7J
+        Tf76xUf/a4FZ/gFsj/8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/j1Z
+        bP1yR0owAAAAAAAAAAAAAAAAAAAAAAAAAAABbpLxAG6T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wFskP8cbjj/OaM3/zeKCP83iAT/O4gE/+PUiv/+1Hf//tV6/+fUhv+KrEP/sLxe//7V
+        eP//y1X//8lO///ISf//xUP/77o9/z1rX/8AbZL/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG6T/yhgebUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ZHMsdllO8GViYf5Wgn//GndJ/huD
+        YP4cimz/G4Nf/ip/WP95oI7+eZuA/pKlh/5Njxf/N4oI/keODv45hwL/kLBM/v3aiP7+0nD/6NSE/k6R
+        FP44kRT/OIcD/s/IbP7/0Gb//spS/v7GRP7/wz7//sI5/tqqNP9+j1f+eZFc/nmRWv95kFj+eZBZ/nmS
+        X/95mXP+eaae/mR6iP9dTFT+dEdJ8EhWZSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApVM3abhT
+        MP7Hel//eZ1F/jeMC/46qkL/OaI0/keNDf/12Yz+/tN0/v7Xgf6zwGj/R40O/j2JBf43jg//VpQa/v3b
+        jv7/1n3/k7BJ/jiPEv46rUj/OJgh/kaNDP6cskj/4sxs/v7NWv7/xkT//sE2/v+/MP/+viv+/r0m/v+8
+        Iv/+vCH+/r4p/v/IRf/+3In+7tK//qtENv+mOSv+mT0zaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAt1EvArhRLq26VjT/x4Vp/2aZNP83jQ3/OqlA/zeOD/9pnSn/x8Zt//vckP9woC//N4gF/zme
+        LP84lRz/O4gD/2ecJ//83ZH/WJUb/ziUGv86rEb/Oq1I/zmfLf84kBP/Q4sJ/4+rPP/Vxl7//8tS//+/
+        Lf//vSf//7wj//+8I///vyv//8hG///agv/14Mj/slNF/6g7LP+nOiytpjksAgAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAALhSLw+4US7Nu1k4/smLb/5omjb/N4wL/jmgMP83jQz+N4cC/mCZ
+        If68w2n/OIcD/jmiNP45mST/QosJ/oysQP7+2of/g6g6/jeHAv46qUH/Oq1I/jqtSP46rUj/OaI0/jiS
+        Fv45iAP/x79U/v/DOP/+vSX+/r0n/v/BMf/+y07+/tyJ/vbhyP+3XE7+qDwr/qg7LM2nOisPAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4UjAYuFEu1rtZN/7KhWv/eZ5G/jeG
+        AP87iAX+N4YA/j+KB/7o1IP/YJkh/jeNDf43iAT/srxZ/v7Sa/7+1Xb/X5gf/jmcKf47rkn/Oq1I/jqt
+        SP47rkn/Oq1I/jqtSP44mCH/eqIr/v/LT//+vy7+/sU8/v/QXv/+4pz+79TA/rVWRv+pPSv+qT0r1qg8
+        LBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuFIwGLhR
+        Ls66VjT/x3le/7qwhf/X4LX/UZMZ/zeGAP/j1IT/daMy/2mdJ//EwmH//NNv///LVf/XyWn/OIcC/zqp
+        Qf87rkn/O65J/zuuSf87rkn/O65J/zuuSf86pDb/OogE/8vEXf//z13//9h6///rvP/fsqP/r0k2/6s/
+        LP+qPizOqT0sGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAALhSLw+4US6tuFIv/rtZOf/NmoD+dJ9D/jqIBP7c15P//t6S/v7Zgf7+1nn/+dR2/v3V
+        dv5xnyr/OJQb/jqtSP47rkn/Oq1I/jqtSP47rkn/Oq1I/jqtSP46rUf/OJMY/n6pP//+6rn+89zG/sZ8
+        bP+sQSv+q0Ar/qs/LK2qPisPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4US4Ct1EubbdQLvO6WDf+xnRa/sujhv7149L//u3E/v7m
+        rP6guVz/RYwM/lGRFP43igj/OqpC/jqtSP47rkn/Oq1I/jqtSP46qkL/OaM1/jiZIv43jAv/P4oK/oqr
+        Xv/VnZD+sUo1/q1CLP+sQSzzrEArbatALAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhRLyS4US6vt1Au/bhT
+        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
+        u/87gw//NZY//zeZOP9EjBP/ubtQ///FQ///wTj//8A0//+/L//+viv/+Lgm/+2uI//gpyr/6rpM//re
+        mv/Smo7/nC0t/5spKq2bKSoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKo+LAKqPiyvrEQ0/+fB
+        rP/42JH/5bxm/2CQIv86qkT/O65J/zqrQ/9Qkxb/3cdg///HSP//wz3//8E4///AMv//vy3//70n//67
+        Iv/xsSH/5Kww//bPdv/avKb/p0ZF/5sqKq+bKSoCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq0AshKxC
+        L//nwq3/9tWL/+i7Wf/6yVv/tbxY/ziXH/87rkn/O65J/zqnPf9FkhX/xMBZ///LVf//xEH//8I7///A
+        NP//vy7//70n//+8If/7uB7/6rEw/4ShN/+Fl1L/pT8//5sqKoQAAAAAAAAAAAAAAAAAAAAAAAAAAJs7
+        JzqsQSz82qeV//nbmP/twGD//cxf///OYf/41n//O5AT/zuuSf87rkn/O65J/zqrRP84khb/uLxV///K
+        UP//xUP//8I8///ANP//vy3//70m//+7IP/+vij/f5or/zeJDf+aj2H/nzIy/JEnJzsAAAAAAAAAAAAA
+        AACDMyEBRxsSzhoKB/8kIR3/IhwQ/yMcDf8kHQ7/JB0P/yIfE/8IFAH/Ch8N/xpPIf84pkX/O65J/zqs
+        Rf9Kkxf/99Ft/96vQv9YRBf/KB4J/yQbB/8kGwX/JBoF/yQbBf8SFwX/BxQF/w4WB/8eDAz/ax0dzpAn
+        JwEAAAAAAAAAAJ9CLVAqGRb/ABQa/wAUGv8AFBr/ABQa/wAUGv8AFBr/ABQa/wAUGv8AEBX/AAMD/yp9
+        NP87rkn/O65J/zmbKP+tuVP/emIs/wADBP8AERf/ABQa/wAUGv8AFBr/ABQa/wAUGv8AFBr/ABQa/wAS
+        Gf9fIiT/mCsrUAAAAAAAAAAArkYuugJtkf8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBu
+        k/8BZYH/MJ9S/zqoP/85myf/PY8S/6i4Vv+up2b/AWWG/wBuk/8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG6T/ylfev+bKyq6AAAAALBHLROwRy37Am+T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+T/wd2iv8wn1D/SIkW/6ayYP/lyoL/7shx/7+2bv8Udo//AG+T/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8Ab5P/LWuG/54wL/ucKyoTsUgtU7JJLv/h28T/vbyG/wVwkv8Ab5T/AG+U/wBv
+        lP8eb3v/KIY0/y6gWf8xpFT/OKVA/xxJC/8DBAH/BgUD/wYFA/8KCAT/sZBH//PJX//RwXP/Qow2/yiS
+        VP8DYXj/AG+U/wBvlP8Ab5T/BHSN/y6dUv9imkT/pkE+/5wsKlOySS2HvmVN//7rwf/tz3//BnGS/wBv
+        lP8Ab5T/AG+U/w5iWP83jAz/OJMZ/zeQEv8vZgv/AiYt/wBSbf8AU27/AFNu/wBRbP8ZLy7/3rNV/8nD
+        Yf84lh7/N6NF/wRdbv8Ab5T/AG+U/wBvlP8GdYz/OqxJ/0GRGP+2ZGH/nSwqh7NKLanJfmj//uay/+/P
+        fv8GcZL/AG+U/wBvlP8Ab5T/FmZg/8nPkf/k3Kn/28ul/x4yNv8AZon/AG+U/wBvlP8Ab5T/AG+U/wBj
+        hP9FSDH/urpc/ziXH/83o0X/BF1u/wBvlP8Ab5T/AG+U/wZ1jP86rUn/OJIW/7V3a/+dLSqqs0stu86L
+        dv/+5az/79KH/wZxk/8Ab5T/AG+U/wBvlP88eYX//eW6//fesv9JTkX/AGCA/wBvlP8Ab5T/AG+U/wBv
+        lP8Ab5T/AG+U/wBZd/9/dEv/Xpkh/zaYMP8EXW7/AG+U/wBvlP8Ab5T/BnOH/ziZJP83jxH/sn9s/54u
+        K7u0TC28z4x3//3ouP+Mr1X/Am+Q/wBvlP8Ab5T/AG+U/yZucf+TtWL/hH9u/wBWcv8AbpP/AG+U/wBv
+        lP8CcJP/AW+T/wBvlP8Ab5T/AG+U/wdSaf+tm1b/XJEf/wRba/8Ab5T/AG+U/wBvlP8Xd4z/yLtG/6C4
+        Vv/Bgnr/ni8rvLRNLavNhnD/nb1v/zSECP8Bb4//AG+U/wBvlP8Ab5T/DWRb/zVtEv8IUGf/AG6T/wBv
+        lP8Ab5T/AW+U/4mpk/93oJD/AG+T/wBvlP8Ab5T/AG6T/x9XXv+MmkL/BFlo/wBvlP8Ab5T/AG+U/xp5
+        jv+NqDL/mrZU/8J6dv+fLyustU0uisqAaf83iQb/NI0X/wFvkP8Ab5T/AG+U/wBvlP8JXmP/B05V/wBu
+        k/8Ab5T/AG+U/wBvk/9lmpX/+tmS//fViP9Sj4z/AG+U/wBvlP8Ab5T/AG2R/w1OPv8DWGr/AG+U/wBv
+        lP8Ab5T/B3KF/ziTGf8+jA3/umpl/6AxK4q2Ti5YwWhN/1GTIf83qUv/AXCR/wBvlP8Ab5T/AG+U/wBi
+        g/8AbZH/AG+U/wBvlP8AbpP/RY2W//TXlv/+2Y3//taD/+3Nev8ygYr/AG6T/wBvlP8Ab5T/AGuO/wBk
+        hf8Ab5T/AG+U/wBvlP8GdIr/OqpD/2OcNv+rSUL/oTIrWLZPLhi6Vzj9fpNA/zaeOP8BcJH/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/whxev+Ssmb/69mW//7Yif/+1X3//tJz/9rBbf8WdYz/AG+U/wBv
+        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wZ0if84mib/i5VV/6Q5Mf2hMysYAAAAALZQL8GUdE3/IGQk/wBu
+        kf8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8EcYv/L5E1/ziWHv9Xlh7//tuP//7Tdv/+0Wz//s5i/7iu
+        Y/8Hbo7/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/BG2H/yRgD/+hcFz/ozUrwQAAAAAAAAAAn1M6Wwto
+        hv8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AW2O/ymXW/86rEb/PpEU/8bHdP/+1Xz//tFv//7P
+        Zf//zFz//spS/4uWXv8AbZH/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG6T/y9dc/+YOTJbAAAAAAAA
+        AABGYmsDAG6T+QBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBukv8ee0f/OZsn/ziQE/+etlX//tV6//TV
+        gf+yvFv/9NFz///LVP//yEv/+8NC/1Z7X/8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/H2N/3WZL
+        UgMAAAAAAAAAAAAAAABYXmBMg1tO/meFav8khED/JpZg/zKFQf+lsof/sLOB/1eWIP9Ciwr/PYkG/+fS
+        gP/+1n3/Zp0o/ziWHv+Cpzb//dJt///ITP//wjz/7rc0/6ifSf+mn0j/pp9G/6aiT/+msoL/ioiK/3lF
+        Rf5gTlZKAAAAAAAAAAAAAAAAAAAAAAAAAAC3US+UwmtN/3CVOP85nCj/OJQb/6i4Vf/114T/daM0/zqT
+        GP84kBP/fqY3/9vNd/83jxH/Oq1H/zmbJ/9DkBL/pbNE/+zIV///wTP//70n//+8I///vy3//9Fj/+zJ
+        q/+rQjP/pjoslAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhRLge4Ui+6wnFS/3OXO/84lBr/N4kG/0mO
+        D/+gtVH/OJYe/zqQE/+jtEz/6NF4/zmLCv86rEX/O65J/zqsRv85nSv/TJIV//rIS///vSf//8I2///U
+        bv/syqv/r0s7/6g8LLqnOiwHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhRLgu4Ui+7wWpM/5mc
+        XP+KtFz/PIgE/8zJcv9Ukxf/qrZN///PYP+xuE7/OZwo/zuuSf87rkn/O65J/zuuSf84mCL/s7dG///M
+        VP//35P/37CZ/65GNP+qPiy7qTwsCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhR
+        Lge4US6UuVUz/rqLZf90nUH/7+Gn///cjP/dy23/ycJa/1GUGP86q0T/O65J/zuuSf87rkn/Oq1H/zmg
+        L/9fmib/8te3/8Z6aP+sQSz+q0AslKo+LAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAC3US5KuFEv271dPv/OiHD/6siw/2ifN/83hgD/N48Q/ziZI/84mSP/OJYe/ziQ
+        E/9Ulyb/hZhM/7OGY/+zTjj/rUMs26xBLEoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3UC4Et08uXrZPLsi4UjL+wmtQ/7+BYf+0iWH/q41e/6yM
+        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
+        lP8Mc5D/pLRJ/7BWUdm9YUS4PZUi/wBvkv8Ab5T/BF9z/wBuk/8RdpT/1MmS/83ChP8Mc5H/AG6T/wRd
+        b/8Ab5T/A3GO/0WZKP+pRT+4tlEwdVqCOv8Ab5L/AG+U/wBvlP8Bb5H/QJNN/8/Ic//+03T/qqxw/wFu
+        kv8Ab5T/AG+U/wJvjv9igDr/ojUsdWhCNRcDbZD9AG+U/wBvlP8AbpP/IIdW/1ShMP/t0nv/6cto//7K
+        U/93kGT/AG6T/wBvlP8Ab5T/E2eG9nQyLhcAAAAAj1dEd2+CTP8ykzn/vL14/1KWHf92pDT/nrRL/0uh
+        MP+5t0T/9sA+/9OuN//StEn/sZF7/4dCPXcAAAAAAAAAAGYtGQG6WTiggYw//1GVHf9+qj7/obJD/4Os
+        Pv86rUj/OqlB/4yqMv//y1H/3qV5/6pAL6BnJBsBAAAAAAAAAAAAAAAAaC4aAbhSL3epdkX26sOV/5Gs
+        P/8/miT/OaM0/0CgMv90lkH/xnhh9qxALHdpJhsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkT8kGLdQ
+        L3m7YkO8smxG3rFrRt64XUO8sUkveZA4JRgAAAAAAAAAAAAAAAAAAAAA8A8AAOAHAADAAwAAgAEAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIABAADAAwAA8A8AAA==
+</value>
+  </data>
+</root>
\ No newline at end of file

Added: sandbox/maestro-2.5/Maestro.Editors/EditorBase.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/EditorBase.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/EditorBase.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,49 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using OSGeo.MapGuide.MaestroAPI.Resource;
+
+namespace Maestro.Editors
+{
+    public class EditorBase : UserControl 
+    {
+        public virtual void Bind(IEditorService service)
+        {
+            throw new NotImplementedException();
+        }
+
+        protected virtual void OnResourceChanged()
+        {
+            var handler = this.ResourceChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public event EventHandler ResourceChanged;
+    }
+
+    public interface INotifyResourceChanged
+    {
+        event EventHandler ResourceChanged;
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,146 @@
+namespace Maestro.Editors.FeatureSource.Providers
+{
+    partial class GenericCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.label1 = new System.Windows.Forms.Label();
+            this.txtProvider = new System.Windows.Forms.TextBox();
+            this.grdConnectionParameters = new System.Windows.Forms.DataGridView();
+            this.label2 = new System.Windows.Forms.Label();
+            this.label3 = new System.Windows.Forms.Label();
+            this.resDataCtrl = new Maestro.Editors.Common.ResourceDataCtrl();
+            this.btnEditConfiguration = new System.Windows.Forms.Button();
+            this.contentPanel.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdConnectionParameters)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // contentPanel
+            // 
+            this.contentPanel.Controls.Add(this.btnEditConfiguration);
+            this.contentPanel.Controls.Add(this.resDataCtrl);
+            this.contentPanel.Controls.Add(this.label3);
+            this.contentPanel.Controls.Add(this.label2);
+            this.contentPanel.Controls.Add(this.grdConnectionParameters);
+            this.contentPanel.Controls.Add(this.txtProvider);
+            this.contentPanel.Controls.Add(this.label1);
+            this.contentPanel.Size = new System.Drawing.Size(683, 372);
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(13, 14);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(71, 13);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "FDO Provider";
+            // 
+            // txtProvider
+            // 
+            this.txtProvider.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtProvider.Location = new System.Drawing.Point(90, 11);
+            this.txtProvider.Name = "txtProvider";
+            this.txtProvider.ReadOnly = true;
+            this.txtProvider.Size = new System.Drawing.Size(580, 20);
+            this.txtProvider.TabIndex = 1;
+            // 
+            // grdConnectionParameters
+            // 
+            this.grdConnectionParameters.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.grdConnectionParameters.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.grdConnectionParameters.Location = new System.Drawing.Point(16, 62);
+            this.grdConnectionParameters.Name = "grdConnectionParameters";
+            this.grdConnectionParameters.Size = new System.Drawing.Size(654, 85);
+            this.grdConnectionParameters.TabIndex = 2;
+            this.grdConnectionParameters.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.grdConnectionParameters_CellPainting);
+            this.grdConnectionParameters.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(this.grdConnectionParameters_EditingControlShowing);
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(14, 46);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(117, 13);
+            this.label2.TabIndex = 3;
+            this.label2.Text = "Connection Parameters";
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(14, 159);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(103, 13);
+            this.label3.TabIndex = 4;
+            this.label3.Text = "Resource Data Files";
+            // 
+            // resDataCtrl
+            // 
+            this.resDataCtrl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.resDataCtrl.Location = new System.Drawing.Point(16, 175);
+            this.resDataCtrl.Name = "resDataCtrl";
+            this.resDataCtrl.Size = new System.Drawing.Size(654, 147);
+            this.resDataCtrl.TabIndex = 5;
+            // 
+            // btnEditConfiguration
+            // 
+            this.btnEditConfiguration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+            this.btnEditConfiguration.Location = new System.Drawing.Point(16, 337);
+            this.btnEditConfiguration.Name = "btnEditConfiguration";
+            this.btnEditConfiguration.Size = new System.Drawing.Size(153, 23);
+            this.btnEditConfiguration.TabIndex = 6;
+            this.btnEditConfiguration.Text = "Edit Configuration Document";
+            this.btnEditConfiguration.UseVisualStyleBackColor = true;
+            // 
+            // GenericCtrl
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.HeaderText = "Connection Settings (Generic)";
+            this.Name = "GenericCtrl";
+            this.Size = new System.Drawing.Size(683, 399);
+            this.contentPanel.ResumeLayout(false);
+            this.contentPanel.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdConnectionParameters)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.DataGridView grdConnectionParameters;
+        private System.Windows.Forms.TextBox txtProvider;
+        private System.Windows.Forms.Label label1;
+        private Maestro.Editors.Common.ResourceDataCtrl resDataCtrl;
+        private System.Windows.Forms.Button btnEditConfiguration;
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,132 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI.Services;
+
+namespace Maestro.Editors.FeatureSource.Providers
+{
+    public partial class GenericCtrl : CollapsiblePanel
+    {
+        private GenericCtrl()
+        {
+            InitializeComponent();
+        }
+
+        public GenericCtrl(string provider, string featureSourceID, IFeatureService featSvc)
+            : this()
+        {
+            var prov = featSvc.GetFeatureProvider(provider);
+
+            var colName = new DataGridViewColumn();
+            colName.Name = "COL_NAME";
+            colName.HeaderText = "Name"; //LOCALIZE
+            colName.ReadOnly = true;
+            var colValue = new DataGridViewColumn();
+            colValue.Name = "COL_VALUE";
+            colValue.HeaderText = "Value"; //LOCALIZE
+            colValue.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
+
+            grdConnectionParameters.Columns.Add(colName);
+            grdConnectionParameters.Columns.Add(colValue);
+
+            foreach (var p in prov.ConnectionProperties)
+            {
+                var row = new DataGridViewRow();
+                var nameCell = new DataGridViewTextBoxCell();
+                nameCell.Value = p.LocalizedName;
+
+                DataGridViewCell valueCell = null;
+                if (p.Enumerable)
+                {
+                    var cell = new DataGridViewComboBoxCell();
+                    cell.DataSource = p.Value;
+                    
+                    valueCell = cell;
+                }
+                else
+                {
+                    valueCell = new DataGridViewTextBoxCell();
+                }
+
+                if (!string.IsNullOrEmpty(p.DefaultValue))
+                    valueCell.Value = p.DefaultValue;
+
+                row.Cells.Add(nameCell);
+                row.Cells.Add(valueCell);
+
+                if (p.Protected)
+                    pwdCells.Add(valueCell);
+
+                grdConnectionParameters.Rows.Add(row);
+            }
+        }
+
+        private List<DataGridViewCell> pwdCells = new List<DataGridViewCell>();
+
+        private bool IsPasswordCell(DataGridViewCell cell)
+        {
+            return pwdCells.Contains(cell);
+        }
+
+        private void grdConnectionParameters_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
+        {
+            if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
+            {
+                DataGridViewCell cell = grdConnectionParameters.Rows[e.RowIndex].Cells[e.ColumnIndex];
+                if (cell != null && IsPasswordCell(cell) && cell.Value != null)
+                {
+                    e.Paint(e.CellBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.ContentForeground);
+                    Graphics g = e.Graphics;
+                    g.DrawString(new string('*', cell.Value.ToString().Length), this.Font, new SolidBrush(Color.Black), e.CellBounds);
+                    e.Handled = true;
+                }
+            }
+        }
+
+        private void grdConnectionParameters_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
+        {
+            DataGridViewCell cell = grdConnectionParameters.SelectedCells[0];
+            if (cell != null)
+            {
+                TextBox t = e.Control as TextBox;
+                if (t != null)
+                {
+                    t.UseSystemPasswordChar = IsPasswordCell(cell);
+                }
+            }
+        }
+    }
+
+    internal interface IGenericConnectionView
+    {
+
+    }
+
+    internal class GenericConnectionPresenter
+    {
+    }
+}

Added: sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/FeatureSource/Providers/GenericCtrl.resx	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Deleted: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.Designer.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -1,117 +0,0 @@
-namespace Maestro.Editors.Generic
-{
-    partial class ResourceDataCtrl
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.toolStrip1 = new System.Windows.Forms.ToolStrip();
-            this.dataGridView1 = new System.Windows.Forms.DataGridView();
-            this.btnAdd = new System.Windows.Forms.ToolStripButton();
-            this.btnDelete = new System.Windows.Forms.ToolStripButton();
-            this.btnDownload = new System.Windows.Forms.ToolStripButton();
-            this.contentPanel.SuspendLayout();
-            this.toolStrip1.SuspendLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
-            this.SuspendLayout();
-            // 
-            // contentPanel
-            // 
-            this.contentPanel.Controls.Add(this.dataGridView1);
-            this.contentPanel.Controls.Add(this.toolStrip1);
-            // 
-            // toolStrip1
-            // 
-            this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.btnAdd,
-            this.btnDelete,
-            this.btnDownload});
-            this.toolStrip1.Location = new System.Drawing.Point(0, 0);
-            this.toolStrip1.Name = "toolStrip1";
-            this.toolStrip1.Size = new System.Drawing.Size(449, 25);
-            this.toolStrip1.TabIndex = 0;
-            this.toolStrip1.Text = "toolStrip1";
-            // 
-            // dataGridView1
-            // 
-            this.dataGridView1.AllowUserToAddRows = false;
-            this.dataGridView1.AllowUserToDeleteRows = false;
-            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.dataGridView1.Location = new System.Drawing.Point(0, 25);
-            this.dataGridView1.Name = "dataGridView1";
-            this.dataGridView1.ReadOnly = true;
-            this.dataGridView1.Size = new System.Drawing.Size(449, 267);
-            this.dataGridView1.TabIndex = 1;
-            // 
-            // btnAdd
-            // 
-            this.btnAdd.Image = global::Maestro.Editors.Properties.Resources.document__plus;
-            this.btnAdd.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.btnAdd.Name = "btnAdd";
-            this.btnAdd.Size = new System.Drawing.Size(49, 22);
-            this.btnAdd.Text = "Add";
-            // 
-            // btnDelete
-            // 
-            this.btnDelete.Image = global::Maestro.Editors.Properties.Resources.document__minus;
-            this.btnDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.btnDelete.Name = "btnDelete";
-            this.btnDelete.Size = new System.Drawing.Size(60, 22);
-            this.btnDelete.Text = "Delete";
-            // 
-            // btnDownload
-            // 
-            this.btnDownload.Image = global::Maestro.Editors.Properties.Resources.drive_download;
-            this.btnDownload.ImageTransparentColor = System.Drawing.Color.Magenta;
-            this.btnDownload.Name = "btnDownload";
-            this.btnDownload.Size = new System.Drawing.Size(81, 22);
-            this.btnDownload.Text = "Download";
-            // 
-            // ResourceDataCtrl
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.HeaderText = "Resource Data Files";
-            this.Name = "ResourceDataCtrl";
-            this.contentPanel.ResumeLayout(false);
-            this.contentPanel.PerformLayout();
-            this.toolStrip1.ResumeLayout(false);
-            this.toolStrip1.PerformLayout();
-            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
-            this.ResumeLayout(false);
-
-        }
-
-        #endregion
-
-        private System.Windows.Forms.ToolStrip toolStrip1;
-        private System.Windows.Forms.DataGridView dataGridView1;
-        private System.Windows.Forms.ToolStripButton btnAdd;
-        private System.Windows.Forms.ToolStripButton btnDelete;
-        private System.Windows.Forms.ToolStripButton btnDownload;
-    }
-}

Deleted: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -1,39 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Text;
-using System.Windows.Forms;
-using Maestro.Shared.UI;
-
-namespace Maestro.Editors.Generic
-{
-    [ToolboxItem(true)]
-    public partial class ResourceDataCtrl : CollapsiblePanel
-    {
-        public ResourceDataCtrl()
-        {
-            InitializeComponent();
-        }
-    }
-}

Deleted: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.resx	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.resx	2010-05-20 23:28:34 UTC (rev 4916)
@@ -1,126 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
\ No newline at end of file

Copied: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.Designer.cs (from rev 4913, sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.Designer.cs)
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.Designer.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,63 @@
+namespace Maestro.Editors.Generic
+{
+    partial class ResourceDataPanel
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.resDataCtrl = new Maestro.Editors.Common.ResourceDataCtrl();
+            this.contentPanel.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // contentPanel
+            // 
+            this.contentPanel.Controls.Add(this.resDataCtrl);
+            // 
+            // resDataCtrl
+            // 
+            this.resDataCtrl.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.resDataCtrl.Location = new System.Drawing.Point(0, 0);
+            this.resDataCtrl.Name = "resDataCtrl";
+            this.resDataCtrl.Size = new System.Drawing.Size(449, 292);
+            this.resDataCtrl.TabIndex = 0;
+            // 
+            // ResourceDataPanel
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.HeaderText = "Resource Data Files";
+            this.Name = "ResourceDataPanel";
+            this.contentPanel.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private Maestro.Editors.Common.ResourceDataCtrl resDataCtrl;
+
+    }
+}

Copied: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.cs (from rev 4913, sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.cs)
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,55 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI.Services;
+
+namespace Maestro.Editors.Generic
+{
+    [ToolboxItem(true)]
+    public partial class ResourceDataPanel : CollapsiblePanel
+    {
+        public ResourceDataPanel()
+        {
+            InitializeComponent();
+            resDataCtrl.DataListChanged += (sender, e) => { OnDataListChanged(); };
+        }
+
+        public event EventHandler DataListChanged;
+
+        private void OnDataListChanged()
+        {
+            var handler = this.DataListChanged;
+            if (handler != null)
+                handler(this, EventArgs.Empty);
+        }
+
+        public void Init(IEditorService ed)
+        {
+            resDataCtrl.Init(ed);
+        }
+    }
+}

Copied: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.resx (from rev 4913, sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataCtrl.resx)
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.resx	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourceDataPanel.resx	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file

Deleted: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.Designer.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -1,266 +0,0 @@
-namespace Maestro.Editors.Generic
-{
-    partial class ResourcePicker
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            this.components = new System.ComponentModel.Container();
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ResourcePicker));
-            this.trvFolders = new Aga.Controls.Tree.TreeViewAdv();
-            this.nodeIcon1 = new Aga.Controls.Tree.NodeControls.NodeIcon();
-            this.nodeTextBox1 = new Aga.Controls.Tree.NodeControls.NodeTextBox();
-            this.lstResources = new System.Windows.Forms.ListView();
-            this.resImageList = new System.Windows.Forms.ImageList(this.components);
-            this.btnOK = new System.Windows.Forms.Button();
-            this.btnCancel = new System.Windows.Forms.Button();
-            this.label1 = new System.Windows.Forms.Label();
-            this.lblFilter = new System.Windows.Forms.Label();
-            this.txtResourceId = new System.Windows.Forms.TextBox();
-            this.cmbResourceFilter = new System.Windows.Forms.ComboBox();
-            this.label3 = new System.Windows.Forms.Label();
-            this.label4 = new System.Windows.Forms.Label();
-            this.splitContainer1 = new System.Windows.Forms.SplitContainer();
-            this.splitContainer1.Panel1.SuspendLayout();
-            this.splitContainer1.Panel2.SuspendLayout();
-            this.splitContainer1.SuspendLayout();
-            this.SuspendLayout();
-            // 
-            // trvFolders
-            // 
-            this.trvFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                        | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.trvFolders.BackColor = System.Drawing.SystemColors.Window;
-            this.trvFolders.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
-            this.trvFolders.DefaultToolTipProvider = null;
-            this.trvFolders.DragDropMarkColor = System.Drawing.Color.Black;
-            this.trvFolders.LineColor = System.Drawing.SystemColors.ControlDark;
-            this.trvFolders.LoadOnDemand = true;
-            this.trvFolders.Location = new System.Drawing.Point(12, 31);
-            this.trvFolders.Model = null;
-            this.trvFolders.Name = "trvFolders";
-            this.trvFolders.NodeControls.Add(this.nodeIcon1);
-            this.trvFolders.NodeControls.Add(this.nodeTextBox1);
-            this.trvFolders.SelectedNode = null;
-            this.trvFolders.Size = new System.Drawing.Size(168, 237);
-            this.trvFolders.TabIndex = 0;
-            this.trvFolders.Text = "treeViewAdv1";
-            this.trvFolders.SelectionChanged += new System.EventHandler(this.trvFolders_SelectionChanged);
-            // 
-            // nodeIcon1
-            // 
-            this.nodeIcon1.DataPropertyName = "Icon";
-            this.nodeIcon1.LeftMargin = 1;
-            this.nodeIcon1.ParentColumn = null;
-            this.nodeIcon1.ScaleMode = Aga.Controls.Tree.ImageScaleMode.Clip;
-            // 
-            // nodeTextBox1
-            // 
-            this.nodeTextBox1.DataPropertyName = "Name";
-            this.nodeTextBox1.IncrementalSearchEnabled = true;
-            this.nodeTextBox1.LeftMargin = 3;
-            this.nodeTextBox1.ParentColumn = null;
-            // 
-            // lstResources
-            // 
-            this.lstResources.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                        | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.lstResources.LargeImageList = this.resImageList;
-            this.lstResources.Location = new System.Drawing.Point(3, 31);
-            this.lstResources.MultiSelect = false;
-            this.lstResources.Name = "lstResources";
-            this.lstResources.Size = new System.Drawing.Size(348, 237);
-            this.lstResources.SmallImageList = this.resImageList;
-            this.lstResources.TabIndex = 1;
-            this.lstResources.UseCompatibleStateImageBehavior = false;
-            this.lstResources.View = System.Windows.Forms.View.List;
-            this.lstResources.SelectedIndexChanged += new System.EventHandler(this.lstResources_SelectedIndexChanged);
-            // 
-            // resImageList
-            // 
-            this.resImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("resImageList.ImageStream")));
-            this.resImageList.TransparentColor = System.Drawing.Color.Transparent;
-            this.resImageList.Images.SetKeyName(0, "document.png");
-            this.resImageList.Images.SetKeyName(1, "database-share.png");
-            this.resImageList.Images.SetKeyName(2, "layer.png");
-            this.resImageList.Images.SetKeyName(3, "map.png");
-            this.resImageList.Images.SetKeyName(4, "application-browser.png");
-            this.resImageList.Images.SetKeyName(5, "images-stack.png");
-            this.resImageList.Images.SetKeyName(6, "printer.png");
-            this.resImageList.Images.SetKeyName(7, "blueprints.png");
-            this.resImageList.Images.SetKeyName(8, "applications-stack.png");
-            // 
-            // btnOK
-            // 
-            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-            this.btnOK.Enabled = false;
-            this.btnOK.Location = new System.Drawing.Point(382, 317);
-            this.btnOK.Name = "btnOK";
-            this.btnOK.Size = new System.Drawing.Size(75, 23);
-            this.btnOK.TabIndex = 2;
-            this.btnOK.Text = "OK";
-            this.btnOK.UseVisualStyleBackColor = true;
-            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
-            // 
-            // btnCancel
-            // 
-            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-            this.btnCancel.Location = new System.Drawing.Point(463, 317);
-            this.btnCancel.Name = "btnCancel";
-            this.btnCancel.Size = new System.Drawing.Size(75, 23);
-            this.btnCancel.TabIndex = 3;
-            this.btnCancel.Text = "Cancel";
-            this.btnCancel.UseVisualStyleBackColor = true;
-            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
-            // 
-            // label1
-            // 
-            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-            this.label1.AutoSize = true;
-            this.label1.Location = new System.Drawing.Point(12, 291);
-            this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(67, 13);
-            this.label1.TabIndex = 4;
-            this.label1.Text = "Resource ID";
-            // 
-            // lblFilter
-            // 
-            this.lblFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-            this.lblFilter.AutoSize = true;
-            this.lblFilter.Location = new System.Drawing.Point(12, 317);
-            this.lblFilter.Name = "lblFilter";
-            this.lblFilter.Size = new System.Drawing.Size(29, 13);
-            this.lblFilter.TabIndex = 5;
-            this.lblFilter.Text = "Filter";
-            // 
-            // txtResourceId
-            // 
-            this.txtResourceId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.txtResourceId.Location = new System.Drawing.Point(85, 288);
-            this.txtResourceId.Name = "txtResourceId";
-            this.txtResourceId.ReadOnly = true;
-            this.txtResourceId.Size = new System.Drawing.Size(453, 20);
-            this.txtResourceId.TabIndex = 6;
-            // 
-            // cmbResourceFilter
-            // 
-            this.cmbResourceFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-                        | System.Windows.Forms.AnchorStyles.Right)));
-            this.cmbResourceFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
-            this.cmbResourceFilter.FormattingEnabled = true;
-            this.cmbResourceFilter.Location = new System.Drawing.Point(85, 314);
-            this.cmbResourceFilter.Name = "cmbResourceFilter";
-            this.cmbResourceFilter.Size = new System.Drawing.Size(255, 21);
-            this.cmbResourceFilter.TabIndex = 7;
-            // 
-            // label3
-            // 
-            this.label3.AutoSize = true;
-            this.label3.Location = new System.Drawing.Point(9, 9);
-            this.label3.Name = "label3";
-            this.label3.Size = new System.Drawing.Size(41, 13);
-            this.label3.TabIndex = 8;
-            this.label3.Text = "Folders";
-            // 
-            // label4
-            // 
-            this.label4.AutoSize = true;
-            this.label4.Location = new System.Drawing.Point(3, 9);
-            this.label4.Name = "label4";
-            this.label4.Size = new System.Drawing.Size(98, 13);
-            this.label4.TabIndex = 9;
-            this.label4.Text = "Resources in folder";
-            // 
-            // splitContainer1
-            // 
-            this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Top;
-            this.splitContainer1.Location = new System.Drawing.Point(0, 0);
-            this.splitContainer1.Name = "splitContainer1";
-            // 
-            // splitContainer1.Panel1
-            // 
-            this.splitContainer1.Panel1.Controls.Add(this.label3);
-            this.splitContainer1.Panel1.Controls.Add(this.trvFolders);
-            // 
-            // splitContainer1.Panel2
-            // 
-            this.splitContainer1.Panel2.Controls.Add(this.lstResources);
-            this.splitContainer1.Panel2.Controls.Add(this.label4);
-            this.splitContainer1.Size = new System.Drawing.Size(550, 282);
-            this.splitContainer1.SplitterDistance = 183;
-            this.splitContainer1.TabIndex = 10;
-            // 
-            // ResourcePicker
-            // 
-            this.AcceptButton = this.btnOK;
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.CancelButton = this.btnCancel;
-            this.ClientSize = new System.Drawing.Size(550, 352);
-            this.ControlBox = false;
-            this.Controls.Add(this.splitContainer1);
-            this.Controls.Add(this.cmbResourceFilter);
-            this.Controls.Add(this.txtResourceId);
-            this.Controls.Add(this.lblFilter);
-            this.Controls.Add(this.label1);
-            this.Controls.Add(this.btnCancel);
-            this.Controls.Add(this.btnOK);
-            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-            this.Name = "ResourcePicker";
-            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
-            this.Text = "Select Resource";
-            this.splitContainer1.Panel1.ResumeLayout(false);
-            this.splitContainer1.Panel1.PerformLayout();
-            this.splitContainer1.Panel2.ResumeLayout(false);
-            this.splitContainer1.Panel2.PerformLayout();
-            this.splitContainer1.ResumeLayout(false);
-            this.ResumeLayout(false);
-            this.PerformLayout();
-
-        }
-
-        #endregion
-
-        private Aga.Controls.Tree.TreeViewAdv trvFolders;
-        private System.Windows.Forms.ListView lstResources;
-        private System.Windows.Forms.Button btnOK;
-        private System.Windows.Forms.Button btnCancel;
-        private System.Windows.Forms.Label label1;
-        private System.Windows.Forms.Label lblFilter;
-        private System.Windows.Forms.TextBox txtResourceId;
-        private System.Windows.Forms.ComboBox cmbResourceFilter;
-        private System.Windows.Forms.Label label3;
-        private System.Windows.Forms.Label label4;
-        private Aga.Controls.Tree.NodeControls.NodeIcon nodeIcon1;
-        private Aga.Controls.Tree.NodeControls.NodeTextBox nodeTextBox1;
-        private System.Windows.Forms.ImageList resImageList;
-        private System.Windows.Forms.SplitContainer splitContainer1;
-    }
-}
\ No newline at end of file

Deleted: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -1,353 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Text;
-using System.Windows.Forms;
-using Aga.Controls.Tree;
-using OSGeo.MapGuide.MaestroAPI.Services;
-using OSGeo.MapGuide.MaestroAPI;
-using OSGeo.MapGuide.ObjectModels.Common;
-using System.Security.AccessControl;
-using OSGeo.MapGuide.MaestroAPI.Resource;
-
-namespace Maestro.Editors.Generic
-{
-    /// <summary>
-    /// A generic dialog for selecting folders or resource documents
-    /// </summary>
-    public partial class ResourcePicker : Form
-    {
-        const int RES_UNKNOWN = 0;
-        const int RES_FEATURESOURCE = 1;
-        const int RES_LAYERDEFINITION = 2;
-        const int RES_MAPDEFINITION = 3;
-        const int RES_WEBLAYOUT = 4;
-        const int RES_SYMBOLLIBRARY = 5;
-        const int RES_PRINTLAYOUT = 6;
-        const int RES_DRAWINGSOURCE = 7;
-        const int RES_APPLICATIONDEFINITION = 8;
-
-        private ResourceTypes[] _resTypes;
-
-        private ResourcePicker()
-        {
-            InitializeComponent();
-            _resTypes = new ResourceTypes[] 
-            {
-                ResourceTypes.ApplicationDefinition,
-                ResourceTypes.DrawingSource,
-                ResourceTypes.FeatureSource,
-                ResourceTypes.Folder,
-                ResourceTypes.LayerDefinition,
-                ResourceTypes.LoadProcedure,
-                ResourceTypes.MapDefinition,
-                ResourceTypes.PrintLayout,
-                ResourceTypes.SymbolDefinition,
-                ResourceTypes.SymbolLibrary,
-                ResourceTypes.WebLayout
-            };
-            cmbResourceFilter.DataSource = _resTypes;
-        }
-
-        private IResourceService _resSvc;
-
-        private bool _resourceMode = false;
-
-        /// <summary>
-        /// Constructs a new instance. Use this overload to select any resource type. If only
-        /// folder selection is desired, set <see cref="SelectFoldersOnly"/> to true before
-        /// showing the dialog
-        /// </summary>
-        /// <param name="resSvc"></param>
-        public ResourcePicker(IResourceService resSvc)
-            : this()
-        {
-            _resSvc = resSvc;
-            trvFolders.Model = new RepositoryFolderTreeModel(_resSvc);
-            this.UseFilter = true;
-        }
-
-        /// <summary>
-        /// Constructs a new instance. Use this overload to select only resources of a specific type.
-        /// You cannot select folders in this mode. Attempting to set <see cref="SelectFoldersOnly"/> to
-        /// true will throw an <see cref="InvalidOperationException"/>
-        /// </summary>
-        /// <param name="resSvc"></param>
-        /// <param name="resFilter"></param>
-        public ResourcePicker(IResourceService resSvc, ResourceTypes resFilter)
-            : this(resSvc)
-        {
-            this.Filter = resFilter;
-            this.UseFilter = true;
-
-            _resourceMode = true;
-            cmbResourceFilter.Enabled = false;
-        }
-
-        /// <summary>
-        /// Gets or sets the resource filter. If a filter value is specified, browsing
-        /// is locked to that particular resource type, otherwise al 
-        /// </summary>
-        public ResourceTypes Filter
-        {
-            get { return (ResourceTypes)cmbResourceFilter.SelectedItem; }
-            set
-            {
-                if (Array.IndexOf<ResourceTypes>(_resTypes, value) < 0)
-                    throw new InvalidOperationException("Cannot use specified resource type as filter: " + value); //LOCALIZE
-
-                cmbResourceFilter.SelectedItem = value;
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets whether to use a resource filter. If set to false, when selecting a folder
-        /// all resource types are returned, otherwise only children of the specified type are returned
-        /// </summary>
-        internal bool UseFilter
-        {
-            get { return cmbResourceFilter.Visible; }
-            set 
-            {
-                if (value && this.SelectFoldersOnly)
-                    throw new InvalidOperationException("Cannot specify a filter when SelectFoldersOnly is true"); //LOCALIZE
-                cmbResourceFilter.Visible = value; lblFilter.Visible = value; 
-            }
-        }
-        
-        /// <summary>
-        /// Gets or sets whether to select folders only. If true, the document view is disabled and 
-        /// <see cref="UseFilter"/> is set to false
-        /// </summary>
-        public bool SelectFoldersOnly
-        {
-            get { return splitContainer1.Panel2Collapsed; }
-            set 
-            {
-                if (_resourceMode && value)
-                    throw new InvalidOperationException("Cannot specify to select folders when dialog is initialized with a resource filter"); //LOCALIZE
-
-                if (value)
-                    this.UseFilter = false;
-
-                splitContainer1.Panel2Collapsed = value;
-            }
-        }
-
-        /// <summary>
-        /// Gets the resource id of the selected item
-        /// </summary>
-        public string ResourceID
-        {
-            get { return txtResourceId.Text; }
-        }
-
-        private void btnCancel_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.Cancel;
-        }
-
-        private void btnOK_Click(object sender, EventArgs e)
-        {
-            this.DialogResult = DialogResult.OK;
-        }
-
-        private void trvFolders_SelectionChanged(object sender, EventArgs e)
-        {
-            var node = trvFolders.SelectedNode;
-            if (node != null)
-            {
-                RepositoryFolder folder = node.Tag as RepositoryFolder;
-                btnOK.Enabled = false;
-                if (this.SelectFoldersOnly)
-                {
-                    txtResourceId.Text = folder.ResourceId;
-                    btnOK.Enabled = true;
-                }
-                else
-                {
-                    ResourceList list = null;
-                    if (!this.UseFilter)
-                        list = _resSvc.GetRepositoryResources(folder.ResourceId, 1);
-                    else
-                        list = _resSvc.GetRepositoryResources(folder.ResourceId, this.Filter.ToString(), 1);
-
-                    PopulateDocumentList(list);
-                }
-            }
-        }
-
-        private void PopulateDocumentList(ResourceList list)
-        {
-            lstResources.Clear();
-            foreach (var item in list.Items)
-            {
-                var doc = item as ResourceListResourceDocument;
-                if (doc != null)
-                {
-                    var li = new ListViewItem(doc.Name);
-                    li.Tag = doc;
-
-                    try
-                    {
-                        var rt = ResourceIdentifier.GetResourceType(doc.ResourceId);
-                        switch (rt)
-                        {
-                            case ResourceTypes.ApplicationDefinition:
-                                li.ImageIndex = RES_APPLICATIONDEFINITION;
-                                break;
-                            case ResourceTypes.DrawingSource:
-                                li.ImageIndex = RES_DRAWINGSOURCE;
-                                break;
-                            case ResourceTypes.FeatureSource:
-                                li.ImageIndex = RES_FEATURESOURCE;
-                                break;
-                            case ResourceTypes.LayerDefinition:
-                                li.ImageIndex = RES_LAYERDEFINITION;
-                                break;
-                            case ResourceTypes.MapDefinition:
-                                li.ImageIndex = RES_MAPDEFINITION;
-                                break;
-                            case ResourceTypes .PrintLayout:
-                                li.ImageIndex = RES_PRINTLAYOUT;
-                                break;
-                            case ResourceTypes.SymbolLibrary:
-                                li.ImageIndex = RES_SYMBOLLIBRARY;
-                                break;
-                            case ResourceTypes.WebLayout:
-                                li.ImageIndex = RES_WEBLAYOUT;
-                                break;
-                            default:
-                                li.ImageIndex = RES_UNKNOWN;
-                                break;
-                        }
-                    }
-                    catch
-                    {
-                        li.ImageIndex = RES_UNKNOWN;
-                    }
-
-                    lstResources.Items.Add(li);
-                }
-            }
-        }
-
-        private void lstResources_SelectedIndexChanged(object sender, EventArgs e)
-        {
-            btnOK.Enabled = false;
-            if (lstResources.SelectedItems.Count == 1)
-            {
-                var item = lstResources.SelectedItems[0];
-                var doc = item.Tag as ResourceListResourceDocument;
-                if (doc != null)
-                {
-                    txtResourceId.Text = doc.ResourceId;
-                    btnOK.Enabled = true;
-                }
-            }
-        }
-    }
-
-    internal class RepositoryFolder
-    {
-        private IRepositoryItem _item;
-
-        public RepositoryFolder(IRepositoryItem item)
-        {
-            _item = item;
-        }
-
-        public string Name { get { return _item.Name; } }
-
-        public string ResourceId { get { return _item.ResourceId; } }
-
-        public bool HasChildren { get { return _item.HasChildren; } }
-
-        public Image Icon
-        {
-            get { return Properties.Resources.folder_horizontal; }
-        }
-    }
-
-    internal class RepositoryFolderTreeModel : ITreeModel
-    {
-        private IResourceService _resSvc;
-
-        public RepositoryFolderTreeModel(IResourceService resSvc)
-        {
-            _resSvc = resSvc;
-        }
-
-        private System.Collections.IEnumerable GetSorted(ResourceList list)
-        {
-            //Sort them before returning them
-            SortedList<string, RepositoryFolder> folders = new SortedList<string, RepositoryFolder>();
-            foreach (var item in list.Children)
-            {
-                if (item.IsFolder)
-                    folders.Add(item.Name, new RepositoryFolder(item));
-            }
-            foreach (var folder in folders.Values)
-            {
-                yield return folder;
-            }
-        }
-
-        public System.Collections.IEnumerable GetChildren(TreePath treePath)
-        {
-            if (treePath.IsEmpty())
-            {
-                var list = _resSvc.GetRepositoryResources("Library://", ResourceTypes.Folder.ToString(), 1);
-                return GetSorted(list);
-            }
-            else
-            {
-                var node = treePath.LastNode as RepositoryFolder;
-                if (node.HasChildren)
-                {
-                    var list = _resSvc.GetRepositoryResources(node.ResourceId, 1);
-                    return GetSorted(list);
-                }
-                else
-                {
-                    return new RepositoryFolder[0];
-                }
-            }
-        }
-
-        public bool IsLeaf(TreePath treePath)
-        {
-            return !((RepositoryFolder)treePath.LastNode).HasChildren;
-        }
-
-        public event EventHandler<TreeModelEventArgs> NodesChanged;
-
-        public event EventHandler<TreeModelEventArgs> NodesInserted;
-
-        public event EventHandler<TreeModelEventArgs> NodesRemoved;
-
-        public event EventHandler<TreePathEventArgs> StructureChanged;
-    }
-
-}

Deleted: sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.resx	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/ResourcePicker.resx	2010-05-20 23:28:34 UTC (rev 4916)
@@ -1,711 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="resImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-  <data name="resImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
-        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADQ
-        EQAAAk1TRnQBSQFMAgEBCQEAAWABAAFgAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
-        AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
-        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
-        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
-        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
-        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
-        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
-        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
-        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
-        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
-        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
-        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
-        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
-        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
-        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
-        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
-        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
-        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
-        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
-        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
-        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
-        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
-        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
-        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
-        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
-        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
-        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
-        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
-        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAAfAIBwG8Af81AAG8
-        CPMBvAH/NQAB8AH0BvMB9AHwNgAB8AH/BvQB/wG8A/8zAAHxCP8BkgIHAfAzAAHwAgcD7wL3AZIB7ALz
-        AbwzAAHxAfAB8QHwAbwBBwO8Ae8B8wH0AfAzAAH0AfIB8QXvAQcB8gH0Af8BvAP/MwAB8Qj/AZICBwHw
-        MwAB8AIHA+8C9wGSAewC8wG8MwAB8QHwAfEB8AG8AQcDvAHvAfMB9AHwMwAB9AHyAfEF7wEHAfIB9AH/
-        AfA2AAHxCP8B8TYAAfACBwPvAvcBkgG8NgAB8QHwAfEB8AG8AQcDvAHxNgAB9AHyBvEB8gH0QAAM/wcA
-        AbwIBwG8AwAB9AG1CLQBtQH0BAAQ/wG8CgcBvAQAA/8BBwj/AQcE/wG0AdwBGQTbAQkB3AG0Af8EAAG8
-        Au8MrgG1AbwB/wj0Af8BBwL/AgABBwPvAfIBswEJAbsCbAGLAfID7wEHAQABtAIZAQkBGQIJARkBCQG0
-        Bf8BBwHzAfIBiwmzAdUBrQGRAbwB9AQqATABNwEwASoB9AHsAQcBvAIAAwcK6gMHAQABtAHbAgkB2wEJ
-        AdsBCQHbAa0DtAG1AfQBvAHzAfIBiwHbBrMBtALbAbMBtAG8AfQFMQFYATcBMQH0AfcB/wEHAv8BvAEH
-        Ae8BbQLtBuwB6wIHAbwBAAG0AdsBCQHbAdwB2wIJAdsBswHbAQkB3AG0AQABvAHzAfICtAOzArQBugG0
-        AbMB3AHbAbQBvAH/AREBFQFLAVEBeQGgAeUBWAH/AbQB9AHsAQcBvAHwAQcB9wEQCBIBEAGSAe8B8AEA
-        AbQB2wEZAtsB3AHbAQkB2wGzAQkBGQEJAbQBAAG8AfQB8wEJAbMBtAG6AQkBuwG6AQkBGQG6AQkB4QG0
-        AfAB/wFEAUsCWAFZAeUBWQFYAf8BtAH0AfcB/wG8AfEB8AEHAUMBEgcUAUMB5AEHAfEBAAG0AdsCCQPb
-        AQkB2wGzAdsBCQHbAbQBAAHwAfQC8wG0AboBuwIZAgkEGQG0AfAB/wFSB1gB/wHvAf8BSgH0AbwB8wK8
-        ARQBbQIUBBUCFAHvAQcB8wEAAboB2wEZAdsB3ALbAQkB2wGzAgkB2wG0AQAB8AP0AfIBtAG7AQkBGQIJ
-        ARkC4gHcAbsB8AH/CDEB/wEHAf8BUQH0AbwB9AG8AfEB6gHrAW0B6gESARQBFQFDARMB6gIHAfQBAAG6
-        AdsCCQHbAdwB2wEJAdsBswHbAQkB2wG0AQAB8AT/AfMCugMJAhkB2wG6AvAK/wG7Af8BUQH/AbwB/wHw
-        AfMBbQjsAW0B8gHwAf8BAAG6AdsBCQHbAQkB2wOzAa0B2wEJAdsBtAEAAfAG/wEZAtsB1ALbARkB/wHw
-        AfMB8QHvAbwCswG0AbMDtAG7Af8BUQH/AfAB/wHyAfEB9wjrAfcB8QHyAf8BAAG6AQkBGQMJAbQB/wK0
-        AdsBCQHbAboBAAHxDv8B8QIAAfAK/wFRAf8B8AMAAfAB/wL0AvMC8QH0AfAEAALbAQkD2wO0AdwB2wEJ
-        AdsBugEAAfADBwbvA/cCkgG8AgAB8wHxAe8BvAhRAf8B8AMAAfAB/wH0AvMB8QP3AbwEAAEJA9sC1AHV
-        AbQBCQHbA7MBtAEAAfEB8ALxAvACvAIHBbwB8QQAAfAK/wHwAwAB8AH/AvMC8QHvAf8B8AH/CAABugEJ
-        ARkDCQG0Af8B8AH0AQAB9AHyDPEB8gH0BAAB8wrxAfMDAAHxAf8E9AEHAfEB9AkAAtsBCQPbAbQB8AH0
-        JQAB8wbyAfQKAAEJBtsB9AMAAf8B9AG8CgcBvAH0Af8F9AHzAfABHANuARwB8iL/AQAC/wEHCv8BBwL/
-        AhEB7wEHAfABHAFzAXQDmgJ0AZkB8wEAAf8B8wy8AfMB/wG8DQcBvAMAAbwK/wG8AgACZgHyAQcBcwF0
-        AXkCdAJLAXQBmQJ0ARsBAAHxAfAK8gHwAfEBAAEHAf8L9AH/AQcDAAG8CP8B9AH/AbwCAAFmARUB8QGS
-        AZoEdAKaAUsBdAKaAZkBAAHwDPIB8AEAAbwB9AZzAngBHAKZAfQBvAMAAbwH/wL0Af8BvAIAARIBZgHz
-        AfcFmgF0AUsBcwEcAnQBGgEAAfAM8gHwAQABvAH0AXMBHAF4AXMCeAGZARwBnwHDAQgB9AG8AwABvAb/
-        A/QB/wG8AgABrgHqAf8B7wOaAZkBdAFzAZIB7wEHAfABvAIAAfEM8gHxAQABvAH0AXMBHAF4AXMBeAKZ
-        AZgBnwEbAQcB9AG8AwABvAX/BPQB/wG8AgAC6gLxA3QBkwG8AQcB7wEHAbwB8QHwAgAB8QHzC/IB8QEA
-        AbwB9ANzA3gBmAKZAQgBuwH0AbwDAAG8BP8G9AG8BgAB9AHvApIE7AHtAe8B9AIAAfEB8wvyAfEBAAG8
-        Af8BcwN4ApkBnwGZARsBGQG7Af8BvAMAAfAD/wX0AfMB9AHwBgAB8QHyAbwBBwHvAvcB7wG8AfEB8AIA
-        AfED8wnyAfEBAAG8Af8BcwN4ApkBnwGZAfEB3AG6Af8BvAMAAfAC/wX0AvMB9AHwBgAB8QHyAbwBBwHv
-        AvcB7wG8AfIB8AIAAfIG8wfyAQAB8AH/AXMBeAGZAXgBmQGfAcMBCAEJAdwBugH/AfADAAHwAf8F9ALz
-        AfEB9AHwBgAB8QHzAfEB8AG8AgcBvAHwAfMB8AIAAfIB9ArzAfQB8gEAAfAB/wN4A5kBCAK7AroB/wHw
-        AwAB8AH/BPQC8wLxAfQB8AYAAfQB7wKSBOwB7QHvAfQCAAHyAfQK8wH0AfIBAAHwAf8BeAOZAcMBGwHx
-        AbsC3AG6Af8B8AMAAfAB/wP0AvMB8QP3AbwGAAHxAfIBvAEHAe8C9wEHAbwB8gHwAgAB8gH0CvMB9AHy
-        AQAB8AH/AXgDmQHDAcIBCQG6AdwB2wG6Af8B8AMAAfAB/wL0AvMC8QHvAf8B8AH0BgAB8QHyAbwBBwHv
-        AvcBBwG8AfMB8AIAAfMB8gr0AfIB8wEAAfAB/wF4AZgCmQEIArsDugG0Af8B8AMAAfEC/wX0AQcB8QH0
-        BwAB8QHzAfEB8AG8AgcBvAHwAfMB8AIAAf8B8wryAfMB/wEAAfEN/wHxAwAB8wjyAfQIAAHyCfEB8hEA
-        AfMN8gHzAQABQgFNAT4HAAE+AwABKAMAAUADAAEwAwABAQEAAQEFAAGAAQEWAAP/AgABHwcAAR8HAAE/
-        BwABBwcAAQcHAAEHBwABBw4AAeAHAAHgBwAB4AcAAeAHAAH8BwAB/AcAAfwHAAH8BwAC/wEAAQ8B4AEH
-        AQABDwMAAQ8DAAEPAwABAwIAAYAEAAEDAgABgAcAAYABAQYAAYABAQYAAYABAQYAAYABAQYAAYABAQYA
-        AYABAQYAAYABAQIAAcABAAHgAQcBgAEBAgABwAEAAeABBwGAAQECAAHwAQAB4AEHAfgBAQIAAfABAAHg
-        AQ8B+AEDBP8B4AEfAfgBBwcAAQEDAAEBAwABAQHAAQMCAAGAAQEBAAEBAcABAwIAAYABAQEAAQEBwAED
-        AgABgAEBAQABAQHAAQMBAAEBAYABAQEAAQEBwAEDAQABAQGAAQEBAAEBAcABAwHwAQEBgAEBAQABAQHA
-        AQMB8AEBAYABAQEAAQEBwAEDAfABAQGAAQEBAAEBAcABAwHwAQEBgAEBAQABAQHAAQMB8AEBAYABAQEA
-        AQEBwAEDAfABAQGAAQEBAAEBAcABAwHwAQEBgAEBAQABAQHAAQcB8AEBAYABAQEAAQEBwAEPAfABAQL/
-        AQABAQs=
-</value>
-  </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        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
-        AAD8PwAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAATDwgACxsFABgS
-        BwAADhMAARYdACUOCgA2FQ4AKhUUADwQEAAMIwsAGD8GABkkEQARMhUANigIAD8wDgAnIxQANioXAAAd
-        JwAMJy0AAiw6ADYvIQAuOCwANTMvACAwMQBFHhUAQT42ABpQGgAkWQIAI0sQACx0DAA1dwYAK3kYAD5+
-        HwATUC4AJF8kADhcLAAebDsAJX44AGxTGwBCfA4AUkQjAFpXOQABOUgAAkFPAAFDVgASSlYAGndJABdy
-        WQA2Zl4AKn1VAAFVcAA9WGwAEm5hABBzZQAEYXkAGmF5AAlzfQA/YHcAUk1OAHxRUwBRcEMAemZWAExV
-        YwBlYmEAnCwqAJ8wKwCMLzEAnjAwAKQ3KwCjOjYArEEsALJKLAC3US8ArEY3ALJMNQC4VTcAiG83AKtK
-        RQCrUUkAtVdHAK9UUwCyW1kAkXxAAK1kTQC7ZVQAn312ALhmYwC/cGUAu3l3AMVyVwDEeGkAwnx5ADeI
-        BgA3jRMAOJIXADWNKQA4myYAKogzADWYPgA5ozcAQ4sLAEmOEgBViRgATZIYAFaUGQBnmR8AW5ooAFeL
-        OQBmmyUAcZ8qAGiaNwB0oS0AZ6A1AHmmOgAbg18AIYZMADWeQQAkjVQAKptbADmsRwAuoFgAG4ZmAC6D
-        awAklWUAd5NTAHalSgBWgn8AfZ9hAHaZdwCIqTkA/LkeAMyfOADcoygA26k6AOerJgDssS0A/rwnAOKs
-        MwDvuj0A/78wAP7BNwCZnksAmZpWAK+OQgCzkkkAvJ9eAImsRACXsEgAiKhcALi3RQCtrV8AoLlcALK7
-        WQCtmnsAt5pzAIKlZgCapW0AmbhhAJuwfACjoWoAqLFpAKugdwDJoEEA3KxEAN+xTADEt1kA2rFWAOm5
-        TgDnulcAyoVrAMqIdQDQjnoAw5J2ANCQfQDBtmgA1L1tAOi/ZAC6wmgAvMVzAMvDXgD+xkYA/MpXAP/Q
-        XgDHxGcA2sVpANnNdgDpxWkA+8xjAP3QaQDnyXsA8ct3AOzRcwD91HYAAmiIAAd2iAAAbpMAB3GRABp5
-        kwAle4gARWyCAGR6iAAvgpMAR4aBAG6VigB5o5YAup2FAI6nhACYqYUAjKyaALihhwCttYUAurCFAKq4
-        lwC/v58AyImGAMqUiQDUmYgAzZSSANOckwDLo4YAz6yfANillwDfsqMA47+zAKnGgQC9xJ8AxMeMAN3H
-        jADFyZUA2suTAM3UlgDc15MA59OFAPzYhgDv3JsA+9uTAP3hnADLwqQA1sOkANnYpQDWzrQA7d6sAOfG
-        uADs1roA+N+yANfgtQD946cA/ui5ANrSyQDu08MA89zGAPvpxQD56dMA/vHVAP///wAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAA2tfX2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxOQkJC
-        QkJERERBRE5ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANdOQkJCSlJc19ra11tSREFEQUbX
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXR0ZQW976/vz39+3t7ff8/vTXT0RERNcAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAE5HT62VaOfsu6mlpIaGpKSoscHt/PNXREFGAAAAAAAAAAAAAAAAAAAAAAAAAADX
-        R0JY02VeXiiOp6SKiIiIiIeFhYWkqer481FBRNcAAAAAAAAAAAAAAAAAAAAAAFhHRdv+nl1jY2Afgry1
-        jY2MjIyJiYiHhYWp6vzXREFXAAAAAAAAAAAAAAAAAAAAVUVL8/jqlx5jeHhkXZS3tY2NjY2MjImDiYeH
-        irz34EZEUQAAAAAAAAAAAAAAAABYR07797+nsF1keHh4ZGWZt7W1jY2NjIyJiYODh4eo9/FXRFcAAAAA
-        AAAAAAAAANdHS/v3u6m2wW5eeHh4eGRdlMG1tY2NjY2MiYmDg4OHu2aVUkFcAAAAAAAAAAAAAEdK8/i7
-        sba2vbpdeHh4eHhkXW7AtrW1jY2MjImJg4ODqGddnU9EAAAAAAAAAAAAUEfe+L+xtry8vexlZHh4eHh4
-        eF5wwbW1jY2NjYyJiYODtmVeXZpGRgAAAAAAAABWBwYXFRERERERERUCCg0jeHh4eHhduLe1oycPDg4O
-        Dg4OEQICAgwICVkAAAAAAAAZAAAAAAAAAAAAAAAAAAAADXh4eHhhasGjAwAAAAAAAAAAAAAAAAAAAEMA
-        AAAAANgZEhISEhISEhISEhISEgUACnV4eHh4XbqQAAQFEhISEhISEhISEhISBUPXAAAAAEvExMTExMTE
-        xMTExMTExMTCMHh4eGRfXbKxMcTExMTExMTExMTExMTExDRGAAAAAEjExMTExMTExMTExMTExMTExXhk
-        ZWWUsuqwxcTFxMTExMTExMTExMTExDpEAAAAq0jExMTExMTExMTExMTExMTFfGQfoeS+u7G7gcXExMTE
-        xMTExMTExMTExMhEWQAAUEj54p/FxMTExMTCMnR3d3l4dQsAAQAAAQGRvLGvnyZ2NsXExMTExMN8YpxO
-        RgAASEz+7b7FxMTExMQ4IWF4eGRkHAAEBAQEBAQQp7e9gl94JcLExMTExMN4ZHFXRAAASFv+7L7FxMTE
-        xMQ3Hl1dXV0fAS3ExMTExMQrKbbqXmR4JcLExMTExMN4ZF3XRAAASK786r7FxMTExMQ3bOPw8PQaK8TE
-        xMTExMTEFE3pXWR4JcTFxMTExMN4eF2tRADZSN746unFxMTExMQ31vj49T4UxMTExMTExMTEwhOSgl94
-        JcLExMTExMN4eF3SRNeuSN/46unFxMTExMTC7vj4mhPCxMTExMTExMTExDcWr2VfJcLExMTExMNfX13S
-        RlyuSN/495XFxMTExMTCleXuGDfExMTExMTExMTExMQzKrlqI8LExMTExMeWgnDdQlzZSN78k17ExMTE
-        xMU3Hm87M8TExMTExMrKxMTExMTEM1OyG8LExMTExMe2wfjeQtcASN7hXV3ExMTExMQ3IB0zxMTExMTE
-        yubjxsXExMTExC6OIzfExMTExMpqamveQgAASdldXV3ExMTExMQ3JSvExMTExMTG5ezq08bExMTExMQi
-        G8LExMTExDldX12tRAAASatlYXXExMTExMQ3K8TExMTExMXV7Orq6s/ExMTExMTCK8LExMTExDlkYWtY
-        RAAATFpvYXjExMTExMTExMTExMTExNHs7Orqwb/MxMTExMTEwsTExMTExMN4X5VPSgAAqlCPXXnFxMTE
-        xMTExMTExMTEe/L37OrqwcG8y8TExMTExMTExMTExMN4XaJKWAAAAEytXWTExMTExMTExMTExMQ2XWVy
-        6+rBwcG9ucfExMTExMTExMTExDlfaK1CAAAAAExUJCLFxMTExMTExMTExDl1ZGFds+rBwby8t6bCxcTE
-        xMTExMTExDkbPU9GAAAAAK04xMTExMTExMTExMTExXl4ZF2T7MHBvby3traPwsTExMTExMTExMTExD9Z
-        AAAAAADExMTExMTExMTExMTEdnh4X3LswcHBwby2trW1fcTExMTExMTExMTExDQAAAAAAADGxMTExMTE
-        xMTExMQlZF1dXenBwemTmcG3tbW1izHExMTExMTExMTExMwAAAAAAAAAPkB/L3p6ejLNgdBoXWVllOrB
-        6WhfXbC3t7W1jYZ9fYB9gICBzck7PAAAAAAAAAAAAElbcl54ZGbqweqZZmVdaerqlF54YWWUu7e1jIyM
-        iYmDibXq+kpHAAAAAAAAAAAAAKtJqm9deF1xuOxyXWFfXXHqaV94eGRfZYK5toyDiYOMter7T0dcAAAA
-        AAAAAAAAAABaTKtvXWRdXWqyXWRhZYLqgl14eHh4ZF9dpo2JjIy16vtVR1UAAAAAAAAAAAAAAAAAWkyq
-        cl1dXV3pal1dmb3Ba2F4eHh4eHhfcLWMjbf3+lBFUAAAAAAAAAAAAAAAAAAAAFpMW9T2aF3pcG24vbe5
-        XXh4eHh4eHhkZbS3wfjfS0dVAAAAAAAAAAAAAAAAAAAAAACqSUzZcl3o7cHBwcFuX3h4eHh4eHh4X4L4
-        +6pHR1sAAAAAAAAAAAAAAAAAAAAAAAAAAExMWtz9+PiYZWhdeHh4eHh4ZGFlZZXeS0dKAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAACsSUlMqvOTXV1dXV9dX2VdZnKdrVVLR1sAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAKpMSUxarZuboaCgoZubq1pMS0urAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtMSUlM
-        TExMTExJSEtYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADerKurrNkAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAD///w///8AAP//gAH//wAA//wAAD//AAD/8AAAD/8AAP/gAAAH/wAA/4AAAAH/
-        AAD/AAAAAP8AAP4AAAAAfwAA/AAAAAA/AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAA
-        AAAABwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
-        AACAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAACAAAAAAAEAAIAA
-        AAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAH
-        AADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/g
-        AAAH/wAA//AAAA//AAD//AAAP/8AAP//gAH//wAA///4H///AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
-        AAAAAAAAAAAAAAABAAAAAQAAAAAAAAoIBAAcCwkACRcGABIXBQAAExkAJBsJACQcEwAkIR0AAiYtABkv
-        LgAeMjYAXyIkABxJCwApYw0ANW0SABpPIQANTj4AIGQkACp9NABYRBcARUgxAGpGPwB6YiwAB05VAB9X
-        XgAee0cADWNZAANXawAAV3QALF52ABZmYAADYXgAHm97AAhxegAmbnEASU5FAHlFRQBWe18Af3RLAJws
-        LACfMzIAojUtAKc7LgCpPi8Aozk3AKxCLQCySS4ArEQzAKZBPgCqRDkAr0s7ALJMNAC6VzcAh0hIAINb
-        TgCnRkUAqUZDAKtJQwC4XUkAr1ZWALJbWQCUdE0AvWRNALdhVwC2Yl8AuGVeAKFwXACwdV8AhH9uALZk
-        YgC6amUAumxrAL9wZQC/f2MAtXdrAL5xawCyf2wAvXJwAMFpTADBbFUAw3NYAMBxZADGemQAxHpsAMl+
-        aADCenYAwXt5ADeGAAA3iQYAPIgFADSECAA7gw8AN4oMADuLCwA2jhIAPI4SADiTGAA4miYAKIY0AC+R
-        NQA2mDAANZY/ADabOAA5oC8AOqc+AEWMDABEjBMASIkWAEaRFQBUkxoAV44iAFiXIgBCjDYAYJAiAGad
-        KAB/misAZZ02AHGWOQB5pDUAJIRAADKFQQAql1UAMJ9RADqrRwAuoFkAMaRUACaWYABimkQAfpNAAHSd
-        QQB6mEcAZ4VqAIalNQD7uB4A3KUuAN+sOwDtriMA4KcqAOOqLADxsSEA/rskAP6+LADjqzEA7LQyAP/A
-        MwD/wToAiJlHAImWVwCZnFwApp9HALGQRwCrjF4ArZtWAIyvVQCKtFwAnLZUAKaiTwCmtEkAsrdKAKW3
-        VAC4u1IAs7xZALq6XACaj2EAt4diAJa2ZwCup2YAuK5jAKayYAC/tm4A3K1CAMi7RgDes1UA6rpMAOm9
-        WQDKgGgAy4d0AMOxYADlvGYAxsFZAP7EQgD/x0gA/chLAOzIVwD8ylcAycNhANzGaADJyHMA1sd1AO3A
-        YAD+zmIA/dFrAO3MegD2z3YA6NF4APzUeQACZ4cABXOJABZ2jQAAbpMABHCSAC1rhgA8eYUAPHeQADKB
-        igBSj4wARY2WAGWalQB3oJAAioiKAImpkwClsoQAtreDAMuOigDOkIQA0paFANSZhQDUnI4Ay5GSANKc
-        kwDIqY8A1qGRANmmlgDfsJkA2rymAMnPkQDlyoIA8c+CAOvSgwDz1IIA/taDAPXVigD+2owA69mWAPTX
-        kwD62pIA+dyZANvLpQDnwawA6MSpAOzJqwDk3KkA6siwAPLXtwD23bMA9t67AO/hpwD74qYA/eSsAP7m
-        sgD75roA/ei4AOHbxAD+68EA////AAAAAAAAAAAAAAAAAAAAV0hIVwAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAEwqKjpCTExBOSgoSAAAAAAAAAAAAAAAAAAAAAAAAEAyRN32+evk5Oj49d89KDwAAAAAAAAAAAAA
-        AAAAANwrTINgb7Krj4+Li4eIr+zwPSjbAAAAAAAAAAAAAABULN77XGZna6G1kpGRjo2Jiq7t2ihIAAAA
-        AAAAAAAAVDDv7LNyfHx8bru1kpKRjo6NjI/C4ThIAAAAAAAAANww7+ivuaJhfHxpbbS5kpKRjo2NhpCF
-        lDHbAAAAAAAALt/svr+/5mF8fHx8YaG5tZKRjo2NjXRdpCkAAAAAABYCCAcGBwYHAwMQfHx8bcCrFAYG
-        BgYGBAMDAjYAAAAABwUFBQUFBQUFBQFjfHxonxcBBQUFBQUFBQUFDAAAAFPIyMjIyMjIyMjIxXtpYmGf
-        p8XIyMjIyMjIyMgeRgAAL8jIyMjIyMjIyMjGe2yp48Oqx8jIyMjIyMjIyMopAAAv/dXJyMjIIWN9fnwN
-        AAEAAZe+vXF6IMjIyMl+gDgA2j/+5MnIyMgbYWFhDgkcHB0cCq26YXwcyMjIxnxtRtaxsPrkycjIyB/i
-        8u4LxcjIyMjFFaNiaSDIyMjJfGFLTlOx+eTJyMjIy/v1JCDIyMjIyMggJ3BlHMjIycZiYU1GU7H7m8jI
-        yMgjpkUdyMjIyMjIyMgcmXIcyMjJx6ycV0exsaZeycjIyBsPHMjIyMjT0cjIyMgZkxzIyMnHhZxXTN6w
-        XmHJyMjIHBjIyMjI0OzozsjIyMgRHMjIycZhbUTbAE9ufMjIyMjFycjIyM/r7ObBzcjIyMXFyMjJxnx1
-        MwAANYFnyMjIyMjIyMgipurpxMS7x8jIyMjIyMnGYpQsAABTPhLIyMjIyMjIyWRhcOnEwL+oyMjIyMjI
-        yckOQ0IAAADFyMjIyMnJych6fGG8xMS/ubmUyMjIyMjJyMgeAAAAAMnIyMjIycnIGmhhnMTkosK5t7Um
-        yMjIyMnJyMwAAAAAADeEeH951NVwXlrD53NhhcC3kpCdnZad1NIlAAAAAAAA2U92aGGg6HdhYYW9YXxi
-        bZ64kY2NjsDxNNcAAAAAAAAAsFF2YV1tnGFhnsNefHx8aG23jpHA8TNEAAAAAAAAAAAAsE+Vm168bp+/
-        n2J8fHx8Yp+57OA0UwAAAAAAAAAAAAAA2TWld/fpu7RufHx8fHxoc/VULtcAAAAAAAAAAAAAAAAAAE81
-        sfF1WV1iYmFhcJOYND8AAAAAAAAAAAAAAAAAAAAAAABTNU+lpZmYpaVPNVIAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAANmwUVGw2gAAAAAAAAAAAAAAAAD//D///8AD//8AAP/8AAA/+AAAH/AAAA/gAAAH4AAAB8AA
-        AAPAAAADgAAAAYAAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAGAAAABwAAAA8AA
-        AAPgAAAH4AAAB/AAAA/4AAAf/AAAP/8AAP//wAP///gf/ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
-        AAAAAAAAAAEAAAABAAAAAAAABg8DAAQMDAAXCAYAGQkJAAkQBAAHFggAGxQEABASCAAaFQoAGxgUADs1
-        HgANNT0ACD07ABpNIAAiQCUAVEEWAHRpPAAARV0ACVJWABBeUgATZ08AD2BSABJhXwAaZF8AHnFdAB16
-        WwAicEwALmVdAC92WgAIVW0AF1poAANYcgAAXXoAD2liAAxqbAAHbXkAD3x8AHBMVgB3WlcAWVpgAKM9
-        PQCvSjwAsE08AI5OUgCZV1MAp0VFAKlIRwCsTksAs1hPALleSwCvVFMAr1ZWALJaVwCyW1kAs11ZALVf
-        XACYYV4AlWpbAJF7UAC9YEIAs3hPAK5mVQC3YFUAu2VTALBrVwC2YFgAtWBdALR1VQC6bGkAoHNkALxx
-        bwC+c3AAwGlKAMJuVADDcFcAwnBYAMZ6ZgDJfGQAyH9rADSGCAA5kRUAOZQaADWMJQAzjysAN5cnADqX
-        IAA4mSMANpgsADmfLgAxjD4ALpI7ADSaNgA3nj0AOaEyADegOAA5pTsAOqg/AECLCgBBhxAATpMWAEaX
-        HwBLlh4ATJUfAFSWHQBEmCIASpkiAFGbJABcmiMAZ54pAGWbNQBumD0AdZI5AHKRPQB4kT0AZqAsAH2k
-        LwBmoDUAKpFGAC+YRQAxmkEAOqtEADOjTgA5rEgAfotFAHiTRABshFsAU4t/AICpPAC8pz8A1a45AO+x
-        JADxsiIA/rshAPu6KAD+vigA/78tAOauMgDirDQA4a04APi+OAD+wDEA/sE1AP/COgD+wjwAjodCAI+I
-        RgCMhk8Ajo5MAJKATgCUjUsAjJNKAIyTUgCwgVUAgKNCAIGtTgCSrkQAmK9DAI+wVQCNsFgAoqZKALyn
-        QACrtkoAtbZCAKK2UgC3vFUAiYJsAJeZYACSnm4Ao6NnAKSzYgCnu2UAuLlkALy0aAC3t3oAtbl8ANWx
-        SADhsEQA5rZMAMqAagDKiXwAzIx+AMu3YADEvWgA1rxpALvAYADNwFAA18RZAP7FRADyx04A/slOAOLF
-        VADkx1kA78RbAPfKVwD/zFIA9MVbAM7FZQDXy3UA7sNgAOvDZADpx28A/s5jAPXPaAD6z20A8813APDK
-        eADyzn4A/tRyAPrUewAAY4MAD22FAAFtjwALe4UAA3KMAA10jQASdY4AAG6TAARwkwAMdJMALHmAACJ7
-        jAB9n4MAaJKQAJ6OhwCPrJcApLOMALm6gwCyu5MAiK67AMuQjgDRmoUA1JqJANafkQDYoI0A26aPANyp
-        jwDfrI0Aw7aJAN2rkADkuJQA5ryWAOO3nADlu58A6L6YAM7KhwDPxo0A7NOBAPLThAD91oEA89SIAPvZ
-        jgDsyqwA/uOhAP3kuAD///8AAAAAAAAAAAAAAEhDOEcAAAAAAAAAAAAAAAAAAAAAADFDte/w8O+1MC8A
-        AAAAAAAAAAAAAAA/QXFuuLGLiouyz/A4MwAAAAAAAAAAACvq9VNdZ7+PjoiIg4rN5ykAAAAAAAAAK/LP
-        yGV7YWzAvI+IiIWEx6cuAAAAAABA6s/Hypxhe3tpu7yPjYiFjWOTMwAAAAADCgkHCQgGDnthc8cQBwcH
-        BwEFBAAAACcSEhISEhISDXt7UrYMEhISEhISEiwAACjZ2dnZ2dnZ1Viat8nd2dnZ2dnZ2SYA6ef22dnZ
-        GXd6VAYCAgvBrFsj2dnZd5XmT/P42dnZG5ufD9LZ2SERnWEi2dnWYXxFTPz429nZ3/6mIdnZ2dkglFYi
-        2dnWXn04S/ye2dnZHage2dnb29nZH6AW2dnYuu41s6lQ2dnZFRPZ2dvk4tnZ2RwU2dnXZJhF6pFf2dnZ
-        IdnZ2eH7+d7Z2dkh2dnWXpXmAD1V2dnZ2dnZGqv70cx/2dnZ2dnWUj8AADoX2dnZ2dklYGf30MrH3NnZ
-        2dnZGC0AAOXZ2dnZ2SRfUcbRxcq+sNPZ2dnZ2QAAAABGfnZa46piaPmAVqLCj4Khoa3gOQAAAAAASXFX
-        baRSUbloYV5ro4iIw/QrAAAAAAAAAEmXdZxsostpe3t7ar3Q7ysAAAAAAAAAAABLma79pXRhe3thUq5N
-        MgAAAAAAAAAAAAAAADxOlnFvb3KSRDIAAAAAAAAAAAAAAAAAAAAA6E5LS03oAAAAAAAAAAAA/8P/AP4A
-        fwD4AB8A8AAPAOAABwDAAAMAwAADAIAAAQCAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABAIAA
-        AQCAAAMAwAADAOAABwDwAA8A+AAfAP4AfwD/gf8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
-        AAAAAQAAAAEAAAAAAAAEFQ8ABRQQAA0WEAASFxAAERgVABEZGAAuHx4AAis4AAQsOABEIiQAH10nACFe
-        IQBsViIAHX1UACN5RQA8eE0AP31QAARdbwAEX3MAB1p0ABFdcAAZfWAANWxsACNldwB+e0AAp2pPAKx6
-        SwC4ZV4Au35dALVuZgC6amcAu29qAL1wbwC/dHAAvnV0AMh8ZgDIfmkAwHh0AD2VIgA4miUAP5okADSa
-        NgAykzkAOqAxADmjNABRlR0ARZkoAFqCOgBDnT0AYoA6AHSXOgBAoDIAS6EwAFShMABfpDIAWKA3AGKh
-        LwB2pDQAfqo+ACCHVgA4okEAOqlBADqsRgA6rUgAGoZrAECTTQBvgkwAdJZBAHeQZABgjnoAgYw/AIyq
-        MgCDrD4Akaw/ALurLgDTrjcA8rQmAP67IgD+vi0A/8E2APbAPgD/wjsAg45JAKePSgCKrkAAhalKAJ60
-        SwCerlQAobJDAKS0SQC5t0QArrZXALGRewCWtmEAqqxwALy9eADStEkA7r1OAOu+WgDrv14AyoFqAMqC
-        bgDKh3QAzIt0AMmHfADPjHgAz5V2ANeefwDcp3cA3qV5AO3FTwD2xUkA/spSAM/IcwDpymUA6ctoAPLH
-        aQDrxHEA7dJ7AP7TdAACb44AFWqKABtsigADcY4AAG6SAARukAAAb5QAAnGRAAxzkAARdpQAHnuSACN+
-        kwCGpYwAxYOEAMyMggDTloIA2qKCAMC1kQDNwoQA1MmSAOTHggDqw5UA9tuZAOLUogAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAP///wAAAAAAAAAiHx8hAAAAAAAAAAAAABpTjWRkdm0cAAAAAAAAh2xYPTlwUE9NYmuG
-        AAAAAIl1cyw/N29ST05LGQAAAAcGBQUBC0BVDQQEAwIKAAB9fX19fUE3XEZ9fX19egBmkH19DyoMCAhU
-        VhZ9gDEiJY+Af4WKFH19FTMOfYAoHmZefX0RGH2Eg30XEX2BWiBqJ319FICCjIuBfRR9gC8mADB9gH+A
-        QnJ4X319fX0yAAB9fX9/PDZ3dHFFfX19ewAAAEMrYC46VzVbUUxhXQAAAACIRy47WUlAP0hxbmkAAAAA
-        AAAbjkooLDREJQAAAAAAAAAAAABqHR1nAAAAAAAA/D8AAPAPAADAAwAAwAMAAIABAACAAQAAAAAAAAAA
-        AAAAAAAAAAAAAIABAACAAQAAwAMAAMADAADwDwAA/D8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAChMSsCoDErHKAwK0ifLytqny8rgZ4uK4yeLiuMnS0qgZ0t
-        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
-        K/83jg//O61I/zuuSf87rkn/Oq1I/zmgMP84iAT/mLBG//zUcv//ylD//8VC///DPv//wjr//8E2///A
-        Mv//vy7//74p//+9Jf//vCH//7sf//e2H//mqyf/6cJr/0uOEf+HpFv/slxb/5wsLP+bKiqWAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq0ArVatAK/2tRDH/6Me5/v7mrv7ux3L/6Lta/vnI
-        Wv/+zFv+/tBm/t7Pev43hwL/OqtE/jqtSP47rkn/Oq1I/jqtSP46pTr/N4oI/mydKP7s0XP//spR/v7G
-        RP7/xED//sI7/v7BN/7/wDL//r8u/v++Kf/+vCX+/rsh/v+7Hf/8uR7+67tN/lWJGP83hgH+mqVt/qtN
-        TP+bKir9mysrVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACINCIVrEEs56xBLP/Xo5b//+u9//PO
-        fP/rvl///Mtf///OYf//zmP//9Bn//zbjv8+iQb/OqY6/zuuSf87rkn/O65J/zuuSf87rkn/OqpD/zeP
-        Ef9zoS3//tR0///IS///x0X//8RB///CPP//wTf//8Ay//+/Lf//vSj//7wk//+7IP//ux7/+8xW/0GB
-        CP82jR3/PYoI/6+be/+jPDz/mikp54YkJBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeJBiXNhUO/iUO
-        Cv41My//Ni8h/jIpFv40KhT/NiwV/jYsFf82LBb+Ni0Z/jMuH/4MHQD/DCML/hEyFf4gXyj/NqFD/jqt
-        SP47rkn/Oq1I/jqpQf43iQX/xcNl/v7OXv7+x0v/zJ84/mxTG/4/MA7/NikL/jYoCv82KAn+NigI/jYo
-        B/82KAb+NisS/g4dAf8LHwr+Cx0C/hkkEf8qFRT+PBAQ/ockJJcAAAAAAAAAAAAAAAAAAAAAAAAAAIEz
-        IyJBGRD5AAAA/gAAAP4AAAD/AAAA/gAAAP4AAAD/AAAA/gAAAP8AAAD+AAAA/gAAAP4AAAD/AAAA/gAA
-        AP4AAAD/ETMV/jinRv47rkn/Oq1I/jqtSP45miX/Ypoi/v3We/7JoEH/GBIH/gAAAP4AAAD/AAAA/gAA
-        AP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/gAAAP8AAAD+AAAA/pEnJ/mQKCgiAAAAAAAA
-        AAAAAAAAAAAAAKFDLpU/IRv/ABoi/gAeKP4AHij/AB4o/gAeKP4AHij/AB4o/gAeKP8AHij+AB4o/gAe
-        KP4AHij/AB0n/gAWHf4ABQb/CBkK/jejRP47rkn/Oq1I/jqtSP46qkH/N4cC/tXLcv6vjkL/BgUC/gAH
-        Cv4AGCD/AB0n/gAeKP8AHij+AB4o/gAeKP8AHij+AB4o/gAeKP8AHij+AB4o/gAeKP8AHSf+ABYd/owv
-        Mf+YLCyVAAAAAAAAAAAAAAAArEYuD69GLfAFa47/AG6T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8Ab5T/AG6T/wBtkv8AZIT/F3JZ/zmrSf87rkn/OqxG/zmiNP84lBn/N4cC/77C
-        Zv/pw2P/MGFe/wBniv8AbpL/AG6T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8AbpP/AG2S/z1WbP+bKyrwmysqEAAAAAAAAAAAsEYsXLBGLP4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBu
-        k/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/B3eJ/jepTf44mSL/N4kF/kWN
-        Df6Mrkn/vcNs/vvYhv7RvWz/DnSQ/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBv
-        lP8AbpP+AG6T/gBvlP8AbpP+AG6T/j9gd/+cLCv+nCsqXAAAAAAAAAAAsEcsqrBHLP4Eb5L/AG+U/gBu
-        k/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/AG6T/gBvk/4Ec47/IZNp/jij
-        P/4yeQD/qLFp/t3HjP7kxH7/5MBv/ui/ZP7wyGb/c5l8/glykf4Ab5P/AG6T/gBvlP8AbpP+AG6T/gBv
-        lP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/kVsgv+hNjT+nCwqqgAAAACxSC0FsUgt6bFH
-        Lf/a0sn/vcSf/5+ug/8GcZL/AG+U/wBvlP8Ab5T/AG+U/wBvlP8HaYj/K3tT/yGGTP8nmGL/KZtf/y6g
-        WP82qU7/OKE2/xg/Bv8DBgD/CQgG/wkIBf8JCAT/CQgE/xMPCP+zkkn//c1i/+fDYP/Btmn/m7B8/yV+
-        OP8ijFj/Em5h/wBpi/8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wZ2i/8omF//Kogz/4KlZv+oRUL/nCwq6Zws
-        KgWxSC0osUgs/rlZQP7+9N///N2X/ubKfP4JcpH/AG6T/gBuk/4Ab5T/AG6T/gBvlP8JY33+Pn4f/jiX
-        H/46rUf/OqtD/jqnPv44mSX/JFkC/gIJBf4ADxP/AA8U/gAPFP4ADxT/AA8U/gAOE/4nIxT/27JW/v7N
-        Xf7/03H/h6o8/jiQE/86rUj+H24//gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5h/86rEn+OJsp/mOg
-        N/+2Y2D+nSwq/pwsKiiySS1Wskks/sd6Zv7+8ND/+9qP/ufLfP4JcpH/AG6T/gBuk/4Ab5T/AG6T/gBv
-        lP8DYHb+LHQM/jeJBv43iAP/N4cB/jaGAP47dg7/ChQJ/gBEWv4AbJD/AGyQ/gBskP4AbJD/AGyQ/gBr
-        jv4AOUz/UkQj/vLEXf721oH/QosI/jmjNf86rUj+H24//gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5
-        h/86rUn+OaM3/j6KCP/Fh4P+ni8s/p0tKlazSi15s0ot/9KUgv/+7MT//NmK/+jMff8JcpL/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8DYHb/V4s5/8DMjP/W16L/3dqo/+vatv9BPjb/ADdJ/wBskP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8Aao3/Ay47/4hvN//u04D/OYcC/zqkOP86rUj/H24//wBlhv8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wl5iP86rUn/OqpD/zeGAf/Alof/oDEv/50tKnmzSi2Qs0os/tmkk/7+6r3//dmJ/ujM
-        fv4JcpL/AG6T/gBuk/4Ab5T/AG6T/gBvlP8IYnz+v7+f/v3kt/7+5Lb/+N+y/ndrVf4CKzn/AGqO/gBu
-        k/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5P/AGWH/g8qLv68n17/i6tA/jiQE/86rUj+H24//gBl
-        hv8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5h/86rUn+Oq1H/jeIA/+6nYX+oDQx/p4tKpCzSy2cs0ss/t2t
-        nf7+6bn//dqL/ujRjv4JcpP/AG6T/gBuk/4Ab5T/AG6T/gBvlP8NZYD+y8Kk/v3mvP7947f/q5l7/gol
-        Lf4AZYf/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBggP4uOCz/wrZn/kOM
-        Cv84lRv+H208/gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/ghzff83jA3+OJUd/jeHAv+4oYf+oTUx/p4u
-        K5u0TC2dtEst/92unf/+6rz/+uGh/4yvXP8EcI//AG+U/wBvlP8Ab5T/AG+U/wBvlP8NZYH/fZ9h/8TP
-        lP/Ww6T/IDAx/wBffv8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8AVXH/Wlc5/9rHb/9ZlRr/HV4i/wBlhv8Ab5T/AG+U/wBvlP8Ab5T/AG+U/yB7if+4t0X/iak2/2uh
-        M//PrJ//oDMu/54uK520TC2StEwt/tqmlf787sv/ha1K/jKEDP4Cb43/AG6T/gBuk/4Ab5T/AG6T/gBv
-        lP8FYXn+LXUN/meaN/5HTkn/AFZz/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG+T/jiHk/4rgJL/AG6T/gBu
-        k/4Ab5T/AG6T/gBuk/4AbpP/A01k/pF8QP/CwV/+H1oa/gBlhv8AbpP+AG6T/gBvlP8AbpP+AG6T/ih9
-        h//3y1X++9Vy/v7ptv/UoJv+nzAr/p4vKpK1TS18tU0u/tiikv6pxoH/N4YA/jKEDP4Cb43/AG6T/gBu
-        k/4Ab5T/AG6T/gBvlP8DYHf+K3kY/iNLEP4CTGT/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5P/LIGU/trL
-        k/7Jw43/HHqS/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG2R/hJKVv+cmlD+KV8h/gBlhv8AbpP+AG6T/gBv
-        lP8AbpP+AG6T/id+jf9nmR/+Ypoh/luZI//Snpr+oDIs/p8vKn21TS1btk8w/9Scif84hgH/N4gE/zKF
-        D/8Cb47/AG+U/wBvlP8Ab5T/AG+U/wBvlP8DYnr/HWIz/wFDU/8AbpL/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8YeZT/xsSW//7akf/92Ir/r7aI/w50kv8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBrj/8LRz7/GE4c/wBl
-        hv8Ab5T/AG+U/wBvlP8Ab5T/AG+U/w10f/82hwT/OJAS/zmHA//JjYj/oTIs/6AwK1u1Ti4utk8v/s+J
-        dP48iQb/OZwp/jWjRv4CcJD/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AXHn+AkFP/gBskP4Ab5T/AG6T/gBu
-        k/4Ab5T/AG6T/gtzk/6quJf//NqU/v3Zjv7+14f//NWA/o6nhP4EcJL/AG6T/gBuk/4Ab5T/AG6T/gBv
-        lP8AZ4r+AztD/gBlh/8AbpP+AG6T/gBvlP8AbpP+AG6T/ghzfv85ozf+OZ4s/lycLv+7bGf+oTIr/qAx
-        Ky62Ti4Itk8u7cNuU/5snDv/OJkj/jWoT/4CcJD/AG6T/gBuk/4Ab5T/AG6T/gBvlP8Aa4/+AGyQ/gBu
-        k/4Ab5T/AG6T/gBuk/4Ab5T/BXGU/oysmv772pb//dqQ/v3Yiv7+14T//dV9/vfQdv5rloH/AW6T/gBu
-        k/4Ab5T/AG6T/gBvlP8AbpP+AGqN/gBtkf8AbpP+AG6T/gBvlP8AbpP+AG6T/gl5h/86rUn+OJMX/oSp
-        W/+uTkf+oTIr7aEyKwgAAAAAtk8us71fQf+Wm1n/N4wM/zWoTv8CcJD/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8AbpL/LoNr/+3erP/94af//tuR//7Xhv/+1oD//tR5//7S
-        cv/vy23/R4aB/wBuk/8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wl5
-        h/86q0X/N4cD/6ugd/+nPjb/ojMrswAAAAAAAAAAtk8uZrhTM/7BkXD/OogE/jWfP/4CcJD/AG6T/gBu
-        k/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/AG6T/gBuk/4Qc2X/NYUK/j6JB/5zpDj/79yb/v3X
-        hf7+1Hv//dN1/v3Rbv7+z2f/3cBl/iZ3g/4AbpP/AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBv
-        lP8AbpP+AG6T/ghzff83jA7+S5IZ/sOEe/+jNi3+ojQrZgAAAAAAAAAAtlAvFrZQLvWtZE3/OFws/xNN
-        LP8AbY//AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wp1gP8znUD/OZwp/zmf
-        Lf83hgH/vMVz//7XhP/+03b//tJw//7Qav//zmP//81c/8KwXv8Pbof/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wZpgv8YSRr/UXBD/6tRSf+iNCv1ojUrFgAAAAAAAAAAAAAAAKtS
-        NKUaYXn/AGyQ/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBuk/4Ab5T/BG+H/i+e
-        Vf46rUn/Oqg//jeIBf6HrUf/99yW/v3UeP7+0nD//tBr/v7PZf7/zV7//stY/v7KUv6bm1r/BWyM/gBv
-        lP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AGqN/kxVY/+dOC+lAAAAAAAA
-        AAAAAAAAAAAAAGZcWTAAb5T/AG6T/gBuk/4Ab5T/AG6T/gBuk/4Ab5T/AG6T/gBvlP8AbpP+AG6T/gBu
-        k/4Baof/J45R/jqsRv46rEX/N48R/n+oP/793ZT//dR5/v3UeP7+1n7//tR1/v7OYv7/zFn//spT/v7J
-        Tf76xUf/a4FZ/gFsj/8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/gBvlP8AbpP+AG6T/j1Z
-        bP1yR0owAAAAAAAAAAAAAAAAAAAAAAAAAAABbpLxAG6T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wFskP8cbjj/OaM3/zeKCP83iAT/O4gE/+PUiv/+1Hf//tV6/+fUhv+KrEP/sLxe//7V
-        eP//y1X//8lO///ISf//xUP/77o9/z1rX/8AbZL/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG6T/yhgebUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3ZHMsdllO8GViYf5Wgn//GndJ/huD
-        YP4cimz/G4Nf/ip/WP95oI7+eZuA/pKlh/5Njxf/N4oI/keODv45hwL/kLBM/v3aiP7+0nD/6NSE/k6R
-        FP44kRT/OIcD/s/IbP7/0Gb//spS/v7GRP7/wz7//sI5/tqqNP9+j1f+eZFc/nmRWv95kFj+eZBZ/nmS
-        X/95mXP+eaae/mR6iP9dTFT+dEdJ8EhWZSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApVM3abhT
-        MP7Hel//eZ1F/jeMC/46qkL/OaI0/keNDf/12Yz+/tN0/v7Xgf6zwGj/R40O/j2JBf43jg//VpQa/v3b
-        jv7/1n3/k7BJ/jiPEv46rUj/OJgh/kaNDP6cskj/4sxs/v7NWv7/xkT//sE2/v+/MP/+viv+/r0m/v+8
-        Iv/+vCH+/r4p/v/IRf/+3In+7tK//qtENv+mOSv+mT0zaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAt1EvArhRLq26VjT/x4Vp/2aZNP83jQ3/OqlA/zeOD/9pnSn/x8Zt//vckP9woC//N4gF/zme
-        LP84lRz/O4gD/2ecJ//83ZH/WJUb/ziUGv86rEb/Oq1I/zmfLf84kBP/Q4sJ/4+rPP/Vxl7//8tS//+/
-        Lf//vSf//7wj//+8I///vyv//8hG///agv/14Mj/slNF/6g7LP+nOiytpjksAgAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAALhSLw+4US7Nu1k4/smLb/5omjb/N4wL/jmgMP83jQz+N4cC/mCZ
-        If68w2n/OIcD/jmiNP45mST/QosJ/oysQP7+2of/g6g6/jeHAv46qUH/Oq1I/jqtSP46rUj/OaI0/jiS
-        Fv45iAP/x79U/v/DOP/+vSX+/r0n/v/BMf/+y07+/tyJ/vbhyP+3XE7+qDwr/qg7LM2nOisPAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4UjAYuFEu1rtZN/7KhWv/eZ5G/jeG
-        AP87iAX+N4YA/j+KB/7o1IP/YJkh/jeNDf43iAT/srxZ/v7Sa/7+1Xb/X5gf/jmcKf47rkn/Oq1I/jqt
-        SP47rkn/Oq1I/jqtSP44mCH/eqIr/v/LT//+vy7+/sU8/v/QXv/+4pz+79TA/rVWRv+pPSv+qT0r1qg8
-        LBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuFIwGLhR
-        Ls66VjT/x3le/7qwhf/X4LX/UZMZ/zeGAP/j1IT/daMy/2mdJ//EwmH//NNv///LVf/XyWn/OIcC/zqp
-        Qf87rkn/O65J/zuuSf87rkn/O65J/zuuSf86pDb/OogE/8vEXf//z13//9h6///rvP/fsqP/r0k2/6s/
-        LP+qPizOqT0sGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAALhSLw+4US6tuFIv/rtZOf/NmoD+dJ9D/jqIBP7c15P//t6S/v7Zgf7+1nn/+dR2/v3V
-        dv5xnyr/OJQb/jqtSP47rkn/Oq1I/jqtSP47rkn/Oq1I/jqtSP46rUf/OJMY/n6pP//+6rn+89zG/sZ8
-        bP+sQSv+q0Ar/qs/LK2qPisPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4US4Ct1EubbdQLvO6WDf+xnRa/sujhv7149L//u3E/v7m
-        rP6guVz/RYwM/lGRFP43igj/OqpC/jqtSP47rkn/Oq1I/jqtSP46qkL/OaM1/jiZIv43jAv/P4oK/oqr
-        Xv/VnZD+sUo1/q1CLP+sQSzzrEArbatALAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhRLyS4US6vt1Au/bhT
-        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
-        u/87gw//NZY//zeZOP9EjBP/ubtQ///FQ///wTj//8A0//+/L//+viv/+Lgm/+2uI//gpyr/6rpM//re
-        mv/Smo7/nC0t/5spKq2bKSoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKo+LAKqPiyvrEQ0/+fB
-        rP/42JH/5bxm/2CQIv86qkT/O65J/zqrQ/9Qkxb/3cdg///HSP//wz3//8E4///AMv//vy3//70n//67
-        Iv/xsSH/5Kww//bPdv/avKb/p0ZF/5sqKq+bKSoCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq0AshKxC
-        L//nwq3/9tWL/+i7Wf/6yVv/tbxY/ziXH/87rkn/O65J/zqnPf9FkhX/xMBZ///LVf//xEH//8I7///A
-        NP//vy7//70n//+8If/7uB7/6rEw/4ShN/+Fl1L/pT8//5sqKoQAAAAAAAAAAAAAAAAAAAAAAAAAAJs7
-        JzqsQSz82qeV//nbmP/twGD//cxf///OYf/41n//O5AT/zuuSf87rkn/O65J/zqrRP84khb/uLxV///K
-        UP//xUP//8I8///ANP//vy3//70m//+7IP/+vij/f5or/zeJDf+aj2H/nzIy/JEnJzsAAAAAAAAAAAAA
-        AACDMyEBRxsSzhoKB/8kIR3/IhwQ/yMcDf8kHQ7/JB0P/yIfE/8IFAH/Ch8N/xpPIf84pkX/O65J/zqs
-        Rf9Kkxf/99Ft/96vQv9YRBf/KB4J/yQbB/8kGwX/JBoF/yQbBf8SFwX/BxQF/w4WB/8eDAz/ax0dzpAn
-        JwEAAAAAAAAAAJ9CLVAqGRb/ABQa/wAUGv8AFBr/ABQa/wAUGv8AFBr/ABQa/wAUGv8AEBX/AAMD/yp9
-        NP87rkn/O65J/zmbKP+tuVP/emIs/wADBP8AERf/ABQa/wAUGv8AFBr/ABQa/wAUGv8AFBr/ABQa/wAS
-        Gf9fIiT/mCsrUAAAAAAAAAAArkYuugJtkf8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBu
-        k/8BZYH/MJ9S/zqoP/85myf/PY8S/6i4Vv+up2b/AWWG/wBuk/8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG6T/ylfev+bKyq6AAAAALBHLROwRy37Am+T/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+T/wd2iv8wn1D/SIkW/6ayYP/lyoL/7shx/7+2bv8Udo//AG+T/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8Ab5P/LWuG/54wL/ucKyoTsUgtU7JJLv/h28T/vbyG/wVwkv8Ab5T/AG+U/wBv
-        lP8eb3v/KIY0/y6gWf8xpFT/OKVA/xxJC/8DBAH/BgUD/wYFA/8KCAT/sZBH//PJX//RwXP/Qow2/yiS
-        VP8DYXj/AG+U/wBvlP8Ab5T/BHSN/y6dUv9imkT/pkE+/5wsKlOySS2HvmVN//7rwf/tz3//BnGS/wBv
-        lP8Ab5T/AG+U/w5iWP83jAz/OJMZ/zeQEv8vZgv/AiYt/wBSbf8AU27/AFNu/wBRbP8ZLy7/3rNV/8nD
-        Yf84lh7/N6NF/wRdbv8Ab5T/AG+U/wBvlP8GdYz/OqxJ/0GRGP+2ZGH/nSwqh7NKLanJfmj//uay/+/P
-        fv8GcZL/AG+U/wBvlP8Ab5T/FmZg/8nPkf/k3Kn/28ul/x4yNv8AZon/AG+U/wBvlP8Ab5T/AG+U/wBj
-        hP9FSDH/urpc/ziXH/83o0X/BF1u/wBvlP8Ab5T/AG+U/wZ1jP86rUn/OJIW/7V3a/+dLSqqs0stu86L
-        dv/+5az/79KH/wZxk/8Ab5T/AG+U/wBvlP88eYX//eW6//fesv9JTkX/AGCA/wBvlP8Ab5T/AG+U/wBv
-        lP8Ab5T/AG+U/wBZd/9/dEv/Xpkh/zaYMP8EXW7/AG+U/wBvlP8Ab5T/BnOH/ziZJP83jxH/sn9s/54u
-        K7u0TC28z4x3//3ouP+Mr1X/Am+Q/wBvlP8Ab5T/AG+U/yZucf+TtWL/hH9u/wBWcv8AbpP/AG+U/wBv
-        lP8CcJP/AW+T/wBvlP8Ab5T/AG+U/wdSaf+tm1b/XJEf/wRba/8Ab5T/AG+U/wBvlP8Xd4z/yLtG/6C4
-        Vv/Bgnr/ni8rvLRNLavNhnD/nb1v/zSECP8Bb4//AG+U/wBvlP8Ab5T/DWRb/zVtEv8IUGf/AG6T/wBv
-        lP8Ab5T/AW+U/4mpk/93oJD/AG+T/wBvlP8Ab5T/AG6T/x9XXv+MmkL/BFlo/wBvlP8Ab5T/AG+U/xp5
-        jv+NqDL/mrZU/8J6dv+fLyustU0uisqAaf83iQb/NI0X/wFvkP8Ab5T/AG+U/wBvlP8JXmP/B05V/wBu
-        k/8Ab5T/AG+U/wBvk/9lmpX/+tmS//fViP9Sj4z/AG+U/wBvlP8Ab5T/AG2R/w1OPv8DWGr/AG+U/wBv
-        lP8Ab5T/B3KF/ziTGf8+jA3/umpl/6AxK4q2Ti5YwWhN/1GTIf83qUv/AXCR/wBvlP8Ab5T/AG+U/wBi
-        g/8AbZH/AG+U/wBvlP8AbpP/RY2W//TXlv/+2Y3//taD/+3Nev8ygYr/AG6T/wBvlP8Ab5T/AGuO/wBk
-        hf8Ab5T/AG+U/wBvlP8GdIr/OqpD/2OcNv+rSUL/oTIrWLZPLhi6Vzj9fpNA/zaeOP8BcJH/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/whxev+Ssmb/69mW//7Yif/+1X3//tJz/9rBbf8WdYz/AG+U/wBv
-        lP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wZ0if84mib/i5VV/6Q5Mf2hMysYAAAAALZQL8GUdE3/IGQk/wBu
-        kf8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBvlP8EcYv/L5E1/ziWHv9Xlh7//tuP//7Tdv/+0Wz//s5i/7iu
-        Y/8Hbo7/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/BG2H/yRgD/+hcFz/ozUrwQAAAAAAAAAAn1M6Wwto
-        hv8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AW2O/ymXW/86rEb/PpEU/8bHdP/+1Xz//tFv//7P
-        Zf//zFz//spS/4uWXv8AbZH/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG6T/y9dc/+YOTJbAAAAAAAA
-        AABGYmsDAG6T+QBvlP8Ab5T/AG+U/wBvlP8Ab5T/AG+U/wBukv8ee0f/OZsn/ziQE/+etlX//tV6//TV
-        gf+yvFv/9NFz///LVP//yEv/+8NC/1Z7X/8AbpP/AG+U/wBvlP8Ab5T/AG+U/wBvlP8Ab5T/H2N/3WZL
-        UgMAAAAAAAAAAAAAAABYXmBMg1tO/meFav8khED/JpZg/zKFQf+lsof/sLOB/1eWIP9Ciwr/PYkG/+fS
-        gP/+1n3/Zp0o/ziWHv+Cpzb//dJt///ITP//wjz/7rc0/6ifSf+mn0j/pp9G/6aiT/+msoL/ioiK/3lF
-        Rf5gTlZKAAAAAAAAAAAAAAAAAAAAAAAAAAC3US+UwmtN/3CVOP85nCj/OJQb/6i4Vf/114T/daM0/zqT
-        GP84kBP/fqY3/9vNd/83jxH/Oq1H/zmbJ/9DkBL/pbNE/+zIV///wTP//70n//+8I///vy3//9Fj/+zJ
-        q/+rQjP/pjoslAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhRLge4Ui+6wnFS/3OXO/84lBr/N4kG/0mO
-        D/+gtVH/OJYe/zqQE/+jtEz/6NF4/zmLCv86rEX/O65J/zqsRv85nSv/TJIV//rIS///vSf//8I2///U
-        bv/syqv/r0s7/6g8LLqnOiwHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhRLgu4Ui+7wWpM/5mc
-        XP+KtFz/PIgE/8zJcv9Ukxf/qrZN///PYP+xuE7/OZwo/zuuSf87rkn/O65J/zuuSf84mCL/s7dG///M
-        VP//35P/37CZ/65GNP+qPiy7qTwsCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALhR
-        Lge4US6UuVUz/rqLZf90nUH/7+Gn///cjP/dy23/ycJa/1GUGP86q0T/O65J/zuuSf87rkn/Oq1H/zmg
-        L/9fmib/8te3/8Z6aP+sQSz+q0AslKo+LAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAC3US5KuFEv271dPv/OiHD/6siw/2ifN/83hgD/N48Q/ziZI/84mSP/OJYe/ziQ
-        E/9Ulyb/hZhM/7OGY/+zTjj/rUMs26xBLEoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3UC4Et08uXrZPLsi4UjL+wmtQ/7+BYf+0iWH/q41e/6yM
-        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
-        lP8Mc5D/pLRJ/7BWUdm9YUS4PZUi/wBvkv8Ab5T/BF9z/wBuk/8RdpT/1MmS/83ChP8Mc5H/AG6T/wRd
-        b/8Ab5T/A3GO/0WZKP+pRT+4tlEwdVqCOv8Ab5L/AG+U/wBvlP8Bb5H/QJNN/8/Ic//+03T/qqxw/wFu
-        kv8Ab5T/AG+U/wJvjv9igDr/ojUsdWhCNRcDbZD9AG+U/wBvlP8AbpP/IIdW/1ShMP/t0nv/6cto//7K
-        U/93kGT/AG6T/wBvlP8Ab5T/E2eG9nQyLhcAAAAAj1dEd2+CTP8ykzn/vL14/1KWHf92pDT/nrRL/0uh
-        MP+5t0T/9sA+/9OuN//StEn/sZF7/4dCPXcAAAAAAAAAAGYtGQG6WTiggYw//1GVHf9+qj7/obJD/4Os
-        Pv86rUj/OqlB/4yqMv//y1H/3qV5/6pAL6BnJBsBAAAAAAAAAAAAAAAAaC4aAbhSL3epdkX26sOV/5Gs
-        P/8/miT/OaM0/0CgMv90lkH/xnhh9qxALHdpJhsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkT8kGLdQ
-        L3m7YkO8smxG3rFrRt64XUO8sUkveZA4JRgAAAAAAAAAAAAAAAAAAAAA8A8AAOAHAADAAwAAgAEAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAIABAADAAwAA8A8AAA==
-</value>
-  </data>
-</root>
\ No newline at end of file

Modified: sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -48,7 +48,7 @@
             this.btnReplaceAll = new System.Windows.Forms.ToolStripButton();
             this.lblCursorPos = new System.Windows.Forms.ToolStripLabel();
             this.txtXmlContent = new System.Windows.Forms.TextBox();
-            this.resourceDataCtrl1 = new Maestro.Editors.Generic.ResourceDataCtrl();
+            this.resDataCtrl = new Maestro.Editors.Generic.ResourceDataPanel();
             this.toolStrip1.SuspendLayout();
             this.SuspendLayout();
             // 
@@ -218,24 +218,25 @@
             this.txtXmlContent.KeyUp += new System.Windows.Forms.KeyEventHandler(this.txtXmlContent_KeyUp);
             this.txtXmlContent.MouseClick += new System.Windows.Forms.MouseEventHandler(this.txtXmlContent_MouseClick);
             // 
-            // resourceDataCtrl1
+            // resDataCtrl
             // 
-            this.resourceDataCtrl1.ContentBackgroundColor = System.Drawing.SystemColors.Control;
-            this.resourceDataCtrl1.Dock = System.Windows.Forms.DockStyle.Bottom;
-            this.resourceDataCtrl1.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
-            this.resourceDataCtrl1.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.resourceDataCtrl1.HeaderText = "Resource Data Files";
-            this.resourceDataCtrl1.Location = new System.Drawing.Point(0, 326);
-            this.resourceDataCtrl1.Name = "resourceDataCtrl1";
-            this.resourceDataCtrl1.Size = new System.Drawing.Size(629, 182);
-            this.resourceDataCtrl1.TabIndex = 1;
+            this.resDataCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
+            this.resDataCtrl.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.resDataCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
+            this.resDataCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.resDataCtrl.HeaderText = "Resource Data Files";
+            this.resDataCtrl.Location = new System.Drawing.Point(0, 326);
+            this.resDataCtrl.Name = "resDataCtrl";
+            this.resDataCtrl.Size = new System.Drawing.Size(629, 182);
+            this.resDataCtrl.TabIndex = 1;
+            this.resDataCtrl.DataListChanged += new System.EventHandler(this.resDataCtrl_DataListChanged);
             // 
             // XmlEditorCtrl
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.Controls.Add(this.txtXmlContent);
-            this.Controls.Add(this.resourceDataCtrl1);
+            this.Controls.Add(this.resDataCtrl);
             this.Controls.Add(this.toolStrip1);
             this.Name = "XmlEditorCtrl";
             this.Size = new System.Drawing.Size(629, 508);
@@ -249,7 +250,7 @@
         #endregion
 
         private System.Windows.Forms.ToolStrip toolStrip1;
-        private ResourceDataCtrl resourceDataCtrl1;
+        private ResourceDataPanel resDataCtrl;
         private System.Windows.Forms.TextBox txtXmlContent;
         private System.Windows.Forms.ToolStripButton btnCopy;
         private System.Windows.Forms.ToolStripButton btnCut;

Modified: sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Generic/XmlEditorCtrl.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -28,12 +28,14 @@
 using System.Xml.Schema;
 using System.Xml;
 using System.IO;
+using OSGeo.MapGuide.MaestroAPI.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Resource;
 
 namespace Maestro.Editors.Generic
 {
     public delegate void XmlValidationCallback(out string[] errors, out string[] warnings);
 
-    public partial class XmlEditorCtrl : UserControl
+    public partial class XmlEditorCtrl : EditorBase, INotifyResourceChanged
     {
         private bool _ready = false;
 
@@ -161,23 +163,11 @@
                 UpdateTextPosition();
                 textEditor.ScrollToCaret();
 
-                if (!String.IsNullOrEmpty(szReplace))
-                    OnContentChanged();
+                if (!String.IsNullOrEmpty(szReplace) && _ready)
+                    OnResourceChanged();
             }
         }
 
-        protected virtual void OnContentChanged()
-        {
-            if (_ready)
-            {
-                var handler = this.ContentChanged;
-                if (handler != null)
-                    handler(this, EventArgs.Empty);
-            }
-        }
-
-        public event EventHandler ContentChanged;
-
         private void UpdateTextPosition()
         {
             var textEditor = txtXmlContent;
@@ -201,7 +191,8 @@
             UpdateTextPosition();
             EvaluateCommands();
 
-            OnContentChanged();
+            if (_ready) 
+                OnResourceChanged();
         }
 
         private void txtXmlContent_MouseClick(object sender, MouseEventArgs e)
@@ -262,5 +253,21 @@
                 txtXmlContent.Text = content;
             }
         }
+
+        public override void Bind(IEditorService service)
+        {
+            var res = service.GetEditedResource();
+
+            //HACK: Scrub out junk <ExtendedData1> elements.
+            this.XmlContent = res.Serialize();
+
+            resDataCtrl.Init(service);
+        }
+
+        private void resDataCtrl_DataListChanged(object sender, EventArgs e)
+        {
+            if (_ready)
+                OnResourceChanged();
+        }
     }
 }

Modified: sandbox/maestro-2.5/Maestro.Editors/IEditorService.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/IEditorService.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/IEditorService.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -23,29 +23,149 @@
 using OSGeo.MapGuide.MaestroAPI;
 using System.Collections.Specialized;
 using OSGeo.MapGuide.MaestroAPI.Resource;
+using System.IO;
+using OSGeo.MapGuide.ObjectModels.Common;
+using System.ComponentModel;
 
 namespace Maestro.Editors
 {
+    /// <summary>
+    /// Defines an interface that provides common services for resource editors.
+    /// </summary>
     public interface IEditorService
     {
+        /// <summary>
+        /// Registers a custom notifier
+        /// </summary>
+        /// <param name="irc"></param>
+        void RegisterCustomNotifier(INotifyResourceChanged irc);
+        /// <summary>
+        /// Indicates whether an upgrade for this resource is available
+        /// </summary>
+        bool IsUpgradeAvailable { get; }
+        /// <summary>
+        /// Invokes a prompt to select a resource of any type
+        /// </summary>
+        /// <returns></returns>
+        string SelectAnyResource();
+        /// <summary>
+        /// Invokes a prompt to select a resource of the specified type
+        /// </summary>
+        /// <param name="resType"></param>
+        /// <returns></returns>
         string SelectResource(ResourceTypes resType);
 
-        string SelectResource(ResourceTypes[] resTypes);
+        /// <summary>
+        /// Invokes a prompt to select a folder
+        /// </summary>
+        /// <returns></returns>
+        string SelectFolder();
 
-        string[] SelectMultipleResources(ResourceTypes resType);
+        /// <summary>
+        /// Gets a list of this resource's data
+        /// </summary>
+        /// <returns></returns>
+        ResourceDataList EnumerateResourceData();
 
+        /// <summary>
+        /// Updates the session copy's resource content
+        /// </summary>
+        /// <param name="xml"></param>
+        void UpdateResourceContent(string xml);
+
+        /// <summary>
+        /// Adds a new file to this resource's data
+        /// </summary>
+        /// <param name="dataName"></param>
+        /// <param name="type"></param>
+        /// <param name="stream"></param>
+        void AddResourceData(string dataName, ResourceDataType type, Stream stream);
+        
+        /// <summary>
+        /// Gets the stream for this resource's data
+        /// </summary>
+        /// <param name="dataName"></param>
+        /// <returns></returns>
+        MemoryStream GetResourceData(string dataName);
+
+        /// <summary>
+        /// Removes a datum from this resource's data
+        /// </summary>
+        /// <param name="dataName"></param>
+        void RemoveResourceData(string dataName);
+
+        /// <summary>
+        /// Invokes a prompt to select a file from an unmanaged alias
+        /// </summary>
+        /// <param name="startPath"></param>
+        /// <param name="fileTypes"></param>
+        /// <returns></returns>
         string SelectUnmanagedData(string startPath, NameValueCollection fileTypes);
 
+        /// <summary>
+        /// Invokes the expression editor
+        /// </summary>
+        /// <param name="currentExpr"></param>
+        /// <param name="schema"></param>
+        /// <param name="providerName"></param>
+        /// <param name="featureSourceId"></param>
+        /// <returns></returns>
         string EditExpression(string currentExpr, FeatureSourceDescription.FeatureSourceSchema schema, string providerName, string featureSourceId);
 
-        IResource Resource { get; }
+        /// <summary>
+        /// Gets the resource ID of the resource, whose session-copy is being edited
+        /// </summary>
+        string ResourceID { get; }
 
+        /// <summary>
+        /// Gets the resource ID of the actively edited resource
+        /// </summary>
+        string EditedResourceID { get; }
+
+        /// <summary>
+        /// Initiates the editing process. The resource to be edited is copied to the session repository and
+        /// a deserialized version is returned from this copy. Subsequent calls will return the same reference
+        /// to this resource object.
+        /// </summary>
+        /// <returns>A deserialized version of a session-copy of the resource to be edited</returns>
+        IResource GetEditedResource();
+
+        /// <summary>
+        /// Raised before a save operation commences
+        /// </summary>
+        event CancelEventHandler BeforeSave;
+
+        /// <summary>
+        /// Saves the edited resource. The session copy, which holds the current changes is copied back
+        /// to the original resource ID.
+        /// </summary>
+        void Save();
+
+        /// <summary>
+        /// Saves the edited resource under a different resource ID. The session copy, which holds the current changes is copied back
+        /// to the specified resource ID
+        /// </summary>
+        void SaveAs(string resourceID);
+
+        /// <summary>
+        /// Opens the specified URL
+        /// </summary>
+        /// <param name="url"></param>
         void OpenUrl(string url);
 
+        /// <summary>
+        /// Indicates whether the edited resource is a new resource
+        /// </summary>
         bool IsNew { get; }
 
+        /// <summary>
+        /// Indicates whether the edited resource has unsaved changes
+        /// </summary>
         bool IsDirty { get; }
 
+        /// <summary>
+        /// Raised when the edited resource has changed
+        /// </summary>
         event EventHandler DirtyStateChanged;
     }
 }

Modified: sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Maestro.Editors.csproj	2010-05-20 23:28:34 UTC (rev 4916)
@@ -77,6 +77,12 @@
     <Compile Include="Common\FdoProviderPicker.Designer.cs">
       <DependentUpon>FdoProviderPicker.cs</DependentUpon>
     </Compile>
+    <Compile Include="Common\ResourceDataCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Common\ResourceDataCtrl.Designer.cs">
+      <DependentUpon>ResourceDataCtrl.cs</DependentUpon>
+    </Compile>
     <Compile Include="Common\SourceDataCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -107,6 +113,9 @@
     <Compile Include="DrawingSource\SourceSectionCtrl.Designer.cs">
       <DependentUpon>SourceSectionCtrl.cs</DependentUpon>
     </Compile>
+    <Compile Include="EditorBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Include="FeatureSource\CoordSysOverrideCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -155,16 +164,22 @@
     <Compile Include="FeatureSource\Preview\StandardQueryCtrl.Designer.cs">
       <DependentUpon>StandardQueryCtrl.cs</DependentUpon>
     </Compile>
-    <Compile Include="Generic\ResourceDataCtrl.cs">
+    <Compile Include="FeatureSource\Providers\GenericCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Include="Generic\ResourceDataCtrl.Designer.cs">
-      <DependentUpon>ResourceDataCtrl.cs</DependentUpon>
+    <Compile Include="FeatureSource\Providers\GenericCtrl.Designer.cs">
+      <DependentUpon>GenericCtrl.cs</DependentUpon>
     </Compile>
-    <Compile Include="Generic\ResourcePicker.cs">
+    <Compile Include="Generic\ResourceDataPanel.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Generic\ResourceDataPanel.Designer.cs">
+      <DependentUpon>ResourceDataPanel.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Common\ResourcePicker.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Include="Generic\ResourcePicker.Designer.cs">
+    <Compile Include="Common\ResourcePicker.Designer.cs">
       <DependentUpon>ResourcePicker.cs</DependentUpon>
     </Compile>
     <Compile Include="Generic\XmlEditorCtrl.cs">
@@ -381,6 +396,9 @@
       <DependentUpon>FdoProviderPicker.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
+    <EmbeddedResource Include="Common\ResourceDataCtrl.resx">
+      <DependentUpon>ResourceDataCtrl.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Common\SourceDataCtrl.resx">
       <DependentUpon>SourceDataCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
@@ -432,11 +450,14 @@
       <DependentUpon>StandardQueryCtrl.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
-    <EmbeddedResource Include="Generic\ResourceDataCtrl.resx">
-      <DependentUpon>ResourceDataCtrl.cs</DependentUpon>
+    <EmbeddedResource Include="FeatureSource\Providers\GenericCtrl.resx">
+      <DependentUpon>GenericCtrl.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Generic\ResourceDataPanel.resx">
+      <DependentUpon>ResourceDataPanel.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>
-    <EmbeddedResource Include="Generic\ResourcePicker.resx">
+    <EmbeddedResource Include="Common\ResourcePicker.resx">
       <DependentUpon>ResourcePicker.cs</DependentUpon>
       <SubType>Designer</SubType>
     </EmbeddedResource>

Modified: sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.Designer.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.Designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -257,6 +257,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to File Downloaded.
+        /// </summary>
+        internal static string FileDownloaded {
+            get {
+                return ResourceManager.GetString("FileDownloaded", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Cannot Find an Empty String.
         /// </summary>
         internal static string FindEmptyString {

Modified: sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.resx	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Editors/Properties/Resources.resx	2010-05-20 23:28:34 UTC (rev 4916)
@@ -282,4 +282,7 @@
   <data name="edit-indent" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\edit-indent.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="FileDownloaded" xml:space="preserve">
+    <value>File Downloaded</value>
+  </data>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -51,8 +51,8 @@
         protected override void OnLoad(EventArgs e)
         {
             base.OnLoad(e);
-            btnCollapse.Visible = !this.Collapsed;
-            btnExpand.Visible = this.Collapsed;
+            btnCollapse.Enabled = !this.Collapsed;
+            btnExpand.Enabled = this.Collapsed;
         }
 
         [Category("Collapsible Panel Header")]
@@ -119,8 +119,8 @@
                         this.Height += restoreHeight;
                     }
                 }
-                btnCollapse.Visible = !_collapsed;
-                btnExpand.Visible = _collapsed;
+                btnCollapse.Enabled = !_collapsed;
+                btnExpand.Enabled = _collapsed;
             }
         }
 

Modified: sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/CollapsiblePanel.designer.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -80,6 +80,7 @@
             // 
             this.lblHeaderText.BackColor = System.Drawing.Color.Transparent;
             this.lblHeaderText.Dock = System.Windows.Forms.DockStyle.Left;
+            this.lblHeaderText.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.lblHeaderText.Location = new System.Drawing.Point(0, 0);
             this.lblHeaderText.Name = "lblHeaderText";
             this.lblHeaderText.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0);

Modified: sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/Maestro.Shared.UI.csproj	2010-05-20 23:28:34 UTC (rev 4916)
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{CFD19053-2172-41D3-8460-0FD2123A1E88}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -50,6 +50,7 @@
       <DesignTime>True</DesignTime>
       <DependentUpon>Resources.resx</DependentUpon>
     </Compile>
+    <Compile Include="WaitCursor.cs" />
     <Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
   </ItemGroup>
   <ItemGroup>

Added: sandbox/maestro-2.5/Maestro.Shared.UI/WaitCursor.cs
===================================================================
--- sandbox/maestro-2.5/Maestro.Shared.UI/WaitCursor.cs	                        (rev 0)
+++ sandbox/maestro-2.5/Maestro.Shared.UI/WaitCursor.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -0,0 +1,44 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Maestro.Shared.UI
+{
+    public class WaitCursor : IDisposable
+    {
+        private Control _owner;
+        private Cursor _orig;
+
+        public WaitCursor(Control owner)
+        {
+            _owner = owner;
+            _orig = _owner.Cursor;
+            _owner.Cursor = Cursors.WaitCursor;
+        }
+
+        public void Dispose()
+        {
+            _owner.Cursor = _orig;
+        }
+    }
+}

Modified: sandbox/maestro-2.5/MaestroAPITests/CapabilityTests.cs
===================================================================
--- sandbox/maestro-2.5/MaestroAPITests/CapabilityTests.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/MaestroAPITests/CapabilityTests.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -51,7 +51,7 @@
                         {
                             try
                             {
-                                caps.GetMaxSupportedResourceVersion(type.ToString());
+                                caps.GetMaxSupportedResourceVersion(type);
                                 Assert.Fail("MGOS 1.0.0 doesn't support fusion!");
                             }
                             catch (UnsupportedResourceTypeException ex) 
@@ -62,43 +62,43 @@
                         break;
                     case ResourceTypes.DrawingSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.FeatureSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LayerDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LoadProcedure:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.MapDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.PrintLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolLibrary:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
@@ -106,7 +106,7 @@
                         {
                             try
                             {
-                                caps.GetMaxSupportedResourceVersion(type.ToString());
+                                caps.GetMaxSupportedResourceVersion(type);
                                 Assert.Fail("MGOS 1.0.0 doesn't support advanced symbology!");
                             }
                             catch (UnsupportedResourceTypeException ex) 
@@ -117,7 +117,7 @@
                         break;
                     case ResourceTypes.WebLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
@@ -180,7 +180,7 @@
                         {
                             try
                             {
-                                caps.GetMaxSupportedResourceVersion(type.ToString());
+                                caps.GetMaxSupportedResourceVersion(type);
                                 Assert.Fail("MGOS 1.1.0 doesn't support fusion!");
                             }
                             catch (UnsupportedResourceTypeException ex) 
@@ -191,43 +191,43 @@
                         break;
                     case ResourceTypes.DrawingSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.FeatureSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LayerDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LoadProcedure:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.MapDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.PrintLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolLibrary:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
@@ -235,7 +235,7 @@
                         {
                             try
                             {
-                                caps.GetMaxSupportedResourceVersion(type.ToString());
+                                caps.GetMaxSupportedResourceVersion(type);
                                 Assert.Fail("MGOS 1.1.0 doesn't support advanced symbology!");
                             }
                             catch (UnsupportedResourceTypeException ex) 
@@ -246,7 +246,7 @@
                         break;
                     case ResourceTypes.WebLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
@@ -309,7 +309,7 @@
                         {
                             try
                             {
-                                caps.GetMaxSupportedResourceVersion(type.ToString());
+                                caps.GetMaxSupportedResourceVersion(type);
                                 Assert.Fail("MGOS 1.2.0 doesn't support fusion!");
                             }
                             catch (UnsupportedResourceTypeException ex) 
@@ -320,55 +320,55 @@
                         break;
                     case ResourceTypes.DrawingSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.FeatureSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LayerDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;
                     case ResourceTypes.LoadProcedure:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.MapDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.PrintLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolLibrary:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.WebLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
@@ -429,61 +429,61 @@
                 {
                     case ResourceTypes.ApplicationDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.DrawingSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.FeatureSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LayerDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 2, 0));
                         }
                         break;
                     case ResourceTypes.LoadProcedure:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;
                     case ResourceTypes.MapDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.PrintLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolLibrary:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;
                     case ResourceTypes.WebLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
@@ -544,61 +544,61 @@
                 {
                     case ResourceTypes.ApplicationDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.DrawingSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.FeatureSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LayerDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 3, 0));
                         }
                         break;
                     case ResourceTypes.LoadProcedure:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;
                     case ResourceTypes.MapDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.PrintLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolLibrary:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;
                     case ResourceTypes.WebLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
@@ -659,61 +659,61 @@
                 {
                     case ResourceTypes.ApplicationDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.DrawingSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.FeatureSource:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.LayerDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 3, 0));
                         }
                         break;
                     case ResourceTypes.LoadProcedure:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(2, 2, 0));
                         }
                         break;
                     case ResourceTypes.MapDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.PrintLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolLibrary:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 0, 0));
                         }
                         break;
                     case ResourceTypes.SymbolDefinition:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;
                     case ResourceTypes.WebLayout:
                         {
-                            var version = caps.GetMaxSupportedResourceVersion(type.ToString());
+                            var version = caps.GetMaxSupportedResourceVersion(type);
                             Assert.AreEqual(version, new Version(1, 1, 0));
                         }
                         break;

Modified: sandbox/maestro-2.5/MaestroAPITests/ResourceTests.cs
===================================================================
--- sandbox/maestro-2.5/MaestroAPITests/ResourceTests.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/MaestroAPITests/ResourceTests.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -34,6 +34,7 @@
 using NMock2;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.MaestroAPI;
 
 namespace MaestroAPITests
 {
@@ -472,17 +473,17 @@
 
             var orig = _mocks.NewMock<IResource>();
             Stub.On(orig).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
-            Stub.On(orig).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(orig).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(orig).Method("Clone").WithAnyArguments().Will(Return.Value(orig));
 
             var res2 = _mocks.NewMock<IResource>();
-            Stub.On(res2).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(res2).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(res2).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 1, 0)));
 
             var upg = _mocks.NewMock<IResourceConverter>();
             Stub.On(upg).GetProperty("SourceVersion").Will(Return.Value(new Version(1, 0, 0)));
             Stub.On(upg).GetProperty("TargetVersion").Will(Return.Value(new Version(1, 1, 0)));
-            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(upg).Method("Convert").WithAnyArguments().Will(Return.Value(res2));
 
             var upgList = new List<IResourceConverter>();
@@ -512,12 +513,12 @@
             var upg = _mocks.NewMock<IResourceConverter>();
             Stub.On(upg).GetProperty("SourceVersion").Will(Return.Value(new Version(1, 0, 0)));
             Stub.On(upg).GetProperty("TargetVersion").Will(Return.Value(new Version(1, 1, 0)));
-            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
 
             var upg2 = _mocks.NewMock<IResourceConverter>();
             Stub.On(upg2).GetProperty("SourceVersion").Will(Return.Value(new Version(1, 0, 0)));
             Stub.On(upg2).GetProperty("TargetVersion").Will(Return.Value(new Version(1, 3, 0)));
-            Stub.On(upg2).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(upg2).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
 
             var upgList = new List<IResourceConverter>();
             upgList.Add(upg);
@@ -535,29 +536,29 @@
 
             var orig = _mocks.NewMock<IResource>();
             Stub.On(orig).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
-            Stub.On(orig).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(orig).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(orig).Method("Clone").WithAnyArguments().Will(Return.Value(orig));
 
             var orig11 = _mocks.NewMock<IResource>();
             Stub.On(orig11).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 1, 0)));
-            Stub.On(orig11).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(orig11).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(orig11).Method("Clone").WithAnyArguments().Will(Return.Value(orig11));
 
             var orig12 = _mocks.NewMock<IResource>();
             Stub.On(orig12).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 2, 0)));
-            Stub.On(orig12).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(orig12).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(orig12).Method("Clone").WithAnyArguments().Will(Return.Value(orig12));
 
             var upg = _mocks.NewMock<IResourceConverter>();
             Stub.On(upg).GetProperty("SourceVersion").Will(Return.Value(new Version(1, 0, 0)));
             Stub.On(upg).GetProperty("TargetVersion").Will(Return.Value(new Version(1, 1, 0)));
-            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(upg).Method("Convert").WithAnyArguments().Will(Return.Value(orig11));
 
             var upg2 = _mocks.NewMock<IResourceConverter>();
             Stub.On(upg2).GetProperty("SourceVersion").Will(Return.Value(new Version(1, 1, 0)));
             Stub.On(upg2).GetProperty("TargetVersion").Will(Return.Value(new Version(1, 2, 0)));
-            Stub.On(upg2).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(upg2).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(upg2).Method("Convert").WithAnyArguments().Will(Return.Value(orig12));
 
             var upgList = new List<IResourceConverter>() { upg, upg2 };
@@ -578,16 +579,16 @@
             var upg = _mocks.NewMock<IResourceConverter>();
             Stub.On(upg).GetProperty("SourceVersion").Will(Return.Value(new Version(1, 0, 0)));
             Stub.On(upg).GetProperty("TargetVersion").Will(Return.Value(new Version(1, 1, 0)));
-            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(upg).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
 
             var upg2 = _mocks.NewMock<IResourceConverter>();
             Stub.On(upg2).GetProperty("SourceVersion").Will(Return.Value(new Version(1, 0, 0)));
             Stub.On(upg2).GetProperty("TargetVersion").Will(Return.Value(new Version(1, 3, 0)));
-            Stub.On(upg2).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(upg2).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
 
             var orig = _mocks.NewMock<IResource>();
             Stub.On(orig).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
-            Stub.On(orig).GetProperty("ResourceType").Will(Return.Value("LayerDefinition"));
+            Stub.On(orig).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
             Stub.On(orig).Method("Clone").WithAnyArguments().Will(Return.Value(orig));
 
             var upgList = new List<IResourceConverter>();

Modified: sandbox/maestro-2.5/MaestroBaseTests/EditorTests.cs
===================================================================
--- sandbox/maestro-2.5/MaestroBaseTests/EditorTests.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/MaestroBaseTests/EditorTests.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -308,9 +308,12 @@
 
             IEditorViewContent ed = new XmlEditor();
 
-            IResource resource = new FeatureSourceType();
-            resource.ResourceID = "Library://UnitTest/Test.FeatureSource";
-            resource.CurrentConnection = conn;
+            var resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.FeatureSource"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.FeatureSource));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -319,9 +322,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new LayerDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.LayerDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LayerDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -330,9 +336,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new MapDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.MapDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.MapDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.MapDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -341,9 +350,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new WebLayoutType();
-            resource.ResourceID = "Library://UnitTest/Test.WebLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.WebLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.WebLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -352,9 +364,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new PrintLayout();
-            resource.ResourceID = "Library://UnitTest/Test.PrintLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.PrintLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.PrintLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -363,9 +378,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new LoadProcedure();
-            resource.ResourceID = "Library://UnitTest/Test.LoadProcedure";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LoadProcedure"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LoadProcedure));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -375,9 +393,12 @@
             Assert.IsFalse(ed.CanBePreviewed);
 
             //MGOS 1.0.0 doesn't do fusion
-            resource = new ApplicationDefinitionType();
-            resource.ResourceID = "Library://UnitTest/Test.ApplicationDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.ApplicationDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.ApplicationDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             try
@@ -390,9 +411,12 @@
             }
 
             //MGOS 1.0.0 doesn't do advanced symbology either
-            resource = new CompoundSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolDefinition ));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             try
@@ -404,19 +428,20 @@
                 Assert.AreEqual(ex.ResourceType, ResourceTypes.SymbolDefinition);
             }
 
-            resource = new SimpleSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolLibrary"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolLibrary));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
-            try
-            {
-                ed.Resource = resource;
-            }
-            catch (UnsupportedResourceTypeException ex)
-            {
-                Assert.AreEqual(ex.ResourceType, ResourceTypes.SymbolDefinition);
-            }
+            ed.Resource = resource;
+
+            //The values we're interested in
+            Assert.IsFalse(ed.CanUpgrade);
+            Assert.IsFalse(ed.CanBePreviewed);
+
         }
 
         [Test]
@@ -439,9 +464,12 @@
 
             IEditorViewContent ed = new XmlEditor();
 
-            IResource resource = new FeatureSourceType();
-            resource.ResourceID = "Library://UnitTest/Test.FeatureSource";
-            resource.CurrentConnection = conn;
+            var resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.FeatureSource"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.FeatureSource));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -450,9 +478,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new LayerDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.LayerDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LayerDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -461,9 +492,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new MapDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.MapDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.MapDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.MapDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -472,9 +506,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new WebLayoutType();
-            resource.ResourceID = "Library://UnitTest/Test.WebLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.WebLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.WebLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -483,9 +520,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new PrintLayout();
-            resource.ResourceID = "Library://UnitTest/Test.PrintLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.PrintLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.PrintLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -494,9 +534,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new LoadProcedure();
-            resource.ResourceID = "Library://UnitTest/Test.LoadProcedure";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LoadProcedure"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LoadProcedure));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -505,12 +548,30 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            //MGOS 1.1.0 doesn't do fusion
-            resource = new ApplicationDefinitionType();
-            resource.ResourceID = "Library://UnitTest/Test.ApplicationDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolLibrary"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolLibrary));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
+            ed.Resource = resource;
+
+            //The values we're interested in
+            Assert.IsFalse(ed.CanUpgrade);
+            Assert.IsFalse(ed.CanBePreviewed);
+
+
+            //MGOS 1.0.0 doesn't do fusion
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.ApplicationDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.ApplicationDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
+
+            //The bit that actually kicks everything into action
             try
             {
                 ed.Resource = resource;
@@ -520,10 +581,13 @@
                 Assert.AreEqual(ex.ResourceType, ResourceTypes.ApplicationDefinition);
             }
 
-            //MGOS 1.1.0 doesn't do advanced symbology either
-            resource = new CompoundSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            //MGOS 1.0.0 doesn't do advanced symbology either
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             try
@@ -535,19 +599,20 @@
                 Assert.AreEqual(ex.ResourceType, ResourceTypes.SymbolDefinition);
             }
 
-            resource = new SimpleSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolLibrary"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolLibrary));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
-            try
-            {
-                ed.Resource = resource;
-            }
-            catch (UnsupportedResourceTypeException ex)
-            {
-                Assert.AreEqual(ex.ResourceType, ResourceTypes.SymbolDefinition);
-            }
+            ed.Resource = resource;
+
+            //The values we're interested in
+            Assert.IsFalse(ed.CanUpgrade);
+            Assert.IsFalse(ed.CanBePreviewed);
+
         }
 
         [Test]
@@ -569,9 +634,12 @@
 
             IEditorViewContent ed = new XmlEditor();
 
-            IResource resource = new FeatureSourceType();
-            resource.ResourceID = "Library://UnitTest/Test.FeatureSource";
-            resource.CurrentConnection = conn;
+            IResource resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.FeatureSource"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.FeatureSource));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -580,10 +648,14 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new LayerDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.LayerDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LayerDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
+
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
@@ -591,10 +663,14 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new MapDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.MapDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.MapDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.MapDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
+
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
@@ -602,10 +678,14 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new WebLayoutType();
-            resource.ResourceID = "Library://UnitTest/Test.WebLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.WebLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.WebLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
+
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
@@ -613,9 +693,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new PrintLayout();
-            resource.ResourceID = "Library://UnitTest/Test.PrintLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.PrintLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.PrintLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -624,9 +707,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new LoadProcedure();
-            resource.ResourceID = "Library://UnitTest/Test.LoadProcedure";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LoadProcedure"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LoadProcedure));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -636,9 +722,12 @@
             Assert.IsFalse(ed.CanBePreviewed);
 
             //MGOS 1.2.0 doesn't do fusion
-            resource = new ApplicationDefinitionType();
-            resource.ResourceID = "Library://UnitTest/Test.ApplicationDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.ApplicationDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.ApplicationDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             try
@@ -650,26 +739,33 @@
                 Assert.AreEqual(ex.ResourceType, ResourceTypes.ApplicationDefinition);
             }
 
-            resource = new CompoundSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
-            //The values we're interested in
+            Assert.IsFalse(ed.CanBePreviewed);
             Assert.IsFalse(ed.CanUpgrade);
-            Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new SimpleSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolLibrary"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolLibrary));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
+
             //The values we're interested in
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
+
         }
 
         [Test]
@@ -691,9 +787,12 @@
 
             IEditorViewContent ed = new XmlEditor();
 
-            IResource resource = new FeatureSourceType();
-            resource.ResourceID = "Library://UnitTest/Test.FeatureSource";
-            resource.CurrentConnection = conn;
+            IResource resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.FeatureSource"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.FeatureSource));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -702,9 +801,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new LayerDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.LayerDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LayerDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -713,9 +815,12 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new MapDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.MapDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.MapDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.MapDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -724,9 +829,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new WebLayoutType();
-            resource.ResourceID = "Library://UnitTest/Test.WebLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.WebLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.WebLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -735,9 +843,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new PrintLayout();
-            resource.ResourceID = "Library://UnitTest/Test.PrintLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.PrintLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.PrintLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -746,9 +857,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new LoadProcedure();
-            resource.ResourceID = "Library://UnitTest/Test.LoadProcedure";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LoadProcedure"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LoadProcedure));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -757,11 +871,13 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.ApplicationDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.ApplicationDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
-            resource = new ApplicationDefinitionType();
-            resource.ResourceID = "Library://UnitTest/Test.ApplicationDefinition";
-            resource.CurrentConnection = conn;
-
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
@@ -769,25 +885,31 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new CompoundSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
-            //The values we're interested in
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new SimpleSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolLibrary"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolLibrary));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
+
             //The values we're interested in
-            Assert.IsTrue(ed.CanUpgrade);
+            Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
         }
 
@@ -810,9 +932,12 @@
 
             IEditorViewContent ed = new XmlEditor();
 
-            IResource resource = new FeatureSourceType();
-            resource.ResourceID = "Library://UnitTest/Test.FeatureSource";
-            resource.CurrentConnection = conn;
+            IResource resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.FeatureSource"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.FeatureSource));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -821,9 +946,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new LayerDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.LayerDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LayerDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -832,9 +960,12 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new MapDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.MapDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.MapDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.MapDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -843,9 +974,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new WebLayoutType();
-            resource.ResourceID = "Library://UnitTest/Test.WebLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.WebLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.WebLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -854,9 +988,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new PrintLayout();
-            resource.ResourceID = "Library://UnitTest/Test.PrintLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.PrintLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.PrintLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -865,9 +1002,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new LoadProcedure();
-            resource.ResourceID = "Library://UnitTest/Test.LoadProcedure";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LoadProcedure"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LoadProcedure));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -876,11 +1016,13 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.ApplicationDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.ApplicationDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
-            resource = new ApplicationDefinitionType();
-            resource.ResourceID = "Library://UnitTest/Test.ApplicationDefinition";
-            resource.CurrentConnection = conn;
-
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
@@ -888,25 +1030,31 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new CompoundSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
-            //The values we're interested in
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new SimpleSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolLibrary"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolLibrary));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
+
             //The values we're interested in
-            Assert.IsTrue(ed.CanUpgrade);
+            Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
         }
 
@@ -929,9 +1077,12 @@
 
             IEditorViewContent ed = new XmlEditor();
 
-            IResource resource = new FeatureSourceType();
-            resource.ResourceID = "Library://UnitTest/Test.FeatureSource";
-            resource.CurrentConnection = conn;
+            IResource resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.FeatureSource"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.FeatureSource));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -940,9 +1091,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new LayerDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.LayerDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LayerDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LayerDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -951,9 +1105,12 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new MapDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.MapDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.MapDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.MapDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -962,9 +1119,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new WebLayoutType();
-            resource.ResourceID = "Library://UnitTest/Test.WebLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.WebLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.WebLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -973,9 +1133,12 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new PrintLayout();
-            resource.ResourceID = "Library://UnitTest/Test.PrintLayout";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.PrintLayout"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.PrintLayout));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -984,9 +1147,12 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new LoadProcedure();
-            resource.ResourceID = "Library://UnitTest/Test.LoadProcedure";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.LoadProcedure"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.LoadProcedure));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
@@ -995,11 +1161,13 @@
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.ApplicationDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.ApplicationDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
-            resource = new ApplicationDefinitionType();
-            resource.ResourceID = "Library://UnitTest/Test.ApplicationDefinition";
-            resource.CurrentConnection = conn;
-
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
@@ -1007,25 +1175,31 @@
             Assert.IsFalse(ed.CanUpgrade);
             Assert.IsTrue(ed.CanBePreviewed);
 
-            resource = new CompoundSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolDefinition"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolDefinition));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
 
-            //The values we're interested in
             Assert.IsTrue(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
 
-            resource = new SimpleSymbolDefinition();
-            resource.ResourceID = "Library://UnitTest/Test.SymbolDefinition";
-            resource.CurrentConnection = conn;
+            resource = _mocks.NewMock<IResource>();
+            Stub.On(resource).Method("Serialize").Will(Return.Value(""));
+            Stub.On(resource).GetProperty("ResourceID").Will(Return.Value("Library://UnitTest/Test.SymbolLibrary"));
+            Stub.On(resource).GetProperty("ResourceType").Will(Return.Value(ResourceTypes.SymbolLibrary));
+            Stub.On(resource).GetProperty("ResourceVersion").Will(Return.Value(new Version(1, 0, 0)));
+            Stub.On(resource).GetProperty("CurrentConnection").Will(Return.Value(conn));
 
             //The bit that actually kicks everything into action
             ed.Resource = resource;
+
             //The values we're interested in
-            Assert.IsTrue(ed.CanUpgrade);
+            Assert.IsFalse(ed.CanUpgrade);
             Assert.IsFalse(ed.CanBePreviewed);
         }
     }

Modified: sandbox/maestro-2.5/MaestroBaseTests/MaestroBaseTests.csproj
===================================================================
--- sandbox/maestro-2.5/MaestroBaseTests/MaestroBaseTests.csproj	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/MaestroBaseTests/MaestroBaseTests.csproj	2010-05-20 23:28:34 UTC (rev 4916)
@@ -48,7 +48,6 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="EditorTests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Capability/ConnectionCapabilities.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -27,7 +27,7 @@
     {
         private static readonly Version V_1_0_0 = new Version(1, 0, 0);
 
-        public virtual Version GetMaxSupportedResourceVersion(string resourceType)
+        public virtual Version GetMaxSupportedResourceVersion(ResourceTypes resourceType)
         {
             return V_1_0_0;
         }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -98,7 +98,7 @@
             if (!ResourceIdentifier.Validate(this.ResourceID))
                 throw new ArgumentException("Invalid resource id: " + this.ResourceID);
 
-            if (ResourceIdentifier.GetExtension(this.ResourceID) != "LoadProcedure")
+            if (ResourceIdentifier.GetResourceType(this.ResourceID) != ResourceTypes.LoadProcedure)
                 throw new ArgumentException("Not a load procedure resource id: " + this.ResourceID);
 
             LengthyOperationProgressCallBack cb = callback;

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IConnectionCapabilities.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -30,7 +30,7 @@
         /// </summary>
         /// <param name="resourceType"></param>
         /// <returns></returns>
-        Version GetMaxSupportedResourceVersion(string resourceType);
+        Version GetMaxSupportedResourceVersion(ResourceTypes resourceType);
 
         /// <summary>
         /// Gets an array of supported commands

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -133,4 +133,18 @@
         /// <returns></returns>
         object GetCustomProperty(string name);
     }
+
+    public static class ConnectionExtensionMethods
+    {
+        public static string GenerateSessionResourceId(this IServerConnection conn, ResourceTypes resType)
+        {
+            Guid id = Guid.NewGuid();
+            return conn.GenerateSessionResourceId(id.ToString(), resType);
+        }
+
+        public static string GenerateSessionResourceId(this IServerConnection conn, string name, ResourceTypes resType)
+        {
+            return "Session:" + conn.SessionID + "//" + name + "." + resType.ToString();
+        }
+    }
 }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ApplicationDefinition.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "ApplicationDefinition";
+                return ResourceTypes.ApplicationDefinition;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/DrawingSource.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/DrawingSource.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/DrawingSource.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "DrawingSource";
+                return ResourceTypes.DrawingSource;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSource.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "FeatureSource";
+                return ResourceTypes.FeatureSource;
             }
         }
 
@@ -96,4 +96,12 @@
             get { return true; }
         }
     }
+
+    partial class NameValuePairType
+    {
+        public bool ShouldSerializeExtendedData()
+        {
+            return extendedData1Field != null && extendedData1Field.Any.Length > 0;
+        }
+    }
 }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerDefinition.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "LayerDefinition";
+                return ResourceTypes.LayerDefinition;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LoadProcedure.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LoadProcedure.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/LoadProcedure.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "LoadProcedure";
+                return ResourceTypes.LoadProcedure;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/MapDefinition.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "MapDefinition";
+                return ResourceTypes.MapDefinition;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/PrintLayout.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "PrintLayout";
+                return ResourceTypes.PrintLayout;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceItems.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceItems.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/ResourceItems.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -22,6 +22,7 @@
 using System.Text;
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using System.Xml.Serialization;
+using OSGeo.MapGuide.MaestroAPI;
 
 namespace OSGeo.MapGuide.ObjectModels.Common
 {
@@ -31,7 +32,7 @@
 
         string ResourceId { get; }
 
-        string ResourceType { get; }
+        ResourceTypes ResourceType { get; }
 
         bool IsFolder { get; }
 
@@ -71,7 +72,7 @@
         public bool HasChildren { get { return false; } } //Documents don't have child resources
 
         [XmlIgnore]
-        public string ResourceType { get { return ResourceIdentifier.GetExtension(this.ResourceId); } }
+        public ResourceTypes ResourceType { get { return ResourceIdentifier.GetResourceType(this.ResourceId); } }
 
         [XmlIgnore]
         public bool IsFolder { get { return false; } }
@@ -89,7 +90,7 @@
         public bool HasChildren { get { return int.Parse(this.NumberOfDocuments) > 0 || int.Parse(this.NumberOfFolders) > 0; } }
 
         [XmlIgnore]
-        public string ResourceType { get { return "Folder"; } }
+        public ResourceTypes ResourceType { get { return ResourceTypes.Folder; } }
 
         [XmlIgnore]
         public bool IsFolder { get { return true; } }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolDefinition.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolDefinition.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolDefinition.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "SymbolDefinition";
+                return ResourceTypes.SymbolDefinition;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolLibrary.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolLibrary.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/SymbolLibrary.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "SymbolLibrary";
+                return ResourceTypes.SymbolLibrary;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/UntypedResource.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/UntypedResource.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/UntypedResource.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -30,7 +30,7 @@
     /// </summary>
     public class UntypedResource : IResource
     {
-        internal UntypedResource(string xml, string resourceType, string version)
+        internal UntypedResource(string xml, ResourceTypes resourceType, string version)
         {
             this.XmlContent = xml;
             this.ResourceType = resourceType;
@@ -54,7 +54,7 @@
             set;
         }
 
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get;
             private set;

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/WebLayout.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/WebLayout.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ObjectModels/WebLayout.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -61,11 +61,11 @@
         }
 
         [XmlIgnore]
-        public string ResourceType
+        public ResourceTypes ResourceType
         {
             get
             {
-                return "WebLayout";
+                return ResourceTypes.WebLayout;
             }
         }
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/IResourceConverter.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/IResourceConverter.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/IResourceConverter.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -38,7 +38,7 @@
         /// <summary>
         /// Gets the type of resource this can convert
         /// </summary>
-        string ResourceType { get; }
+        ResourceTypes ResourceType { get; }
 
         /// <summary>
         /// Gets the version this converter can convert from

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceConverter.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceConverter.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceConverter.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -47,7 +47,7 @@
             }
         }
 
-        private IResourceConverter FindUpgrader(string resourceType, Version source)
+        private IResourceConverter FindUpgrader(ResourceTypes resourceType, Version source)
         {
             foreach (var conv in _upgraders)
             {
@@ -74,7 +74,7 @@
             if (resource.ResourceVersion == version)
                 return resource;
 
-            string rt = resource.ResourceType;
+            var rt = resource.ResourceType;
             IResource res = (IResource)resource.Clone();
             Version currentVer = res.ResourceVersion;
             //Construct the upgrade path

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceUpgrader.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceUpgrader.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/Conversion/ResourceUpgrader.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -58,7 +58,7 @@
             get;
         }
 
-        public abstract string ResourceType
+        public abstract ResourceTypes ResourceType
         {
             get;
         }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/IResource.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -34,7 +34,7 @@
 
         string ResourceID { get; set; }
 
-        string ResourceType { get; }
+        ResourceTypes ResourceType { get; }
 
         string Serialize();
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceIdentifier.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceIdentifier.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceIdentifier.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -382,7 +382,7 @@
         /// </summary>
         /// <param name="identifier">The identifier to get the extension from</param>
         /// <returns>The extension of the identifier</returns>
-        public static string GetExtension(string identifier)
+        private static string GetExtension(string identifier)
         {
             if (string.IsNullOrEmpty(identifier))
                 throw new ArgumentNullException("identifier");
@@ -556,5 +556,10 @@
     
 
         #endregion
+
+        public static bool IsSessionBased(string resourceID)
+        {
+            return resourceID.StartsWith("Session:");
+        }
     }
 }

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceTypeDescriptor.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceTypeDescriptor.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/Resource/ResourceTypeDescriptor.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -25,7 +25,11 @@
 {
     public class ResourceTypeDescriptor
     {
-        public ResourceTypeDescriptor(string resType, string ver)
+        public ResourceTypeDescriptor(ResourceTypes resType, string ver)
+            : this(resType.ToString(), ver) 
+        { }
+
+        private ResourceTypeDescriptor(string resType, string ver)
         {
             this.ResourceType = resType;
             this.Version = ver;

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -143,7 +143,7 @@
             //does nothing, it's just for kicking the static constructor into gear 
         }
 
-        public static IResource Deserialize(string resourceType, Stream stream)
+        public static IResource Deserialize(ResourceTypes resourceType, Stream stream)
         {
             //UGLY: We have to peek inside the stream to determine the version number
 

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI/ServerConnectionBase.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -354,7 +354,7 @@
 		virtual public IResource GetResource(string resourceID)
 		{
             var stream = GetResourceXmlData(resourceID);
-            string rt = ResourceIdentifier.GetExtension(resourceID);
+            var rt = ResourceIdentifier.GetResourceType(resourceID);
 
             IResource o = ResourceTypeRegistry.Deserialize(rt, stream);
             o.CurrentConnection = GetInterface();

Modified: sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs
===================================================================
--- sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs	2010-05-20 21:17:43 UTC (rev 4915)
+++ sandbox/maestro-2.5/OSGeo.MapGuide.MaestroAPI.Http/HttpCapabilities.cs	2010-05-20 23:28:34 UTC (rev 4916)
@@ -34,25 +34,25 @@
             _parent = parent;
         }
 
-        public Version GetMaxSupportedResourceVersion(string resourceType)
+        public Version GetMaxSupportedResourceVersion(ResourceTypes resourceType)
         {
             Version ver = new Version(1, 0, 0);
             switch (resourceType)
             {
-                case "ApplicationDefinition":
+                case ResourceTypes.ApplicationDefinition:
                     if (!SupportsFusion())
                         throw new UnsupportedResourceTypeException(ResourceTypes.ApplicationDefinition);
                     break;
-                case "LayerDefinition":
+                case ResourceTypes.LayerDefinition:
                     ver = GetMaxLayerDefinitionVersion();
                     break;
-                case "LoadProcedure":
+                case ResourceTypes.LoadProcedure:
                     ver = GetMaxLoadProcedureVersion();
                     break;
-                case "WebLayout":
+                case ResourceTypes.WebLayout:
                     ver = GetMaxWebLayoutVersion();
                     break;
-                case "SymbolDefinition":
+                case ResourceTypes.SymbolDefinition:
                     if (!SupportsAdvancedSymbols())
                         throw new UnsupportedResourceTypeException(ResourceTypes.SymbolDefinition);
                     else



More information about the mapguide-commits mailing list