Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/CHANGES
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/CHANGES	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/CHANGES	(revision 5961)
@@ -0,0 +1,150 @@
+Bug Fixes and Features
+
+Release ComponentRegistry-1.14.5 (2 February 2014)
+- The Component Registry now connects to the CLARIN Concept Registry instead of ISOcat. https://trac.clarin.eu/ticket/731
+- Group components can now be saved as new in the private workspace. https://trac.clarin.eu/ticket/717
+- Reduced noice in log output. https://trac.clarin.eu/ticket/714 ; https://trac.clarin.eu/ticket/715
+
+Release ComponentRegistry-1.14.2 (2 December 2014)
+- Fixed a bug which caused incomplete component specification expansion
+
+Release ComponentRegistry-1.14.1 (1 December 2014)
+- Component and profile XML and XSD are available without authentication
+
+Release ComponentRegistry-1.14.0 (28 November 2014)
+- Merged profiles and components on persistence level into BaseComponent
+- Only one component DAO left: ComponentDao
+- DB upgrade script which migrates profiles into components
+- Rest service XML using uniform element "componentId" in comments instead of "componentDescriptionId" or "profileDescriptionId"
+- User groups have been added, for more information see <https://trac.clarin.eu/wiki/ComponentRegistryAndEditor#Management>. https://trac.clarin.eu/ticket/143
+- Fixed erroneous link for child components with direct item links. https://trac.clarin.eu/ticket/322
+- Fixed search by component ID for profiles. https://trac.clarin.eu/ticket/225
+- Simple data categories no longer show up in ISOcat search. https://trac.clarin.eu/ticket/306
+- Improvement in admin interface. https://trac.clarin.eu/ticket/294
+- Internal refactoring w.r.t. persistence layer. https://trac.clarin.eu/ticket/360
+- Added Swagger documentation for REST API. https://trac.clarin.eu/ticket/692
+
+Release ComponentRegistry-1.13.0 (25 February 2013)
+- Added RSS feeds for public profiles, components, and comments. https://trac.clarin.eu/ticket/180
+- Added help link to UI. https://trac.clarin.eu/ticket/222
+- Fixed superfluous expansion of components and profiles on save. https://trac.clarin.eu/ticket/223
+- Better handling of large specifications, fixed hangs and crashes due to lengthy XML. https://trac.clarin.eu/ticket/268
+- Profiles and components in the Component Browser can be filtered by id. https://trac.clarin.eu/ticket/225
+- Concept link URIs get validated in the Component Editor. https://trac.clarin.eu/ticket/249
+
+Release ComponentRegistry-1.12.0 (21 August 2012):
+- REST service produces 404 status when component requested that does not exist.
+- Users can delete their own comments from the Flex UI. http://trac.clarin.eu/ticket/185
+- Attribute name uniqueness check in editor of Flex UI. http://trac.clarin.eu/ticket/184
+- Added a search button to the ISOCat search dialog. http://trac.clarin.eu/ticket/190
+- Improved usability of the type edit dialog of the component editor in the Flex UI. http://trac.clarin.eu/ticket/191
+- Component browser of Flex UI now has create and edit buttons. Slight re-arrangement of other browser components. http://trac.clarin.eu/ticket/201
+- User gets warned when an action in the component editor leads to discarding pending changes. http://trac.clarin.eu/ticket/202
+- If string element is set to multilingual, max occurences field gets disabled. http://trac.clarin.eu/ticket/208
+- Added 'close' link to user settings page. http://trac.clarin.eu/ticket/156
+- Removed 'unbounded' option from minimal occurrences drop-down in editor. http://trac.clarin.eu/ticket/210
+- Made elements and components in component editor collapsable. http://trac.clarin.eu/ticket/217
+- Removed top-level tabs in the Flex UI, added buttons to browser, editor and import for navigation. http://trac.clarin.eu/ticket/218
+
+Release ComponentRegistry-1.11.1 (10 April 2012):
+- Fixed caching of w3c xml.xsd schema in validator
+- Fixes issue with user settings page users without user entry in database
+
+Release ComponentRegistry-1.11.0 (3 April 2012):
+- Upgraded to Saxon-HE 9.4
+- Validation of component specifications now also supports schematron rules in the general component schema.
+- Flex component editor does client side checks for duplicate component names.
+- Comments can be posted on profiles and components through a set of new REST calls, with support in the Flex UI. http://trac.clarin.eu/ticket/144
+- Data type 'dateTime' has been added as ValueScheme for elements. http://trac.clarin.eu/ticket/163
+- Recursion detection takes place at every component/profile registration or update. http://trac.clarin.eu/ticket/168
+- Users can set their display name through a web form linked from the Flex UI. http://trac.clarin.eu/ticket/156
+- 'Save' button in editor is only enabled when editing existing components/profiles from workspace. http://trac.clarin.eu/ticket/165
+
+Release ComponentRegistry-1.10.0 (4 November 2011):
+- Attributes can be added and edited on components. http://trac.clarin.eu/ticket/125
+- ConceptLinks can be assigned to attributes of components and elements. http://trac.clarin.eu/ticket/125#comment:3
+- ConceptLinks are enabled for Components. The search is filtered to show 'container' type concepts only. http://trac.clarin.eu/ticket/141
+- XML browser ('component preview') shows the group name if available. http://trac.clarin.eu/ticket/159
+- Added the mdEditor parameter to registry/profiles REST call to filter on profiles that should appear in e.g. Arbil. http://trac.clarin.eu/ticket/160
+- An 'about' screen can be triggered from the context menu that shows some info including the application version. http://trac.clarin.eu/ticket/106
+
+Release ComponentRegistry-1.9.1 (29 September 2011):
+- When recursion is detected while expanding (for XML or XSD), an exception is thrown, which will lead to an error response to the user rather than an infinite loop and no response. http://trac.clarin.eu/ticket/148
+
+Release ComponentRegistry-1.9 (22 September 2011):
+- Save private components works even when component is used, warning message is shown in Flex UI http://trac.clarin.eu/ticket/134
+
+Release ComponentRegistry-1.8.1 (29 June 2011):
+- Fixed some issues with UTF-8 handling http://trac.clarin.eu/ticket/133
+
+Release ComponentRegistry-1.8 (8 June 2011):
+- Backend reimplemented to use relational database instead of filesystem storage
+- Specify group for profiles http://trac.clarin.eu/ticket/49
+- Header name from specification copied to description when importing http://trac.clarin.eu/ticket/51
+- Fixed fold-out bug http://trac.clarin.eu/ticket/99
+
+Release ComponentRegistry-1.7 (26 January 2011):
+- Publishing means moving the private component/profile to public space. http://trac.clarin.eu/ticket/57
+- Edit pane is reloaded with saved component/profile. http://trac.clarin.eu/ticket/91
+- Created "show info" menu item that gives the xsd link and a bookmarkable link to open registry on selected item. http://trac.clarin.eu/ticket/59
+- Profiles in private workspace can have a public xsd. http://trac.clarin.eu/ticket/52
+
+Release ComponentRegistry-1.6.1 (19 November 2010):
+- fixed bug where registry jumps to the editor screen upon a delete
+- added tooltip to MultiLingual
+- added some whitespace to up/down icons
+- fixed issue where profiles with no "defining" component could not be edited. A "defining" component is now always added. For example see imdi-profile-instance
+
+Release ComponentRegistry-1.6 (12 November 2010):
+- No more dependency on jaxb, use default implementation in java6.
+- xml:lang in profiles/components, http://trac.clarin.eu/ticket/10
+- Add a save and a save as new button, http://trac.clarin.eu/ticket/11
+- Move clear changes button and make behaviour more clear, http://trac.clarin.eu/ticket/12 
+- Make browsing open for anyone (lazy login), http://trac.clarin.eu/ticket/14
+- "Adding ""null"" to ValueScheme (controlled vocabulary) doesn't show the item in the editor", http://trac.clarin.eu/ticket/15
+- "Make download xml, expanded", http://trac.clarin.eu/ticket/16
+- Allow reorder of elements/components in editor, http://trac.clarin.eu/ticket/17
+
+
+Release ComponentRegistry-1.5 (6 September 2010):
+- cleanup olds libs dir mpg jars can be taken from clarin maven site.
+- update jersey version
+- Admin page: cannot delete stuff, which is still used. Need to be able to update it at least at admin's risk. 
+
+
+Release ComponentRegistry-1.4 (20 August 2010):
+- Alternatively make the registry open in the browser showing the component/profile (make them bookmarkable). This involves moving the login process to a later stage and having a completely anonymous browsing registry.
+- Fix handling of eduPrincipalName/DisplayName make mapping in registry to keep track of which user has which displayName.
+  MIGRATE: add principalName to userMapping.xml, Migrate all descriptions to add userId element.
+- Import Descriptions is different from profile description, differs from edit.
+- put save button also at the bottom.
+- Make console showing tomcat log in admin page.
+- Make right click 'insert row' in valuescheme edit. So you can add an entry in the middle of an enumeration
+- Ping's don't work and are done through anonymous, it should give a better error handling and the ping should fail on anonymous. People need to be triggered to login again. Probable cause is computer sleeps and ping is not done for more then a while.
+- Make admin statistics page.
+- The description of some components/profiles is very short. The description in the actual cmdi header is longer and should be copied to the description of the description.xml's. Make a migrate plan for that.
+- link to isocat should be searchable on metadata only
+- Make isocat link clickable in isocat search field.
+- Changed tooltip in search isocat.
+
+
+Release ComponentRegistry-1.3 (28 June 2010):
+- Only admin can delete public items after a month in registry.
+- sort ignore case
+- Add some user logging.
+- Indenting XSD with one space.
+- Timeout thing. Flex client no keeps session alive by pinging the server.
+- Import screen should have bigger description field (like the editor).
+- Switched valueScheme item and appInfo columns and presentation. (Ordering will be better then).
+- Create Admin Page, where you can browse repo and edit all items. 
+- Create public link to private workspace so arbil can query it? as opposed to let people download xsd at the moment? Fix: Use XSD for now.
+- Isocat use complex conceptlinks to elements and simple types to valuescheme enumeration.
+- isocat simple/complex search in isocat metadata 'profile'
+- Stream xsd instead of creating and sending.
+- isocat popup place it in middle of screen.
+- Make swf file have version, so we have no more caching problems.
+- Add message in admin page that you are logged in as admin user. 
+- Conceptlink is selectable from the wrong column in valuescheme edit.
+- Fixed definition of multiple vocabularies in XSD. (XSLT fix).
+- Do not make popups transparant.
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/pom.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/pom.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/pom.xml	(revision 5961)
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>clarin.cmdi</groupId>
+        <artifactId>componentRegistry.parent</artifactId>
+        <version>1.0</version>
+    </parent>
+    <groupId>clarin.cmdi</groupId>
+    <artifactId>ComponentBrowserGui</artifactId>
+    <version>${ComponentBrowserGui.version}</version>
+    <packaging>swf</packaging>
+    <name>ComponentBrowserGui</name>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	<flex.version>3.6.0.16995</flex.version>
+        <flexDebug>true</flexDebug>
+    </properties>
+
+    <profiles>
+	<profile>
+	    <id>clarin</id>
+	    <properties>
+	    	<flexDebug>false</flexDebug>
+	    </properties>
+	</profile>
+    </profiles>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.adobe.flex.framework</groupId>
+            <artifactId>flex-framework</artifactId>
+            <version>${flex.version}</version>
+            <type>pom</type>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.adobe.flex.framework</groupId>
+                    <artifactId>playerglobal</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.adobe.flex.framework</groupId>
+            <artifactId>playerglobal</artifactId>
+            <version>${flex.version}</version>
+            <classifier>10</classifier>
+            <type>swc</type>
+        </dependency>
+        <dependency>
+            <groupId>com.adobe</groupId>
+            <artifactId>as3corelib</artifactId>
+            <version>0.93</version>
+            <type>swc</type>
+        </dependency>
+        <dependency>
+            <groupId>com.adobe.flexunit</groupId>
+            <artifactId>flexunit</artifactId>
+            <version>0.90</version>
+            <type>swc</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.flexspy</groupId>
+            <artifactId>flexspy</artifactId>
+            <version>1.3</version>
+            <type>swc</type>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <sourceDirectory>src/main/flex</sourceDirectory>
+        <plugins>
+           <!-- buildnumber plugin used to obtain this builds svn revision number -->
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>buildnumber-maven-plugin</artifactId>
+                <version>1.2</version>
+                <executions>
+                    <execution>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>create</goal>
+                        </goals>
+                        <configuration>
+                        	<revisionOnScmFailure>no_revision</revisionOnScmFailure>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <doCheck>false</doCheck>
+                    <doUpdate>false</doUpdate>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.sonatype.flexmojos</groupId>
+                <artifactId>flexmojos-maven-plugin</artifactId>
+                <version>3.9</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <debug>${flexDebug}</debug>
+                    <generateHtmlWrapper>true</generateHtmlWrapper>
+                    <targetPlayer>10.0.0</targetPlayer>
+                    <definesDeclaration>
+					  <property>
+						<name>APPINFO::version</name>
+						<value>"${ComponentBrowserGui.version}"</value>
+					  </property>
+					  <property>
+					  	<name>APPINFO::revision</name>
+					  	<value>"${buildNumber}"</value>
+					  </property>
+					</definesDeclaration>                    
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>com.adobe.flex</groupId>
+                        <artifactId>compiler</artifactId>
+                        <version>${flex.version}</version>
+                        <type>pom</type>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+        <pluginManagement>
+        	<plugins>
+        		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        		<plugin>
+        			<groupId>org.eclipse.m2e</groupId>
+        			<artifactId>lifecycle-mapping</artifactId>
+        			<version>1.0.0</version>
+        			<configuration>
+        				<lifecycleMappingMetadata>
+        					<pluginExecutions>
+        						<pluginExecution>
+        							<pluginExecutionFilter>
+        								<groupId>
+        									org.sonatype.flexmojos
+        								</groupId>
+        								<artifactId>
+        									flexmojos-maven-plugin
+        								</artifactId>
+        								<versionRange>
+        									[3.9,)
+        								</versionRange>
+        								<goals>
+        									<goal>compile-swf</goal>
+        									<goal>test-compile</goal>
+        								</goals>
+        							</pluginExecutionFilter>
+        							<action>
+        								<ignore></ignore>
+        							</action>
+        						</pluginExecution>
+        					</pluginExecutions>
+        				</lifecycleMappingMetadata>
+        			</configuration>
+        		</plugin>
+        	</plugins>
+        </pluginManagement>
+    </build>
+
+
+    <repositories>
+        <repository>
+            <id>forge</id>
+            <url>http://repository.sonatype.org/content/groups/flexgroup</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+        <repository>
+    <!-- repository for as3corelib.swc v0.93 -->
+		<id>ooo-maven-repo</id>
+      		<url>http://ooo-maven.googlecode.com/hg/repository</url>
+    	</repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>forge</id>
+            <url>http://repository.sonatype.org/content/groups/flexgroup</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </pluginRepository>
+        <pluginRepository>
+                <id>cmdi.clarin.repository</id>
+                <name>Clarin Repository</name>
+                <url>http://catalog.clarin.eu/ds/nexus/content/groups/public/</url>
+        </pluginRepository>
+    </pluginRepositories>
+
+
+</project>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/FlexUnitApplication.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/FlexUnitApplication.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/FlexUnitApplication.mxml	(revision 5961)
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This is an auto generated file and is not intended for modification. -->
+
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
+				xmlns:flexui="flexunit.flexui.*"
+				minWidth="955" minHeight="600" creationComplete="onCreationComplete()"
+				layout="absolute">
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.editor.model.CMDAttributeTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDComponentElementTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDSpecTest;
+			import clarin.cmdi.componentregistry.services.ComponentInfoServiceTest;
+			
+			public function currentRunTestSuite():Array
+			{
+				var testsToRun:Array = new Array();
+				testsToRun.push(clarin.cmdi.componentregistry.editor.model.CMDAttributeTest);
+				testsToRun.push(clarin.cmdi.componentregistry.editor.model.CMDComponentElementTest);
+				testsToRun.push(clarin.cmdi.componentregistry.editor.model.CMDSpecTest);
+				testsToRun.push(clarin.cmdi.componentregistry.services.ComponentInfoServiceTest);
+				return testsToRun;
+			}
+			
+			
+			private function onCreationComplete():void
+			{
+				testRunner.runWithFlexUnit4Runner(currentRunTestSuite(), "ComponentBrowserGui");
+			}
+			
+		]]>
+	</mx:Script>
+	<flexui:FlexUnitTestRunnerUI id="testRunner" portNumber="8765">
+	</flexui:FlexUnitTestRunnerUI>
+	
+</mx:Application>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/Browse.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/Browse.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/Browse.mxml	(revision 5961)
@@ -0,0 +1,317 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
+		   xmlns:browser="clarin.cmdi.componentregistry.browser.*"
+		   initialize="init()"
+		   creationComplete="creationComplete()"
+		   width="100%"
+		   height="100%"
+		   label="Component Browser"
+		   implements="clarin.cmdi.componentregistry.common.components.RegistryView" xmlns:components="clarin.cmdi.componentregistry.common.components.*"
+		   >
+	<mx:Metadata>
+		[Event(name="startItemLoaded",type="flash.events.Event")]
+	</mx:Metadata>
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.common.Group;
+			import clarin.cmdi.componentregistry.common.ItemDescription;
+			import clarin.cmdi.componentregistry.common.Profile;
+			import clarin.cmdi.componentregistry.common.components.BrowseContextMenu;
+			import clarin.cmdi.componentregistry.common.components.RegistryViewStack;
+			import clarin.cmdi.componentregistry.services.ComponentInfoService;
+			import clarin.cmdi.componentregistry.services.ComponentListService;
+			import clarin.cmdi.componentregistry.services.Config;
+			import clarin.cmdi.componentregistry.services.DeleteService;
+			import clarin.cmdi.componentregistry.services.ListGroupsOfItemService;
+			import clarin.cmdi.componentregistry.services.ProfileInfoService;
+			import clarin.cmdi.componentregistry.services.ProfileListService;
+			import clarin.cmdi.componentregistry.services.RegistrySpace;
+			
+			import mx.controls.Alert;
+			import mx.events.IndexChangedEvent;
+			import mx.utils.object_proxy;
+			
+			public static const START_ITEM_LOADED:String = "startItemLoaded";
+			
+			private var startupItemLoaded:Boolean = false;
+			
+			[Bindable]
+			private var componentsSrv:ComponentListService = Config.instance.getCurrentComponentsSrv();
+			[Bindable]
+			private var profilesSrv:ProfileListService = Config.instance.getCurrentProfilesSrv();
+			
+			[Bindable]
+			private var selectedProfileSrv:ProfileInfoService = new ProfileInfoService();
+			[Bindable]
+			private var selectedComponentSrv:ComponentInfoService = new ComponentInfoService();
+			
+			private var _deleteSrvProfiles:DeleteService;
+			private var _deleteSrvComponents:DeleteService;
+			
+			[Bindable]
+			private var profilesMenu:BrowseContextMenu;
+			[Bindable]
+			private var componentsMenu:BrowseContextMenu;
+			[Bindable]
+			private var selectedProfileItem:ItemDescription;
+			[Bindable]
+			private var selectedComponentItem:ItemDescription;
+			private var startupItemId:String = null;
+			private var startupPanel:String = null;
+
+			private const padding:int = 5;
+			private const bigPadding:int =10;
+			
+			public function init():void {
+				_deleteSrvProfiles=new DeleteService();
+				_deleteSrvComponents=new DeleteService();
+				
+				profilesMenu = new BrowseContextMenu();
+				profilesMenu.viewStack = this.parent as RegistryViewStack;
+				profilesMenu.deleteService = _deleteSrvProfiles;
+				componentsMenu = new BrowseContextMenu(true);
+				componentsMenu.viewStack = this.parent as RegistryViewStack;
+				componentsMenu.deleteService = _deleteSrvProfiles;
+				
+				_deleteSrvProfiles.addEventListener(_deleteSrvProfiles.ITEM_DELETED, handleItemDeleted);
+				_deleteSrvComponents.addEventListener(_deleteSrvComponents.ITEM_DELETED, handleItemDeleted);
+				
+				Config.instance.addEventListener(Config.REGISTRY_SPACE_TOGGLE_EVENT, toggleRegistrySpace);
+				
+			}
+			
+			private function toggleRegistrySpace(event:Event):void {
+				componentsSrv = Config.instance.getCurrentComponentsSrv();
+				profilesSrv = Config.instance.getCurrentProfilesSrv();
+				refresh();				
+				registrySpaceComboBox.setSelectedIndex();
+			}
+			
+			private function creationComplete():void { 
+				refresh();
+			}
+			
+			public function loadStartup():void {
+				startupItemId = Config.instance.startupItem;
+				startupPanel = Config.instance.browserPanel;		
+				
+				if (startupItemId) { //only load this once on startup
+					profilesSrv.addEventListener(profilesSrv.PROFILES_LOADED, profilesLoaded);				
+					profilesSrv.load();
+				}
+				else{
+					refresh();
+				}
+			}
+			
+			public function refresh():void {
+				componentsSrv.load();
+				profilesSrv.load();				
+				selectedComponentSrv = new ComponentInfoService();
+				selectedProfileSrv = new ProfileInfoService();
+			}
+			
+			
+			
+			private function profilesLoaded(event:Event):void {
+				profilesSrv.removeEventListener(profilesSrv.PROFILES_LOADED, profilesLoaded);
+				componentsSrv.addEventListener(componentsSrv.COMPONENTS_LOADED, componentsLoaded);	
+				componentsSrv.load();
+			}
+			
+			private function componentsLoaded(event:Event):void {	
+				componentsSrv.removeEventListener(componentsSrv.COMPONENTS_LOADED, componentsLoaded);
+				var item:ItemDescription = profilesSrv.findDescription(startupItemId);
+				if(item != null){
+					selectedProfileSrv = new ProfileInfoService();
+					loadStartupItem(item);
+					profileInfoPage.infoPanel.setPanel(Config.instance.browserPanel);	
+				}				
+				else {
+					item = componentsSrv.findDescription(startupItemId);
+					if(item != null){					
+						selectedComponentSrv = new ComponentInfoService();
+						loadStartupItem(item);
+						componentInfoPage.infoPanel.setPanel(Config.instance.browserPanel);	
+					} else
+						throw "Cannot find the item "+startupItemId+" in the current registries.  :S"
+				}
+			}
+			
+		
+			
+			private function loadStartupItem(item:ItemDescription):void {
+				if (item) {
+					setSelectedDescription(item);
+					startupItemId = null;
+					dispatchEvent(new Event(START_ITEM_LOADED));
+				} else if (startupItemLoaded) {
+					dispatchEvent(new Event(START_ITEM_LOADED));
+				}
+				startupItemLoaded = true;
+			}
+			
+			private function loadProfileInfoPage(event:BrowserSelectionEvent):void {
+				selectedProfileSrv.load(event.itemDescription);
+			}
+			
+			private function loadComponentInfoPage(event:BrowserSelectionEvent):void {
+				selectedComponentSrv.load(event.itemDescription);
+			}
+			
+			public function setSelectedDescription(desc:ItemDescription):void {				
+				if (desc.isProfile) {
+					tabnav.selectedIndex = 0;
+					this.selectedProfileItem = desc;
+				} else {
+					tabnav.selectedIndex = 1;
+					this.selectedComponentItem = desc;
+				}
+			}
+			
+			public function getSelectedStartItem():ItemDescription {
+				if (this.selectedProfileItem) {
+					return selectedProfileItem;
+				} else {
+					return selectedComponentItem;
+				}
+			}
+			
+			private function handleItemDeleted(event:Event):void {
+				refresh();
+			}
+			
+			public function getType():String {
+				return Config.VIEW_BROWSE;
+			}
+			
+			private function createNewProfile(event:Event):void {
+				RegistryViewStack(this.parent).getEditor().xmlEditor.clearEditorProfile();
+				RegistryViewStack(this.parent).switchToEditor(null);
+			}
+			
+			private function createNewComponent(event:Event):void {
+				RegistryViewStack(this.parent).getEditor().xmlEditor.clearEditorComponent();
+				RegistryViewStack(this.parent).switchToEditor(null);
+			}
+			
+		
+			
+			private function getSelectedIndex():int{
+				if (isComponentId(Config.instance.startupItem)) {
+					return 1;
+				} else {
+					return 0;
+				}
+			}
+			
+			private function isComponentId(id:String):Boolean{
+				if (id==null) {return false;}
+				var index:int=id.search(Config.COMPONENT_PREFIX);
+				if (index>=0) {
+					return true;
+				} else {
+					return false;
+				}
+			}
+			
+			
+			
+			protected function tabnav_changeHandler(event:IndexChangedEvent):void
+			{
+				Config.instance.activeFlavour = (event.newIndex==0?Config.FLAVOUR_PROFILES:Config.FLAVOUR_COMPONENTS);
+			}
+			
+		]]>
+	</mx:Script>
+	
+	
+	
+	<browser:BrowserColumns id="browserColumns"/>
+	
+	<mx:Panel width="100%" 
+			  height="100%"
+			  headerHeight="0"
+			  borderThicknessTop="0"
+			  borderThicknessRight="0"
+			  borderThicknessBottom="0"
+			  borderThicknessLeft="0"
+			  layout="absolute"
+			  horizontalAlign="center"
+			  >
+		
+		
+		
+		<mx:Box paddingTop="{padding}" paddingLeft="{padding}"
+				horizontalCenter="-110"
+				>
+			<components:SpaceSwitch id="registrySpaceComboBox" 
+									width="150" />
+			
+			
+		</mx:Box>
+		
+		<mx:VBox left="0"
+				 paddingTop="{bigPadding}"
+				 borderStyle="none"
+				 height="100%"
+				 width="100%">
+			
+			<mx:TabNavigator id="tabnav"
+							 selectedIndex="{getSelectedIndex()}"
+							 width="100%"
+							 height="100%"
+							 color="0x323232"
+							 y="59"
+							 borderStyle="outset"
+							 creationPolicy="all"
+							 change="tabnav_changeHandler(event)"
+							 >
+				<mx:VDividedBox label="Profiles"
+								width="100%">
+					
+					<browser:BrowserOverviewList id="profilesOverview"
+												 viewStack="{this.parent as RegistryViewStack}"
+												 browserColumns="{browserColumns.getProfileColumns()}"
+												 browserDataProvider="{profilesSrv.itemDescriptions}"
+												 browserItemSelected="{loadProfileInfoPage(event)}"
+												 itemToScrollTo="{selectedProfileItem}"
+												 width="100%"
+												 height="70%"
+												 browseMenu="{profilesMenu}"
+												 typeOfDescription = "{Config.FLAVOUR_PROFILES}"
+												 createNew="createNewProfile(event)"
+												 />
+					<browser:ProfileInfoPage id="profileInfoPage"
+											 profile="{selectedProfileSrv.profile}"
+											 width="100%"
+											 height="50%"
+											 contextMenu="{profilesMenu.cm}"/>
+				</mx:VDividedBox>
+				
+				<mx:VDividedBox label="Components"
+								width="100%"
+								>
+					<browser:BrowserOverviewList id="componentsOverview"
+												 viewStack="{this.parent as RegistryViewStack}"
+												 browserColumns="{browserColumns.getComponentColumns()}"
+												 browserDataProvider="{componentsSrv.itemDescriptions}"
+												 browserItemSelected="{loadComponentInfoPage(event)}"
+												 itemToScrollTo="{selectedComponentItem}"
+												 width="100%"
+												 height="70%"
+												 browseMenu="{componentsMenu}"
+												 typeOfDescription= "{Config.FLAVOUR_COMPONENTS}"
+												 createNew="createNewComponent(event)"
+												 />
+					<browser:ComponentInfoPage id="componentInfoPage"
+											   component="{selectedComponentSrv.component}"
+											   width="100%"
+											   height="50%"
+											   contextMenu="{componentsMenu.cm}"/>
+					
+				</mx:VDividedBox>
+			</mx:TabNavigator>
+		</mx:VBox>
+	</mx:Panel>
+</mx:Canvas>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserColumns.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserColumns.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserColumns.as	(revision 5961)
@@ -0,0 +1,101 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+	import mx.controls.dataGridClasses.DataGridColumn;
+	import mx.utils.ObjectUtil;
+	
+	public class BrowserColumns {
+		public function BrowserColumns() {
+		}
+		
+		public function getProfileColumns():Array {
+			var columns:Array = new Array();
+			columns.push(createColumn("name", "Name"));
+			columns.push(createColumn("groupName", "Group Name"));
+			columns.push(createColumn("domainName", "Domain Name"));
+			columns.push(createColumn("creatorName", "Creator"));
+			columns.push(createColumn("description", "Description"));
+			columns.push(createDateColumn());
+			columns.push(createCommentsColumn());
+			columns.push(createHiddenIdColumn());
+			return columns;
+		}
+		
+		public function getComponentColumns():Array {
+			var columns:Array = new Array();
+			columns.push(createColumn("name", "Name"));
+			columns.push(createColumn("groupName", "Group Name"));
+			columns.push(createColumn("domainName", "Domain Name"));
+			columns.push(createColumn("creatorName", "Creator"));
+			columns.push(createColumn("description", "Description"));
+			columns.push(createDateColumn());
+			columns.push(createCommentsColumn());
+			columns.push(createHiddenIdColumn());
+			return columns;
+		}
+		
+		private function createColumn(dataField:String, headerText:String):DataGridColumn {
+			var c:DataGridColumn = new DataGridColumn();
+			c.dataField = dataField;
+			c.headerText = headerText;
+			c.dataTipField = dataField;
+			c.sortCompareFunction = function(itemA:Object, itemB:Object):int { //Sort all string fields case insensitive
+				return ObjectUtil.stringCompare(itemA[dataField], itemB[dataField], true);
+			}
+			return c;
+		}
+		
+		public static function getInitialSortForProfiles():Sort {
+			var sort:Sort = new Sort();
+			var sortByGroup:SortField = new SortField("groupName", true);
+			var sortByName:SortField = new SortField("name", true);
+			var sortByDate:SortField = new SortField("registrationDate", true, true);
+			sortByDate.compareFunction = compareRegistrationDate;
+			sort.fields = [sortByGroup, sortByName, sortByDate];
+			return sort
+		}
+		
+		public static function getInitialSortForComponents():Sort {
+			var sort:Sort = new Sort();
+			var sortByGroup:SortField = new SortField("groupName", true);
+			var sortByName:SortField = new SortField("name", true);
+			var sortByDate:SortField = new SortField("registrationDate", true, true);
+			sortByDate.compareFunction = compareRegistrationDate;
+			sort.fields = [sortByGroup, sortByName, sortByDate];
+			return sort
+		}
+		
+		private function createDateColumn():DataGridColumn {
+			var c:DataGridColumn = createColumn("registrationDate", "Registration Date");
+			c.sortCompareFunction = compareRegistrationDate;
+			return c;
+		}
+		
+		private static function compareRegistrationDate(itemA:Object, itemB:Object):int {
+			return ObjectUtil.dateCompare(itemA.registrationDateValue, itemB.registrationDateValue);
+		}
+		
+		private function createCommentsColumn():DataGridColumn {
+			var c:DataGridColumn = createColumn("commentsCount","Comments");
+			c.width = 75;
+			c.sortCompareFunction = compareCommentsCount;
+			return c;
+		}
+		
+		private function createHiddenIdColumn():DataGridColumn {
+			// Hidden ID column is added so that one can use the search filter to find a component by Id
+			var idColumn:DataGridColumn = createColumn("id","Id");
+			idColumn.visible = false;
+			return idColumn;
+		}
+		
+		private static function compareCommentsCount(objectA:Object, objectB:Object):int {
+			var itemA:ItemDescription = ItemDescription(objectA);
+			var itemB:ItemDescription = ItemDescription(objectB);
+			return ObjectUtil.numericCompare(itemA.commentsCount, itemB.commentsCount);
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserOverviewList.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserOverviewList.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserOverviewList.mxml	(revision 5961)
@@ -0,0 +1,354 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 xmlns:comp="clarin.cmdi.componentregistry.common.components.*"
+		 xmlns:common="clarin.cmdi.componentregistry.common.*"
+		 xmlns:rictus="com.rictus.controls.*"
+		 creationComplete="init()">
+
+	<mx:Metadata>
+		[Event(name="browserItemSelected",type="clarin.cmdi.componentregistry.browser.BrowserSelectionEvent")]
+		[Event(name="createNew", type="clarin.cmdi.componentregistry.browser.CreateNewComponentEvent")]
+		[Event(name="groupSelected", type="clarin.cmdi.componentregistry.browser.GroupSelectionEvent")]
+	</mx:Metadata>
+
+	<mx:Array id="browserColumns"/>
+	
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.common.Group;
+			import clarin.cmdi.componentregistry.common.ItemDescription;
+			import clarin.cmdi.componentregistry.common.components.BrowseContextMenu;
+			import clarin.cmdi.componentregistry.common.components.RegistryViewStack;
+			import clarin.cmdi.componentregistry.common.components.RssDescriptionsContextMenu;
+			import clarin.cmdi.componentregistry.services.Config;
+			import clarin.cmdi.componentregistry.services.ListUserGroupsMembershipService;
+			
+			import mx.collections.ArrayCollection;
+			import mx.controls.Alert;
+			import mx.events.CloseEvent;
+			import mx.rpc.events.ResultEvent;
+			
+			private var defaultColor:Object;
+			private var currentSelectedItem:ItemDescription;
+			
+			[Bindable]
+			private var menu:BrowseContextMenu;
+			
+			private var _itemToScrollTo:ItemDescription;
+			
+			public var typeOfDescription:String;
+			
+			[Bindable]
+			public var viewStack:RegistryViewStack;
+			
+			[Bindable]
+			public var buttonsEnabled:Boolean = true;
+			
+			[Bindable]
+			public var spaceSwitchEnabled:Boolean = false;
+			
+			[Bindable]
+			private var groups:ArrayCollection = new ArrayCollection();
+			
+			private static var currentSelectedGroup:String="";
+			private var previousSelectedIndex:int=0;
+			
+			public function set browserDataProvider(dataProvider:ArrayCollection):void {
+				if (dataProvider) {
+					var data:ArrayCollection = new ArrayCollection(dataProvider.toArray().slice());
+					this.dataGrid.dataProvider = data
+					dataGrid.doFiltering();
+					scrollToSelected();
+				}
+			}
+
+			private function dispatchBrowserSelectionEvent():void {
+				if (this.dataGrid.selectedItem != null) {
+					var item:ItemDescription = dataGrid.selectedItem as ItemDescription
+					currentSelectedItem = item;
+					var event:BrowserSelectionEvent = new BrowserSelectionEvent(item);
+					dispatchEvent(event);
+				}
+			}
+
+			public function set itemToScrollTo(itemToScrollTo:ItemDescription):void {
+				_itemToScrollTo = itemToScrollTo;
+				scrollToSelected();
+			}
+			
+			private function init():void{
+				Config.instance.addEventListener(Config.REGISTRY_SPACE_TOGGLE_EVENT, onSpaceChanged);
+				groups.addItem("Move to group...");
+				Config.instance.getListUserGroupsMembershipService().addEventListener(ListUserGroupsMembershipService.GROUPS_LOADED, onGroupsLoaded);
+				Config.instance.addEventListener(Config.REGISTRY_SPACE_TOGGLE_EVENT, updateGroupVisibility);
+				Config.instance.getListUserGroupsMembershipService().loadGroupsForUser();
+				Config.instance.addEventListener(GroupSelectionEvent.GROUP_SELECTED, onGroupSelected);
+				scrollToSelected();
+				updateButtonState();
+			}
+			
+			private function onSpaceChanged(event:Event):void{
+				updateButtonState();
+			}
+			
+			private function updateButtonState():void {
+				createNewButton.visible = true;
+				createNewButton.includeInLayout = true;
+				createNewButton.enabled = Config.instance.registrySpace.space == Config.SPACE_PRIVATE;
+				if(Config.instance.registrySpace.space == Config.SPACE_PRIVATE) {
+					createNewButton.toolTip = "Create a new component or profile in the private workspace";
+				} else {
+					createNewButton.toolTip = "Switch to your private workspace in order to create a new component or profile";
+				}
+				
+				editAsNew.visible = Config.instance.registrySpace.space == Config.SPACE_PUBLISHED;
+				editAsNew.includeInLayout = Config.instance.registrySpace.space  == Config.SPACE_PUBLISHED;
+				editAsNew.enabled = Config.instance.registrySpace.space  == Config.SPACE_PUBLISHED  && dataGrid.selectedItem != null;
+				
+				edit.visible = Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				edit.includeInLayout = Config.instance.registrySpace.space  == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				edit.enabled = (Config.instance.registrySpace.space  == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP) && dataGrid.selectedItem != null;
+				
+				importButton.visible = Config.instance.registrySpace.space == Config.SPACE_PRIVATE;
+				importButton.includeInLayout = Config.instance.registrySpace.space == Config.SPACE_PRIVATE;
+				importButton.enabled = Config.instance.registrySpace.space == Config.SPACE_PRIVATE;
+				
+				groupPanel.visible = Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				groupPanel.includeInLayout = Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				groupPanel.enabled = (Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP) && dataGrid.selectedItem != null;
+				
+				groupBox.visible = Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				groupBox.includeInLayout = Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				groupBox.enabled = (Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP) && dataGrid.selectedItem != null;
+				
+				moveToGroupBtn.visible = Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				moveToGroupBtn.includeInLayout = Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP;
+				moveToGroupBtn.enabled = (Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP) && dataGrid.selectedItem != null;
+			}
+
+			private function scrollToSelected():void {
+				if (_itemToScrollTo && dataGrid.dataProvider) {
+					for (var i:int; i < dataGrid.dataProvider.length; i++) {
+						var item:ItemDescription = dataGrid.dataProvider.getItemAt(i) as ItemDescription;
+						if (item.id == _itemToScrollTo.id) {
+							dataGrid.selectedItem = item;
+							dispatchBrowserSelectionEvent();
+							dataGrid.setFocus();
+							dataGrid.scrollToIndex(i);
+							break;
+						}
+					}
+				}
+			}
+
+			public function set browseMenu(browseMenu:BrowseContextMenu):void {
+				this.menu = browseMenu;
+				menu.dataGrid = dataGrid;
+			}
+			
+			
+
+
+			private function handleKeyUp(event:KeyboardEvent):void {
+				if (event.keyCode == Keyboard.DELETE) {
+					menu.deleteSelectedItems();
+				}
+			}
+			
+			private function editItem():void {
+				var item:ItemDescription = dataGrid.selectedItem as ItemDescription;	
+				viewStack.switchToEditor(item);	
+			}
+			
+			private function importItem():void{		
+				viewStack.switchToImport();	
+			}
+			
+			private function dispatchCreateNewEvent():void{	
+				dispatchEvent(new CreateNewComponentEvent());
+			}
+			
+			
+			private function goToFeed():void{
+				var request:URLRequest = new URLRequest(Config.getRssUriDescriptions(typeOfDescription, Config.instance.registrySpace));
+				navigateToURL(request, "_blank");
+			}
+			
+			public function onGroupsLoaded(event:Event):void{
+				groups.removeAll();
+				groups.addItem({label:"Move to group...", space:null, groupId:null});
+				
+				for each (var group:Group in Config.instance.getListUserGroupsMembershipService().groups) {
+					groups.addItem({label:group.name, space:Config.SPACE_GROUP, groupId:group.id});					
+				}
+				updateGroupVisibility(event);
+			}
+			
+			
+			private function updateGroupVisibility(event:Event):void{
+				var showGroups:Boolean = Config.instance.getListUserGroupsMembershipService().groups.length>0;
+				groupPanel.visible = showGroups;
+				groupBox.selectedIndex = 0;
+			}
+			
+			protected function itemTransferToGroupComplete(resultEvent:ResultEvent):void {
+				RegistryViewStack.showView(Config.VIEW_BROWSE, currentSelectedItem);
+			}
+			
+			private function onGroupSelected(event:GroupSelectionEvent):void {
+				//we're responsible only for either components or profiles
+				if (typeOfDescription!=Config.instance.activeFlavour)
+					return;
+				//Some handler already moved the group for us
+				if (event.groupWasMoved)
+					return;
+				if (!event.getGroupId()){
+					// we don't want items to be moved from groups into void, thus object this selection event
+					//TODO: event cancellation is a bad way of dealing with actions, but the reason is that this component (of which there are 4 instances)
+					// handles the group moving action which should be done only once. This should be done in a singleton controller.
+					event.stopPropagation();
+					event.stopImmediatePropagation();
+					event.preventDefault();
+				} else{
+					if (dataGrid.selectedItems.length==0)
+						return;
+					var groupId:String = event.getGroupId();
+					Alert.show("Items, once moved to a group, can not be moved back to your workspace. Do you want to move this item?", "Title", mx.controls.Alert.YES | mx.controls.Alert.NO, this, function (nestedCloseEvent:CloseEvent):void {
+						if (nestedCloseEvent.detail == Alert.YES) {
+							for each (var item:ItemDescription in dataGrid.selectedItems) {
+								Config.instance.getListGroupsOfItemService().transferOwnership(item.id, groupId, itemTransferToGroupComplete);
+							}
+						}
+					});
+				}
+				event.groupWasMoved = true;
+			}
+			
+			private function onMoveToGroupButtonClicked(event:Event):void {
+				currentSelectedGroup=groupBox.selectedItem.groupId;
+				var groupEvent:GroupSelectionEvent = new GroupSelectionEvent(groupBox.selectedItem.groupId, groupBox.selectedItem.label);
+				Config.instance.dispatchEvent(groupEvent);
+				// did someone object this selection?
+				if (groupEvent.isDefaultPrevented()){
+					//e.preventDefault, stopPropagation and stopImmediatePropagation don't undo the selection so we have to do it manually here
+					groupBox.selectedIndex = previousSelectedIndex;
+				} else{
+					previousSelectedIndex = groupBox.selectedIndex;
+				}
+			}
+			
+			
+			
+			public function updateSelectedIndexForRegistryComobBox():void {
+				this.registrySpaceComboBox.setSelectedIndex();
+			}
+		]]>
+	</mx:Script>
+	
+	<mx:HBox id = "topPlank"
+			 paddingLeft="5" 
+			 paddingRight="5"
+			 width="100%">
+		
+		<mx:Box id ="registrySpaceOuter"
+			    paddingTop="5" paddingLeft="5" 
+				visible="{spaceSwitchEnabled}" 
+				includeInLayout="{spaceSwitchEnabled}">
+			<comp:SpaceSwitch id="registrySpaceComboBox"
+							  />
+		</mx:Box>
+		
+		<mx:HBox id = "actionButtons"
+			     horizontalAlign="left"
+				 verticalAlign="middle"
+				 width="70%"
+				 visible="{buttonsEnabled}">
+			
+			
+			<mx:Button 
+				       id="createNewButton"
+					   label="Create new" 
+					   toolTip="Create a new item in the private workspace"
+					   visible="{true}" 
+					   includeInLayout="{true}"
+					   enabled="{false}"
+					   click="dispatchCreateNewEvent()"
+					   />
+			<mx:Button 
+				       id = "edit"
+				       label="Edit"
+					   toolTip="Edit the selected item in the editor"
+					   visible="{Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP}" 
+					   includeInLayout="{Config.instance.registrySpace.space  == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP}"
+					   enabled="{(Config.instance.registrySpace.space  == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP) &amp;&amp; dataGrid.selectedItem != null}" 
+					   click="editItem()" />
+			<mx:Button id = "editAsNew"
+				       label="Edit as new"   
+					   toolTip="Edit the selected item as a new item in the private or group workspace"
+					   visible="{Config.instance.registrySpace.space == Config.SPACE_PUBLISHED}" 
+					   includeInLayout="{Config.instance.registrySpace.space == Config.SPACE_PUBLISHED}"
+					   enabled="{Config.instance.registrySpace.space == Config.SPACE_PUBLISHED &amp;&amp; dataGrid.selectedItem != null}" 
+					   click="editItem()" />
+			<mx:Button id="importButton"
+					   label="Import"
+					   visible="{Config.instance.registrySpace.space == Config.SPACE_PRIVATE}" 
+					   includeInLayout="{Config.instance.registrySpace.space == Config.SPACE_PRIVATE}"
+					   enabled="{Config.instance.registrySpace.space == Config.SPACE_PRIVATE}"
+					   toolTip="Import an item from a local file"
+					   click="importItem()" />
+			
+			<mx:HBox id="groupPanel" 
+					 visible="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED}"
+					 includeInLayout="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED}"
+					 enabled="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED &amp;&amp; dataGrid.selectedItem != null}" 
+					 >
+				<mx:ComboBox id="groupBox"
+							 visible="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED}"
+							 includeInLayout="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED}"
+							 enabled="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED &amp;&amp; dataGrid.selectedItem != null}" 
+							 dataProvider="{groups}"
+							 />
+				<mx:Button id="moveToGroupBtn"
+						   label="Move to group"
+						   visible="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED}"
+						   includeInLayout="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED}"
+						   enabled="{Config.instance.registrySpace.space != Config.SPACE_PUBLISHED &amp;&amp; dataGrid.selectedItem != null}" 
+						   click="onMoveToGroupButtonClicked(event)"/>
+			</mx:HBox>
+			
+		</mx:HBox>
+		
+		<mx:HBox id= "showBox"
+			    horizontalAlign="right"
+				 verticalAlign="middle"
+				 width="30%">
+	
+			<rictus:SearchBox id="searchBox"
+							  label="filter..."/>
+			<mx:Label text="Showing {dataGrid.dataProvider.length} of {dataGrid.unfilteredLength}"/>
+	   </mx:HBox>
+		<comp:RssLinkButton 
+			id="rssLink"
+			enabled ="{Config.instance.registrySpace.space != Config.SPACE_PRIVATE}"
+			visible="{Config.instance.registrySpace.space != Config.SPACE_PRIVATE}"
+			contextMenu = "{(new RssDescriptionsContextMenu(typeOfDescription)).cm}"
+			click="goToFeed()">	
+	  </comp:RssLinkButton>	
+	</mx:HBox>
+
+	<comp:FilteringDataGrid id="dataGrid"
+							x="0"
+							y="112"
+							width="100%"
+							height="100%"
+							change="dispatchBrowserSelectionEvent()"
+							columns="{browserColumns}"
+							contextMenu="{menu.cm}"
+							allowMultipleSelection="true"
+							searchInput="{searchBox}"
+							keyUp="handleKeyUp(event)"
+							useRollOver="false"
+							showDataTips="true">
+	</comp:FilteringDataGrid>
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserSelectionEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserSelectionEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/BrowserSelectionEvent.as	(revision 5961)
@@ -0,0 +1,27 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+
+	import flash.events.Event;
+
+	public class BrowserSelectionEvent extends Event {
+
+		public static const BROWSER_ITEM_SELECTED:String = "browserItemSelected";
+		private var _itemDescription:ItemDescription;
+
+		public function BrowserSelectionEvent(itemDescription:ItemDescription, bubbles:Boolean = false, cancelable:Boolean = false) {
+			super(BROWSER_ITEM_SELECTED, bubbles, cancelable);
+			_itemDescription = itemDescription;
+		}
+
+		public function get itemDescription():ItemDescription {
+			return _itemDescription;
+		}
+
+		override public function clone():Event {
+			return new BrowserSelectionEvent(_itemDescription, bubbles, cancelable);
+		}
+
+
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CMDComponentXMLBrowser.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CMDComponentXMLBrowser.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CMDComponentXMLBrowser.as	(revision 5961)
@@ -0,0 +1,147 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.CMDSpecRenderer;
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.ExpandingComponentLabel;
+	import clarin.cmdi.componentregistry.editor.model.CMDAttribute;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	import clarin.cmdi.componentregistry.editor.model.CMDSpec;
+
+	import flash.utils.getTimer;
+
+	import mx.collections.ArrayCollection;
+	import mx.containers.HBox;
+	import mx.containers.VBox;
+	import mx.controls.HRule;
+	import mx.controls.Label;
+	import mx.controls.Spacer;
+	import mx.core.Container;
+	import mx.managers.IFocusManagerComponent;
+
+	/**
+	 * Browser view created from CMDComponent xml
+	 */
+	public class CMDComponentXMLBrowser extends VBox implements IFocusManagerComponent, CMDSpecRenderer {
+
+		private var _spec:CMDSpec;
+		private var _firstComponent:CMDComponent;
+
+		public function CMDComponentXMLBrowser() {
+			super();
+			styleName = StyleConstants.XMLBROWSER;
+			focusEnabled = true;
+			tabEnabled = true;
+		}
+
+		public function set cmdSpec(cmdSpec:CMDSpec):void {
+			_spec = cmdSpec;
+			createNewBrowser();
+		}
+
+		[Bindable]
+		public function get cmdSpec():CMDSpec {
+			return _spec;
+		}
+
+		private function createNewBrowser():void {
+			var start:int = getTimer();
+			removeAllChildren()
+			checkFirstDefiningComponent(_spec.cmdComponents);
+			var componentLink:HBox = CMDComponentXMLBrowser.createComponentLink(_firstComponent);
+			if (!componentLink) {
+				handleHeader(_firstComponent.name);
+			} else {
+				handleHeader(_spec.headerName);
+				//FirstComponent is link so creating that.
+				addChild(componentLink);
+				if (_firstComponent.cardinalityMin != "" || _firstComponent.cardinalityMax != "") {
+					addChild(new XMLBrowserLine(LabelConstants.CARDINALITY, _firstComponent.cardinalityMin + " - " + _firstComponent.cardinalityMax));
+				}
+			}
+			handleCMDAttributeList(this, _firstComponent.attributeList, 0);
+			handleElements(_firstComponent.cmdElements);
+			handleComponents(_firstComponent.cmdComponents);
+			trace("Created browser view in " + (getTimer() - start) + " ms.");
+		}
+
+		public static function handleCMDAttributeList(parent:Container, attributes:ArrayCollection, indent:int):void {
+			if (attributes.length > 0) {
+				var heading:HBox = new HBox();
+				var label:Label = new Label();
+				label.text = LabelConstants.ATTRIBUTELIST;
+				label.styleName = StyleConstants.XMLBROWSER_FIELD;
+				var smallIndent:Spacer = new Spacer();
+				smallIndent.width = 5;
+				if (indent > 0)
+					heading.addChild(getIndentSpacer(indent));
+				heading.addChild(smallIndent);
+				heading.addChild(label);
+				parent.addChild(heading);
+				for each (var attribute:CMDAttribute in attributes) {
+					var child:XMLBrowserValueSchemeLine = new XMLBrowserValueSchemeLine(attribute.name, indent+1, attribute.valueSchemeSimple, attribute.valueSchemePattern, attribute.valueSchemeEnumeration, attribute.conceptLink);
+					parent.addChild(child);
+				}
+			}
+		}
+
+		public static function getIndentSpacer(indent:int):Spacer {
+			var result:Spacer = new Spacer();
+			result.width = 56 * indent;
+			return result;
+		}
+
+		/**
+		 * The xml model allows more component to be defined but we force only one component at the "root" level.
+		 */
+		private function checkFirstDefiningComponent(components:ArrayCollection):void {
+			if (components.length != 1) {
+				throw new Error("A profile/component must have 1 component defined at root level.");
+			} else {
+				_firstComponent = components.getItemAt(0) as CMDComponent;
+			}
+		}
+
+		private function handleHeader(name:String):void {
+			addChild(new XMLBrowserLine(LabelConstants.NAME, name, StyleConstants.XMLBROWSER_FIELD, StyleConstants.XMLBROWSER_HEADER));
+			if(_spec.groupName){
+				addChild(new XMLBrowserLine(LabelConstants.GROUP_NAME, _spec.groupName));
+			}
+			addChild(new XMLBrowserLine(LabelConstants.DESCRIPTION, _spec.headerDescription));
+			if (_firstComponent.conceptLink) {
+				addChild(new XMLBrowserConceptLinkLine(LabelConstants.CONCEPTLINK, _firstComponent.conceptLink));
+			}
+			var ruler:HRule = new HRule();
+			ruler.percentWidth = 80;
+			addChild(ruler);
+		}
+
+		private function handleElements(elements:ArrayCollection):void {
+			for each (var element:CMDComponentElement in elements) {
+				var elementBrowse:ElementBrowse = new ElementBrowse(element);
+				elementBrowse.createAndAddChildren(this, 1);
+			}
+		}
+
+		private function handleComponents(components:ArrayCollection):void {
+			for each (var component:CMDComponent in components) {
+				var componentBrowse:ComponentBrowse = new ComponentBrowse(component);
+				componentBrowse.createAndAddChildren(this);
+			}
+		}
+
+		public static function createComponentLink(component:CMDComponent):HBox {
+			if (component.componentId != "" && component.componentId != null) {
+				var result:HBox = new HBox();
+				var labelName:Label = new Label();
+				labelName.styleName = StyleConstants.XMLBROWSER_HEADER;
+				labelName.text = LabelConstants.COMPONENT;
+				result.addChild(labelName);
+				result.addChild(new ExpandingComponentLabel(component.componentId, false));
+				return result;
+			}
+			return null;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CommentPanel.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CommentPanel.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CommentPanel.as	(revision 5961)
@@ -0,0 +1,83 @@
+package clarin.cmdi.componentregistry.browser
+{
+	import clarin.cmdi.componentregistry.common.Comment;
+	import clarin.cmdi.componentregistry.services.DeleteService;
+	
+	import flash.events.MouseEvent;
+	
+	import mx.containers.HBox;
+	import mx.containers.VBox;
+	import mx.controls.Alert;
+	import mx.controls.Button;
+	import mx.controls.HRule;
+	import mx.controls.Label;
+	import mx.controls.Text;
+	import mx.events.CloseEvent;
+	
+	public class CommentPanel extends VBox
+	{
+		private var userNameLabel:Label = new Label();
+		private var dateLabel:Label = new Label();
+		private var commentText:Text = new Text();
+		private var comment:Comment;
+		private var _deleteSrvOfCommentsPanel:DeleteService;
+		
+		public function CommentPanel(comment:Comment, deleteSrvOfCommentsPanel:DeleteService)
+		{
+			super();
+			this.comment = comment;
+			this._deleteSrvOfCommentsPanel = deleteSrvOfCommentsPanel;
+			
+			initLayout();
+			setValues();
+		}
+		
+		private function initLayout():void{
+			this.width = 400;
+			
+			var header:HBox = new HBox();
+			header.percentWidth = 100;
+			header.addChild(userNameLabel);
+			header.addChild(dateLabel);
+			
+			userNameLabel.setStyle("fontWeight","bold");
+			userNameLabel.setStyle("textDecoration","underline");
+			userNameLabel.percentWidth = 70;
+			dateLabel.setStyle("textAlign", "right");
+			dateLabel.setStyle("fontWeight","bold");
+			dateLabel.percentWidth = 30;
+			
+			addChild(header);
+			
+			commentText.percentWidth = 100;
+			addChild(commentText);
+			
+			if(comment.canDelete) {				
+				var deleteButton:Button = new Button();
+				deleteButton.label = "Delete comment";
+				deleteButton.addEventListener(MouseEvent.CLICK, confirmDeleteHandler);
+				addChild(deleteButton);
+			}
+			
+			var rule:HRule = new HRule();
+			rule.percentWidth = 100;
+			addChild(rule);
+		}
+		
+		private function setValues():void{
+			userNameLabel.text = comment.userName;
+			dateLabel.text = comment.commentDate;
+			commentText.text = comment.comments;
+		}
+		
+		private function confirmDeleteHandler(event:MouseEvent):void{
+			Alert.show("Are you sure you want to delete this comment?", "Delete comment", Alert.OK|Alert.CANCEL, this, deleteHandler);
+		}
+		
+		private function deleteHandler(event:CloseEvent):void {
+			if(event.detail == Alert.OK){
+				_deleteSrvOfCommentsPanel.deleteComment(comment);
+			}	
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CommentsPanel.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CommentsPanel.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CommentsPanel.as	(revision 5961)
@@ -0,0 +1,166 @@
+ package clarin.cmdi.componentregistry.browser
+{
+	import clarin.cmdi.componentregistry.common.Comment;
+	import clarin.cmdi.componentregistry.common.Credentials;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.RssCommentsContextMenu;
+	import clarin.cmdi.componentregistry.common.components.RssLinkButton;
+	import clarin.cmdi.componentregistry.services.CommentListService;
+	import clarin.cmdi.componentregistry.services.CommentPostService;
+	import clarin.cmdi.componentregistry.services.Config;
+	import clarin.cmdi.componentregistry.services.DeleteService;
+	
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	import flash.net.URLRequest;
+	import flash.net.navigateToURL;
+	
+	import mx.containers.Canvas;
+	import mx.containers.HBox;
+	import mx.containers.VBox;
+	import mx.controls.HRule;
+	import mx.controls.Image;
+	import mx.controls.Label;
+	import mx.controls.Spacer;
+	import mx.controls.scrollClasses.ScrollBar;
+	
+	
+	
+	[Event(name="commentsLoaded",type="flash.events.Event")]
+	public class CommentsPanel extends HBox
+	{
+		public static const COMMENTS_LOADED:String = "commentsLoaded";
+		
+		
+		[Bindable]
+		private var _itemDescription:ItemDescription;
+		
+		private var service:CommentListService;
+		private var _deleteSrvComments:DeleteService;
+		private var commentsBox:VBox;
+		
+		private const hPadding:int = 5;
+		private const vPadding:int = 5;
+		
+		public function get commentListService():CommentListService {
+			return service;
+		}
+		
+		public function set itemDescription(itemDescription:ItemDescription):void {
+			_itemDescription = itemDescription;
+		}
+		
+		
+		public function CommentsPanel()
+		{  
+			this.setStyle("paddingLeft", vPadding);
+			this.setStyle("paddingTop", hPadding);
+			this.setStyle("paddingRight", vPadding);
+			this.setStyle("paddingBottom", hPadding);
+			
+			_deleteSrvComments=new DeleteService();
+			_deleteSrvComments.addEventListener(_deleteSrvComments.ITEM_DELETED, commentDeletedHandler);
+		}
+		
+	   
+		
+		private function makeRssLinkButton():RssLinkButton{
+			
+			var rssButtonTmp:RssLinkButton = new RssLinkButton();
+			rssButtonTmp.contextMenu = (new RssCommentsContextMenu(_itemDescription)).cm;
+			rssButtonTmp.addEventListener(MouseEvent.CLICK,  goToFeed);
+			return rssButtonTmp;
+		}
+		
+		private function goToFeed(event:MouseEvent):void{
+			navigateToURL(new URLRequest(Config.getRssUriComments(_itemDescription)), "_blank");
+		}
+		
+		public function load():void{
+			removeAllChildren();
+			
+			
+			if(_itemDescription != null) {
+				
+				// A box for the comments (will be loaded in callback but should be shown first)
+				commentsBox = new VBox();
+				addChild(commentsBox);
+				
+				
+				// Do actual loading
+				service = new CommentListService(_itemDescription);
+				service.addEventListener(CommentListService.COMMENTS_LOADED, commentsLoaded);
+				service.load();
+				
+				// Rss feed "button"
+				if  (_itemDescription.isPrivate != Config.SPACE_PRIVATE){
+					var spacer:Spacer = new Spacer();
+					spacer.percentWidth=100;
+					addChild(spacer);
+					var rssButton:RssLinkButton  = makeRssLinkButton();
+					addChild(rssButton);
+				}
+				
+			}
+		}
+		
+		private function addPostPanel():void{
+			if(Credentials.instance.isLoggedIn()){
+				var postPanel:commentPostPanel = new commentPostPanel();
+				postPanel.itemDescription = _itemDescription;
+				postPanel.commentPostService.addEventListener(CommentPostService.POST_COMPLETE, postCompleteHandler);
+				commentsBox.addChild(postPanel);
+			} else{
+				var loginToPostLabel:Label = new Label();
+				loginToPostLabel.setStyle("fontWeight","bold");
+				loginToPostLabel.text = "Login to leave a comment!";
+				commentsBox.addChild(loginToPostLabel);
+			}
+		}
+		
+		private function commentsLoaded(event:Event):void{
+			if(service) {
+				var commentsCount:int;
+				
+				if (service.comments) {
+					commentsCount=service.comments.length;
+				}
+				else {
+					commentsCount=0;
+				}
+				
+				if (_itemDescription != null) {_itemDescription.commentsCount = commentsCount;}
+				
+				if(commentsCount > 0) {
+					for each(var comment:Comment in service.comments) {
+						var panel:CommentPanel = new CommentPanel(comment, _deleteSrvComments);
+						commentsBox.addChild(panel);
+					}
+				} else {
+					var noCommentsPostedLabel:Label = new Label();
+					noCommentsPostedLabel.text = "No comments have been posted thus far.";
+					commentsBox.addChild(noCommentsPostedLabel);
+					
+					var rule:HRule = new HRule();
+					rule.percentWidth = 100;
+					commentsBox.addChild(rule);
+				}
+			}
+			dispatchEvent(new Event(COMMENTS_LOADED));
+			
+			// A panel for posting a comment (or a message 'login to post');
+			addPostPanel();
+			
+			
+		}
+		
+		private function postCompleteHandler(event:Event):void{
+			load();
+		}
+		
+		private function commentDeletedHandler(event:Event):void {
+			load();
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ComponentBrowse.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ComponentBrowse.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ComponentBrowse.as	(revision 5961)
@@ -0,0 +1,82 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	
+	import mx.collections.ArrayCollection;
+	import mx.containers.HBox;
+	import mx.controls.Alert;
+	import mx.controls.HRule;
+	import mx.core.Container;
+
+	public class ComponentBrowse {
+		private var _component:CMDComponent;
+		private var container:Container;
+		private var indent:int = 0;
+
+		public function ComponentBrowse(component:CMDComponent) {
+			super();
+			_component = component;
+		}
+
+		public function createAndAddChildren(container:Container, indent:int = 0):void {
+			this.container = container;
+			this.indent = indent;
+			if (indent == 0) {
+				var ruler:HRule = new HRule();
+				ruler.percentWidth = 80;
+				container.addChild(ruler);
+			}
+			var componentLink:HBox = CMDComponentXMLBrowser.createComponentLink(_component);
+			if (componentLink != null) {
+				addChild(componentLink);
+				addCardinalityLine();
+			} else {
+				addChild(new XMLBrowserLine(LabelConstants.COMPONENT, _component.name, StyleConstants.XMLBROWSER_HEADER, StyleConstants.XMLBROWSER_HEADER));
+				if (_component.conceptLink) {
+					addChild(new XMLBrowserConceptLinkLine(LabelConstants.CONCEPTLINK, _component.conceptLink));
+				}
+				addCardinalityLine();
+				CMDComponentXMLBrowser.handleCMDAttributeList(container, _component.attributeList, indent);
+				handleElements(_component.cmdElements);
+				handleComponents(_component.cmdComponents); //recursion
+			}
+		}
+
+		private function handleElements(elements:ArrayCollection):void {
+			for each (var element:CMDComponentElement in elements) {
+				var elementBrowse:ElementBrowse = new ElementBrowse(element);
+				elementBrowse.createAndAddChildren(container, indent + 1);
+			}
+		}
+
+		private function handleComponents(components:ArrayCollection):void {
+			for each (var component:CMDComponent in components) {
+				var componentBrowse:ComponentBrowse = new ComponentBrowse(component);
+				componentBrowse.createAndAddChildren(container, indent + 1);
+			}
+		}
+
+
+		private function addCardinalityLine():void {
+			if (_component.cardinalityMin != "" || _component.cardinalityMax != "")
+				addChild(new XMLBrowserLine(LabelConstants.CARDINALITY, _component.cardinalityMin + " - " + _component.cardinalityMax));
+
+		}
+
+		private function addLine(name:String, value:String):void {
+			if (value) {
+				addChild(new XMLBrowserLine(name, value));
+			}
+		}
+
+		private function addChild(child:HBox):void {
+			if (indent > 0) {
+				child.addChildAt(CMDComponentXMLBrowser.getIndentSpacer(indent), 0);
+			}
+			this.container.addChild(child);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ComponentInfoPage.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ComponentInfoPage.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ComponentInfoPage.mxml	(revision 5961)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 xmlns:common="clarin.cmdi.componentregistry.common.*"
+		 xmlns:browser="clarin.cmdi.componentregistry.browser.*"
+		 width="100%"
+		 backgroundColor="#DDE3EF"
+		 >
+
+	<common:Component id="component"/>
+
+	<browser:infoPage id="infoPanel"
+				   cmdComponent="{component.componentMD.xml}"
+				   itemDescription="{component.description}"
+				   headerLabel="{component.description.name}"
+				   width="100%"
+				   height="100%"
+				   visible="{component != null}"/>
+
+</mx:VBox>
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CreateNewComponentEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CreateNewComponentEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/CreateNewComponentEvent.as	(revision 5961)
@@ -0,0 +1,14 @@
+package clarin.cmdi.componentregistry.browser
+{
+	import flash.events.Event;
+
+	public class CreateNewComponentEvent extends Event
+	{
+		public static const CREATE_NEW_EVENT:String = "createNew";
+		
+		public function CreateNewComponentEvent( bubbles:Boolean = false, cancelable:Boolean = false)
+		{
+			super(CREATE_NEW_EVENT, bubbles, cancelable);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ElementBrowse.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ElementBrowse.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ElementBrowse.as	(revision 5961)
@@ -0,0 +1,69 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	
+	import mx.containers.HBox;
+	import mx.controls.Label;
+	import mx.core.Container;
+	import mx.core.UIComponent;
+
+	public class ElementBrowse {
+		private var _element:CMDComponentElement;
+		private var container:Container;
+				private var _indent:int = 0;
+		
+
+		public function ElementBrowse(element:CMDComponentElement) {
+			super();
+			_element = element;
+		}
+
+		public function createAndAddChildren(container:Container, indent:int = 0):void {
+			this.container = container;
+			this._indent = indent;
+			addHeading();
+			if (_element.conceptLink)
+				addChild(new XMLBrowserConceptLinkLine(LabelConstants.CONCEPTLINK, _element.conceptLink), _indent);
+			addLine(LabelConstants.DOCUMENTATION, _element.documentation);
+			addLine(LabelConstants.DISPLAY_PRIORITY, _element.displayPriority);
+			if (_element.cardinalityMin != "" || _element.cardinalityMax != "") {
+				addLine(LabelConstants.CARDINALITY, _element.cardinalityMin + " - " + _element.cardinalityMax);
+			}
+			if (_element.valueSchemeSimple && _element.valueSchemeSimple == "string") {
+			    addLine(LabelConstants.MULTILINGUAL, _element.multilingual);
+			}
+			CMDComponentXMLBrowser.handleCMDAttributeList(container, _element.attributeList, _indent - 1);
+		}
+
+		private function addHeading():void {
+			var line:HBox = new HBox();
+			var heading:Label = new Label();
+			heading.text = LabelConstants.ELEMENT;
+			heading.styleName = StyleConstants.XMLBROWSER_HEADER;
+			var name:Label = new Label();
+			name.text = _element.name;
+			name.styleName = StyleConstants.XMLBROWSER_HEADER;
+			var value:UIComponent = XMLBrowserValueSchemeLine.createValueScheme(_element.valueSchemeSimple, _element.valueSchemePattern, _element.valueSchemeEnumeration);
+			value.styleName = StyleConstants.XMLBROWSER_FIELD_VALUE;
+			line.addChild(heading);
+			line.addChild(name);
+			line.addChild(value);
+			addChild(line, _indent - 1);
+		}
+
+		private function addLine(name:String, value:String):void {
+			if (value) {
+				addChild(new XMLBrowserLine(name, value), _indent);
+			}
+		}
+
+		private function addChild(child:HBox, indent:int):void {
+			if(indent > 0) {
+				child.addChildAt(CMDComponentXMLBrowser.getIndentSpacer(indent), 0);
+			}
+			this.container.addChild(child);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/GroupSelectionEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/GroupSelectionEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/GroupSelectionEvent.as	(revision 5961)
@@ -0,0 +1,39 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import flash.events.Event;
+
+	/**
+	 * This event models the selection of a group
+	 * @author george.georgovassilis@mpi.nl 
+	 */
+	
+	public class GroupSelectionEvent extends Event {
+
+		public static const GROUP_SELECTED:String = "groupSelected";
+		private var groupId:String;
+		private var groupLabel:String;
+		public var groupWasMoved:Boolean = false;
+
+		public function GroupSelectionEvent(groupId:String, groupLabel:String) {
+			super(GROUP_SELECTED, true, true);
+			this.groupId = groupId;
+			this.groupLabel = groupLabel;
+		}
+
+		override public function clone():Event {
+			var copy:GroupSelectionEvent = new GroupSelectionEvent(groupId, groupLabel);
+			copy.groupWasMoved = groupWasMoved;
+			return copy;
+		}
+
+		public function getGroupId():String{
+			return groupId;
+		}
+
+		public function getGroupLabel():String{
+			return groupLabel;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ProfileInfoPage.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ProfileInfoPage.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/ProfileInfoPage.mxml	(revision 5961)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 xmlns:common="clarin.cmdi.componentregistry.common.*"
+		 xmlns:browser="clarin.cmdi.componentregistry.browser.*"
+		 width="100%"
+		 backgroundColor="#DDE3EF">
+
+	<common:Profile id="profile"/>
+
+	<browser:infoPage id="infoPanel"
+				   cmdComponent="{profile.profileSource}"
+				   itemDescription="{profile.description}"
+				   headerLabel="{profile.description.name}"
+				   width="100%"
+				   height="100%"
+				   visible="{profile != null}"/>
+
+</mx:VBox>
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/SwitchViewEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/SwitchViewEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/SwitchViewEvent.as	(revision 5961)
@@ -0,0 +1,29 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import flash.events.Event;
+
+	/**
+	 * Switch views
+	 * @author george georgovassilis
+	 */
+	public class SwitchViewEvent extends Event {
+
+		public static const SWITCH_VIEW:String = "switchView";
+		public var view:String;
+		public var item:ItemDescription;
+
+		public function SwitchViewEvent(view:String, item:ItemDescription) {
+			super(SWITCH_VIEW);
+			this.view = view;
+			this.item = item;
+		}
+
+		override public function clone():Event {
+			return new SwitchViewEvent(SWITCH_VIEW, item);
+		}
+
+
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserConceptLinkLine.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserConceptLinkLine.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserConceptLinkLine.as	(revision 5961)
@@ -0,0 +1,28 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.LinkRenderer;
+	
+	import mx.containers.HBox;
+	import mx.controls.Label;
+
+	public class XMLBrowserConceptLinkLine extends HBox {
+
+		private var nameLabel:Label = new Label();
+		private var fieldValue:LinkRenderer = new LinkRenderer();
+
+		public function XMLBrowserConceptLinkLine(name:String, value:String) {
+			super();
+			nameLabel.text = name;
+			nameLabel.styleName = StyleConstants.XMLBROWSER_FIELD;
+			fieldValue.text = value;
+			fieldValue.styleName = StyleConstants.XMLBROWSER_FIELD_VALUE;
+			fieldValue.width = 500;
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(nameLabel);
+			addChild(fieldValue);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserLine.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserLine.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserLine.as	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.containers.HBox;
+	import mx.controls.Label;
+	import mx.controls.Text;
+
+	public class XMLBrowserLine extends HBox {
+
+		private var nameLabel:Label = new Label();
+		private var fieldValue:Text = null;
+
+		public function XMLBrowserLine(name:String, value:String, nameStyle:String=StyleConstants.XMLBROWSER_FIELD_VALUE, valueStyle:String=StyleConstants.XMLBROWSER_FIELD_VALUE) {
+			super();
+			nameLabel.text = name;
+			nameLabel.styleName = nameStyle;
+			if (value) {
+				fieldValue = new Text();
+				fieldValue.text = value;
+				fieldValue.styleName = valueStyle;
+				fieldValue.width = 500;
+			}
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(nameLabel);
+			if (fieldValue != null) {
+				addChild(fieldValue);
+			}
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserValueSchemeLine.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserValueSchemeLine.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/XMLBrowserValueSchemeLine.as	(revision 5961)
@@ -0,0 +1,92 @@
+package clarin.cmdi.componentregistry.browser {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.LinkRenderer;
+	import clarin.cmdi.componentregistry.editor.ValueSchemeItem;
+	
+	import flash.display.DisplayObject;
+	
+	import mx.collections.ArrayCollection;
+	import mx.containers.HBox;
+	import mx.controls.ComboBox;
+	import mx.controls.Label;
+	import mx.controls.Text;
+	import mx.core.ClassFactory;
+	import mx.core.UIComponent;
+
+	public class XMLBrowserValueSchemeLine extends HBox {
+		private var nameLabel:Label = new Label();
+		private var conceptLink:LinkRenderer;
+		private var valueObject:DisplayObject;
+		private var _indent:int = 0;
+
+		public function XMLBrowserValueSchemeLine(name:String, indent:int, value:String = null, valuePattern:String = null, valueList:ArrayCollection = null, conceptLinkValue:String = null) {
+			super();
+			_indent = indent;
+			nameLabel.text = name;
+			nameLabel.styleName = StyleConstants.XMLBROWSER_FIELD;
+			valueObject = createValueScheme(value, valuePattern, valueList);
+			conceptLink = createConceptLink(conceptLinkValue);
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			if (_indent > 0)
+				addChild(CMDComponentXMLBrowser.getIndentSpacer(_indent));
+			addChild(nameLabel);
+			addChild(valueObject);
+			if(conceptLink){
+				addChild(conceptLink);
+			}
+		}
+		
+		public static function createConceptLink(linkValue:String):LinkRenderer{
+			if(linkValue){
+				var conceptLink:LinkRenderer = new LinkRenderer();
+				conceptLink.text = linkValue;
+				conceptLink.styleName = StyleConstants.XMLBROWSER_FIELD_VALUE;
+				return conceptLink;
+			} else {
+				return null;
+			}
+		}
+
+		public static function createValueScheme(value:String = null, valuePattern:String = null, valueList:ArrayCollection = null):UIComponent {
+			if (valueList) {
+				return createEnumeration(valueList);
+			} else if (valuePattern) {
+				return createText(valuePattern);
+			} else {
+				return createText(value);
+			}
+		}
+
+		private static function createText(value:String):UIComponent {
+			var result:Text = new Text();
+			result.text = value;
+			result.styleName = StyleConstants.XMLBROWSER_FIELD_VALUE;
+			return result;
+		}
+
+		private static function createEnumeration(enumeration:ArrayCollection):UIComponent {
+			var result:ComboBox = createValueSchemeComboBox();
+			result.dataProvider = enumeration;
+			return result;
+		}
+
+		public static function createValueSchemeComboBox():ComboBox {
+			var result:ComboBox = new ComboBox();
+			result.itemRenderer = new ClassFactory(Label);
+			result.labelFunction = function(item:Object):String {
+			    var valueSchemeItem:ValueSchemeItem = item as ValueSchemeItem;
+			    if (item.appInfo != "") {
+			        return item.item + "-" + item.appInfo;
+			    } else {
+			        return item.item;
+			    }
+			};
+			return result;
+		}
+
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/commentPostPanel.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/commentPostPanel.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/commentPostPanel.mxml	(revision 5961)
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" xmlns:common="clarin.cmdi.componentregistry.common.*" xmlns:services="clarin.cmdi.componentregistry.services.*">
+	
+	<common:ItemDescription id="itemDescription" />
+	
+	<services:CommentPostService id="commentPostService" 
+								 postComplete="postCompleteHandler(event)"
+								 />
+	
+	<mx:Label text="Enter your comment below:" />
+	
+	<mx:Text id="errorMessageField"
+			 text="{commentPostService.message}"
+			 visible='{errorMessageField.text != ""}'
+			 includeInLayout='{errorMessageField.text != ""}'/>
+	
+	<mx:TextArea width="100%" id="comments" minHeight="100" />
+	<mx:Button label="Submit" 
+			   id="submitButton"
+			   click="postComment()"
+			   />
+	<mx:HRule width="100%" />
+	
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.common.Comment;
+			import clarin.cmdi.componentregistry.services.CommentPostService;
+			
+			private function postComment():void{
+				var comment:Comment = new Comment();
+				// Leave username, date empty so web service will fill them out
+				comment.userName = "";
+				comment.commentDate = "";
+
+				comment.comments = comments.text;
+				comment.componentId = itemDescription.id;
+				commentPostService.upload(comment, itemDescription);
+			}
+
+			protected function postCompleteHandler(event:Event):void
+			{
+				comments.text = "";
+			}
+
+		]]>
+	</mx:Script>
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/infoPage.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/infoPage.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/infoPage.mxml	(revision 5961)
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 xmlns:comp="clarin.cmdi.componentregistry.common.components.*"
+		 xmlns:common="clarin.cmdi.componentregistry.common.*"
+		 xmlns:browser="clarin.cmdi.componentregistry.browser.*"
+		 >
+	
+	<mx:XML id="cmdComponent"/>
+	<mx:String id="headerLabel"/>
+
+	<mx:HBox horizontalAlign="center"
+			 verticalAlign="middle"
+			 width="100%">
+		<mx:Label id="header"
+				  text="{headerLabel}"
+				  fontWeight="bold"
+				  fontSize="14"/>
+		<mx:ToggleButtonBar id="toggleBar"
+							dataProvider="{infoViewStack}"/>
+		
+	</mx:HBox>
+
+	<mx:ViewStack id="infoViewStack"
+				  height="100%"
+				  width="100%"
+				  styleName="borderStyles"
+				  change="infoViewStack_changeHandler(event)"
+				  >
+
+		<browser:xmlBrowsePanel id="viewPanel"
+								label="view"
+								cmdComponent="{cmdComponent}"
+								itemDescription="{_itemDescription}"/>
+		
+		<browser:xmlPanel id="xmlPanel"
+						  label="xml"
+						  cmdComponent="{cmdComponent}"/>
+		
+		<browser:CommentsPanel id="commentsPanel"
+							   label="{commentsLabel}"
+							   itemDescription="{_itemDescription}" 
+							   show="commentsPanel.load()"
+							   commentsLoaded="commentsLoadedHandler(event)"
+							   />
+	</mx:ViewStack>
+
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.common.ItemDescription;
+			import clarin.cmdi.componentregistry.services.Config;
+			
+			import mx.events.IndexChangedEvent;
+
+
+			[Bindable]
+			private var _itemDescription:ItemDescription;
+
+
+			public function setPanel(startupPanel:String):void {
+				if(startupPanel == Config.BROWSER_PANEL_VIEW){
+					infoViewStack.selectedChild = viewPanel;
+				} else if(startupPanel == Config.BROWSER_PANEL_XML) {					
+					//infoViewStack.selectedChild = xmlPanel;
+				} else if(startupPanel == Config.BROWSER_PANEL_COMMENTS) {
+					infoViewStack.selectedChild = commentsPanel;
+				}
+			}
+			
+			public function set itemDescription(itemDescription:ItemDescription):void{
+				_itemDescription = itemDescription;
+				commentsPanel.label = commentsLabel;
+				if(infoViewStack.selectedChild == commentsPanel){
+					commentsPanel.load();
+				}
+			}
+			
+			private function get commentsLabel():String{
+				if (_itemDescription == null) {return "info panel has been reloaded";};
+				return "Comments (" + _itemDescription.commentsCount + ")";
+			}
+			
+			private function commentsLoadedHandler(event:Event):void {
+				// After loading, re-create string for comments label because number of comments might have changed (e.g. after a post)
+				commentsPanel.label = commentsLabel;
+			}
+
+			protected function infoViewStack_changeHandler(event:IndexChangedEvent):void
+			{
+				xmlPanel.updateCmdComponentText();
+			}
+
+		]]>
+	</mx:Script>
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/xmlBrowsePanel.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/xmlBrowsePanel.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/xmlBrowsePanel.mxml	(revision 5961)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
+		   xmlns:common="clarin.cmdi.componentregistry.common.*"
+		   xmlns:browser="clarin.cmdi.componentregistry.browser.*">
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.editor.model.CMDModelFactory;
+		]]>
+	</mx:Script>
+
+	<mx:XML id="cmdComponent"/>
+	<common:ItemDescription id="itemDescription"/>
+
+	<browser:CMDComponentXMLBrowser id="xmlBrowse"
+									cmdSpec="{CMDModelFactory.createModel(cmdComponent, itemDescription)}"
+									width="100%"
+									height="100%"
+									paddingLeft="5"
+									paddingTop="5"
+									/>
+</mx:Canvas>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/xmlPanel.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/xmlPanel.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/browser/xmlPanel.mxml	(revision 5961)
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 xmlns:comp="clarin.cmdi.componentregistry.common.components.*">
+
+	<comp:ScrollableTextArea id="infoTextArea"
+							 styleName="xmlTextArea"
+							 editable="false"
+							 width="100%"
+							 height="100%"
+							 paddingLeft="5"
+							 paddingTop="5"
+							 />
+	
+	<mx:Script>
+		<!-- 
+			The code below ensures lazy loading of the component XML into the scrollable text area. 
+			Large component specifications can cause the application to hang or even crash the browser, 
+			see <https://trac.clarin.eu/ticket/268>
+		-->
+		<![CDATA[
+			import mx.containers.ViewStack;
+			import mx.core.Application;
+			private var componentXML:XML;
+			private var MAX_XML_LENGTH:int = 10000;
+			
+			public function set cmdComponent(xml:XML):void {
+				if(this.componentXML != xml){
+					this.componentXML = xml;
+					updateCmdComponentText();
+				}
+			}
+			
+			public function updateCmdComponentText():void {
+				// Only forward the XML to the text area if the XML panel is the selected view 
+				if(isSelectedView()){
+					var xmlText:String = componentXML.toXMLString();
+					if(xmlText.length > MAX_XML_LENGTH + 3){
+						// XML too lengthy, truncate (otherwise we run into performance issues)
+						infoTextArea.text = xmlText.substr(0, MAX_XML_LENGTH) + "...\n\nSpecification too large to display. Download XML to see the entire specification.";
+					} else{
+						infoTextArea.text = xmlText;
+					}
+				}
+			}
+			
+			private function isSelectedView():Boolean
+			{
+				var obj:DisplayObject = this;
+				// Whole chain until application root should be visible
+				while (obj && obj !== Application.application)
+				{
+					// Special case: viewstack - this item should be the selected item
+					if(obj.parent is ViewStack){
+						return ViewStack(obj.parent).selectedChild == obj;
+					}
+					
+					obj = obj.parent;
+				}
+				return true;
+			}
+		]]>
+	</mx:Script>
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/AboutPopup.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/AboutPopup.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/AboutPopup.mxml	(revision 5961)
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
+				title="About the Clarin Component Registry"
+				showCloseButton="true"
+				close="cleanUp();"
+				backgroundColor="#DDE3EF"
+				initialize="init();"
+				preinitialize="preinit();"
+				>
+	
+	<mx:Script>
+		<![CDATA[
+			import mx.managers.PopUpManager;
+			
+			private var version:String;
+			
+			private function preinit():void{
+				var APPINFO:Namespace = new Namespace("APPINFO");
+				if(APPINFO != null){
+					try{
+						version = APPINFO::version + " (r" + APPINFO::revision + ")";
+					} catch(err:ReferenceError){
+						// Version set at compilation
+						version = "?";
+					}
+				}
+			}
+			
+			private function init():void{
+				aboutText.htmlText 
+					= "The Clarin Component Registry provides long term storage and\n"
+					+ "easy browsing, creation and editing of components and profiles.\n"
+					+ "\n"
+					+"Version: " + version + "\n"
+					+"Written by: Patrick Duin, Twan Goosen, Olha Shkaravska and George Georgovassilis\n"
+					+"\n"
+					+"Go to <u><a target=\"_blank\" href=\"http://www.clarin.eu/cmdi\">www.clarin.eu/cmdi</a></u> for more information.\n"
+					+"Email <u><a href=\"mailto:cmdi@clarin.eu\">cmdi@clarin.eu</a></u> for questions/support.\n";
+			}
+			
+			private function cleanUp():void {
+				PopUpManager.removePopUp(this);
+			}
+			
+		]]>
+	</mx:Script>
+	
+	<mx:Text id="aboutText">
+	</mx:Text>
+</mx:TitleWindow>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/CMDSpecRenderer.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/CMDSpecRenderer.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/CMDSpecRenderer.as	(revision 5961)
@@ -0,0 +1,12 @@
+package clarin.cmdi.componentregistry.common
+{
+    import clarin.cmdi.componentregistry.editor.model.CMDSpec;
+    
+    public interface CMDSpecRenderer
+    {
+        
+        function set cmdSpec(cmdSpec:CMDSpec):void;
+        function get cmdSpec():CMDSpec;
+        
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ChangeTrackingCMDElement.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ChangeTrackingCMDElement.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ChangeTrackingCMDElement.as	(revision 5961)
@@ -0,0 +1,7 @@
+package clarin.cmdi.componentregistry.common
+{
+	public interface ChangeTrackingCMDElement
+	{
+		function set changeTracking(value:Boolean):void;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Comment.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Comment.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Comment.as	(revision 5961)
@@ -0,0 +1,53 @@
+package clarin.cmdi.componentregistry.common
+{
+	import clarin.cmdi.componentregistry.services.Config;
+
+	public class Comment implements XmlAble
+	{
+		[Bindable]
+		public var comments:String;
+		
+		[Bindable]
+		public var userName:String;
+		
+		[Bindable]
+		public var commentDate:String;
+		
+		public var componentId:String;
+		public var id:String;
+		public var canDelete:Boolean;
+		public var itemDescription:ItemDescription;
+		public var dataUrl:String;
+		
+		public function Comment():void{
+			
+		}
+		
+		public function create(comment:XML, itemDescription:ItemDescription):void{
+			this.comments = comment.comments;
+			this.commentDate  = DateUtils.formatDateString(comment.commentDate);
+			this.componentId = comment.componentDescriptionId;
+			this.id = comment.id;
+			this.userName = comment.userName;
+			this.canDelete = comment.canDelete == "true";
+			
+			this.itemDescription = itemDescription;
+			if(itemDescription.isProfile){
+				dataUrl = Config.instance.getProfileCommentsPath(itemDescription.id) + id;
+			} else {
+				dataUrl = Config.instance.getComponentCommentsPath(itemDescription.id) + id;
+			}
+		}
+		
+		public function toXml():XML {
+			var result:XML = <comment></comment>;
+			result.appendChild(<comments>{comments}</comments>);
+			result.appendChild(<commentDate>{commentDate}</commentDate>);
+			if(componentId){
+				result.appendChild(<componentId>{componentId}</componentId>);
+			}
+			result.appendChild(<userName>{userName}</userName>);
+			return result;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Component.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Component.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Component.as	(revision 5961)
@@ -0,0 +1,12 @@
+package clarin.cmdi.componentregistry.common {
+
+	[Bindable]
+	public class Component {
+		public var description:ItemDescription;
+		public var componentMD:ComponentMD;
+
+		public function Component() {
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ComponentMD.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ComponentMD.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ComponentMD.as	(revision 5961)
@@ -0,0 +1,44 @@
+package clarin.cmdi.componentregistry.common {
+	import mx.collections.ArrayCollection;
+
+	[Bindable]
+	public class ComponentMD {
+	    
+	    /** 
+	    * Claring Metadata xml constants
+	    */
+	    //Element Names
+	    public static const CONCEPTLINK:String = "ConceptLink";
+	    public static const COMPONENTID:String = "ComponentId";
+	    public static const CMD_COMPONENT:String = "CMD_Component";
+	    public static const CMD_ELEMENT:String = "CMD_Element";
+	    public static const HEADER:String = "Header";
+	    public static const ENUMERATION:String = "enumeration";
+	    public static const PATTERN:String = "pattern";
+	    public static const TYPE:String = "Type";
+	    public static const VALUE_SCHEME:String = "ValueScheme";
+	    public static const ATTRIBUTE:String = "Attribute";
+	    public static const ATTRIBUTE_LIST:String = "AttributeList";
+	    public static const DESCRIPTION:String = "Description";
+        //Attribute Names
+        public static const APP_INFO:String = "AppInfo";
+        public static const NAME:String = "name";
+
+		public var name:String;
+
+
+		private var _xml:XML;
+
+		public function ComponentMD() {
+		}
+
+		public function set xml(xml:XML):void {
+			_xml = xml;
+		}
+
+		public function get xml():XML {
+			return _xml;
+		}
+	}
+   
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Credentials.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Credentials.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Credentials.as	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry.common {
+
+	public class Credentials {
+		private static var _instance:Credentials = new Credentials();
+
+		[Bindable]
+		public var userName:String = "";
+
+		public function Credentials() {
+			if (_instance != null) {
+				throw new Error("Config can only be accessed through Credentials.instance");
+			}
+		}
+		
+        public function isLoggedIn():Boolean {
+            return userName && userName != "" && userName != "anonymous";
+        }
+
+		private function init(applicationParameters:Object):void {
+			if (applicationParameters.hasOwnProperty("userName")) {
+				userName = applicationParameters.userName;
+			}
+		}
+
+		public static function create(applicationParameters:Object):void {
+			_instance.init(applicationParameters);
+		}
+
+
+		public static function get instance():Credentials {
+			return _instance;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/DateUtils.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/DateUtils.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/DateUtils.as	(revision 5961)
@@ -0,0 +1,48 @@
+package clarin.cmdi.componentregistry.common
+{
+	import mx.formatters.DateFormatter;
+
+	public class DateUtils
+	{
+		public static function convertDate(dateString:String):Date {
+			var validator:DateFormatter = new DateFormatter();
+			var s:String = parseDate(dateString);
+			var n:Number = Date.parse(s);
+			var registrationDateValue:Date = new Date(n);
+			var result:String;
+			if (isNaN(n)) {
+				trace("cannot convert date: " + dateString);
+				return null;
+			} 
+			return registrationDateValue;
+		}
+		
+		public static function formatDateString(dateString:String):String {
+			var s:String = parseDate(dateString);
+			var n:Number = Date.parse(s);
+			var registrationDateValue:Date = new Date(n);
+			var result:String;
+			if (isNaN(n)) {
+				trace("cannot convert date: " + dateString);
+				result = dateString;
+			} else {
+				result = convertDateToString(registrationDateValue);
+			}
+			return result;
+		}
+		
+		public static function convertDateToString(date:Date):String{
+			var validator:DateFormatter = new DateFormatter();
+			validator.formatString = "DD MMMM YYYY H:NN:SS"; //e.g. 02 December 2009 13:48:39 
+			return validator.format(date);
+		}
+		
+		public static function parseDate(value:String):String {
+			var dateStr:String = value;
+			dateStr = dateStr.replace(/-/g, "/");
+			dateStr = dateStr.replace("T", " ");
+			dateStr = dateStr.replace("+00:00", " GMT-0000");
+			return dateStr;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Group.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Group.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Group.as	(revision 5961)
@@ -0,0 +1,31 @@
+package clarin.cmdi.componentregistry.common
+{
+	import clarin.cmdi.componentregistry.services.Config;
+
+/**
+ * Models a group. Doesn't implement xmlable because groups are not sent back to the server
+ * @author george.georgovassilis@mpi.nl
+ */	
+	public class Group
+	{
+		[Bindable]
+		public var id:String;
+		
+		[Bindable]
+		public var name:String;
+		
+		[Bindable]
+		public var ownerId:uint;
+		
+		public function Group():void{
+			
+		}
+		
+		public function create(xml:XML):void{
+			this.id = xml.id;
+			this.name = xml.name;
+			this.ownerId = xml.ownerId;
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ItemDescription.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ItemDescription.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ItemDescription.as	(revision 5961)
@@ -0,0 +1,56 @@
+package clarin.cmdi.componentregistry.common {
+	import clarin.cmdi.componentregistry.services.Config;
+
+	[Bindable]
+	public class ItemDescription {
+
+		public var id:String;
+		public var name:String;
+		public var description:String;
+		public var creatorName:String;
+		public var groupName:String;
+		public var domainName:String = "";
+		public var dataUrl:String;
+		public var isProfile:Boolean;
+		public var registrationDate:String;
+		public var registrationDateValue:Date;
+		public var isPrivate:Boolean;
+		public var commentsCount:int;
+
+		public function ItemDescription() {
+
+		}
+
+		private function create(itemDescription:XML, infoUrl:String, isProfileValue:Boolean, isPrivate:Boolean):void {
+			this.id = itemDescription.id;
+			this.name = itemDescription.name;			
+			this.description = itemDescription.description;
+			this.creatorName = itemDescription.creatorName;
+			this.groupName = itemDescription.groupName;
+			this.domainName = itemDescription.domainName;
+			this.dataUrl = infoUrl + itemDescription.id;
+			this.commentsCount = itemDescription.commentsCount;
+			this.isProfile = isProfileValue;
+			this.isPrivate = isPrivate;
+			
+			// getting ISO-8601 (GMT/UTC timezone) dates from the server. Need to convert this, flex does not support ISO-8601 times out of the box.
+			this.registrationDateValue = DateUtils.convertDate(itemDescription.registrationDate);
+			if(registrationDateValue){
+				this.registrationDate = DateUtils.convertDateToString(registrationDateValue);
+			}
+		}
+
+		public function createProfile(itemDescription:XML, isPrivate:Boolean):void {
+			create(itemDescription, Config.instance.profileInfoUrl, true, isPrivate);
+		}
+
+		public function createComponent(itemDescription:XML, isPrivate:Boolean):void {
+			create(itemDescription, Config.instance.componentInfoUrl, false, isPrivate);
+		}
+		
+		public function toString():String{
+			return (isProfile?"profile":"component")+" id:"+id+" name:"+name+" url:"+dataUrl;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/LabelConstants.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/LabelConstants.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/LabelConstants.as	(revision 5961)
@@ -0,0 +1,64 @@
+package clarin.cmdi.componentregistry.common {
+    import mx.collections.ArrayCollection;
+    
+
+	public class LabelConstants {
+
+		//Label names
+		public static const NAME:String = "Name:";
+		public static const CONCEPTLINK:String = "ConceptLink:";
+		public static const COMPONENT:String = "Component:";
+		public static const COMPONENT_ID:String = "ComponentId:";
+		public static const DESCRIPTION:String = "Description:";
+		public static const CARDINALITY_MIN:String = "Min Occurrences:";
+		public static const CARDINALITY_MAX:String = "Max Occurrences:";
+		public static const CARDINALITY:String = "Number of occurrences:"
+		public static const DOCUMENTATION:String = "Documentation:";
+		public static const DISPLAY_PRIORITY:String = "DisplayPriority:";
+		public static const ATTRIBUTELIST:String = "AttributeList:"
+		public static const ELEMENT:String = "Element:";
+		public static const VALUESCHEME:String = "Type:";
+		public static const GROUP_NAME:String = "Group Name:";
+		public static const DOMAIN_NAME:String = "Domain Name:";
+        public static const DOMAIN_NAME_PROMPT:String = "Select a domain...";
+        public static const MULTILINGUAL:String = "Multilingual:";
+
+		//tooltip
+		public static const DISPLAY_PRIORITY_TOOLTIP:String = "Display preference for external tools, 1 means highest priority. Element with name='Name' or name='Title' is usually a good candidate to set to highest priority. Put the value to on 0 and the attribute will not be added to the element."        
+
+		//Data
+		public static const DOMAIN_NAME_DATA:ArrayCollection = new ArrayCollection([
+		{label: "Anthropological Linguistics", data: "anthropological_linguistics"},
+		{label: "Applied Linguistics", data: "applied_linguistics"},
+		{label: "Cognitive Science", data: "cognitive_science"},
+		{label: "Computational Linguistics", data: "computational_linguistics"},
+		{label: "Discourse Analysis", data: "discourse_analysis"},
+		{label: "Forensic Linguistics", data: "forensic_linguistics"},
+		{label: "General Linguistics", data: "general_linguistics"},
+		{label: "Historical Linguistics", data: "historical_linguistics"},
+		{label: "History of Linguistics", data: "history_of_linguistics"},
+		{label: "Language Acquisition", data: "language_acquisition"},
+		{label: "Language Documentation", data: "language_documentation"},
+		{label: "Lexicography", data: "lexicography"},
+		{label: "Linguistics and Literature", data: "linguistics_and_literature"},
+		{label: "Linguistic Theories", data: "linguistic_theories"},
+		{label: "Mathematical Linguistics", data: "mathematical_linguistics"},
+		{label: "Morphology", data: "morphology"},
+		{label: "Neurolinguistics", data: "neurolinguistics"},
+		{label: "Philosophy of Language", data: "philosophy_of_language"},
+		{label: "Phonetics", data: "phonetics"},
+		{label: "Phonology", data: "phonology"},
+		{label: "Pragmatics", data: "pragmatics"},
+		{label: "Psycholinguistics", data: "psycholinguistics"},
+		{label: "Semantics", data: "semantics"},
+		{label: "Sociolinguistics", data: "sociolinguistics"},
+		{label: "Syntax", data: "syntax"},
+		{label: "Text and Corpus Linguistics", data: "text_and_corpus_linguistics"},
+		{label: "Translating and Interpreting", data: "translating_and_interpreting"},
+		{label: "Typology", data: "typology"},
+		{label: "Writing Systems", data: "writing_systems"},
+		{label: "Other", data: "Other"},
+		{label: "Unknown", data: "Unknown"}]); //TODO PD, Dieter knows what to fill in here!
+			
+ }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Login.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Login.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Login.mxml	(revision 5961)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"
+		  xmlns:common="clarin.cmdi.componentregistry.common.components.*"
+		  title="Login"
+		  horizontalScrollPolicy="off"
+		  verticalScrollPolicy="off">
+
+	<mx:Metadata>
+		[Event(name="failed",type="flash.events.Event")]
+	</mx:Metadata>
+
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.services.Config;
+			import mx.managers.PopUpManager;
+
+			public static const FAILED:String = "failed";
+			[Bindable]
+			private var _viewType:String;
+			[Bindable]
+			private var _spaceType:String;
+			[Bindable]
+			private var _itemId:String;
+
+			private function handleCancel(event:MouseEvent):void {
+				PopUpManager.removePopUp(this);
+				dispatchEvent(new Event(FAILED));
+			}
+
+			/**
+			 * viewType or spaceType can be null they will then be ignored.
+			 *
+			 * */
+			public function show(parent:DisplayObject, viewType:String, spaceType:String, itemId:String):void {
+				_viewType = viewType;
+				_spaceType = spaceType;
+			    _itemId = itemId;
+				PopUpManager.addPopUp(this, parent, true);
+				PopUpManager.centerPopUp(this);
+			}
+		]]>
+	</mx:Script>
+
+	<mx:VBox horizontalAlign="center">
+		<mx:Label text="You need to be logged in to do that, click the link to login."/>
+		<common:LoginLabelButton id="login"
+								 scaleX="1.5"
+								 scaleY="1.5"
+								 viewType="{_viewType}"
+								 spaceType="{_spaceType}"
+								 itemId="{_itemId}"/>
+		<mx:Button id="cancelBtn"
+				   label="Cancel"
+				   click="{handleCancel(event);}"/>
+	</mx:VBox>
+
+</mx:Panel>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Profile.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Profile.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/Profile.as	(revision 5961)
@@ -0,0 +1,16 @@
+package clarin.cmdi.componentregistry.common {
+	import mx.collections.ArrayCollection;
+
+    [Bindable]
+	public class Profile {
+	    
+		public var description:ItemDescription;
+		public var components:ArrayCollection;//ComponentMD
+		public var nrOfComponents:int;
+		public var profileSource:XML;
+
+		public function Profile() {
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/RssLinkPopUp.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/RssLinkPopUp.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/RssLinkPopUp.mxml	(revision 5961)
@@ -0,0 +1,21 @@
+<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
+				xmlns:common="clarin.cmdi.componentregistry.common.components.*"
+				showCloseButton="true"
+				close="cleanUp();"
+				backgroundColor="#DDE3EF">
+	
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.services.Config;
+			import mx.managers.PopUpManager;
+			
+			public var uri:String;
+			
+			private function cleanUp():void {
+				PopUpManager.removePopUp(this);
+			}
+			
+		]]>
+	</mx:Script>
+		<common:LinkRenderer id="link" text="{uri}"/>
+</mx:TitleWindow>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ShowInfoPopUp.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ShowInfoPopUp.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/ShowInfoPopUp.mxml	(revision 5961)
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
+				xmlns:common="clarin.cmdi.componentregistry.common.components.*"
+				showCloseButton="true"
+				close="cleanUp();"
+				backgroundColor="#DDE3EF"
+				show="checkItem();">
+
+	<mx:Script>
+		<![CDATA[
+		    import clarin.cmdi.componentregistry.services.Config;
+			import mx.managers.PopUpManager;
+			
+			[Bindable]
+			private var item:ItemDescription;
+			[Bindable]
+			private var statusText:String;
+			
+			private function cleanUp():void {
+				PopUpManager.removePopUp(this);
+			}
+			
+			private function checkItem():void {
+			    if (item == null) {
+			        title = "select item first";
+			    } 
+			}
+			
+			public function setItem(item:ItemDescription):void {
+			    this.item = item;
+			    title = "Info for: "+item.name;
+			}
+			
+			private function copyXsdLink():void {
+			    System.setClipboard(xsdLink.text);
+			    status = "copied link";
+			}
+			
+			private function copyBookmarkLink():void {
+			    System.setClipboard(bookmarkLink.text);
+			    status = "copied bookmark";
+			}
+			
+			private function getBookmarkText():String {
+			    if (item.isPrivate) {
+			        return "Bookmark link (requires login):";
+			    } else {
+			        return "Bookmark link:";
+			    }
+		
+			}
+
+		]]>
+	</mx:Script>
+
+	<mx:VBox width="100%">
+		<mx:HBox width="100%">
+			<mx:Label text="{getBookmarkText()}" styleName="{StyleConstants.SHOW_INFO_PAGE_LABEL}"/>
+			<common:LinkRenderer id="bookmarkLink" text="{Config.getBookmarkUrl(item)}"/>
+			<mx:Spacer width="100%"/>
+			<mx:Button label="copy to clipboard" toolTip="Click here to copy the url to your clipboard" click="copyBookmarkLink();" />
+		</mx:HBox>
+		<mx:HBox width="100%" visible="{item.isProfile}" includeInLayout="{item.isProfile}">
+			<mx:Label text="Link to xsd: " styleName="{StyleConstants.SHOW_INFO_PAGE_LABEL}"/>
+			<common:LinkRenderer id="xsdLink" text="{Config.getXsdLink(item)}"/>
+			<mx:Spacer width="100%"/>
+			<mx:Button label="copy to clipboard" toolTip="Click here to copy the url to your clipboard" click="copyXsdLink();"/>
+		</mx:HBox>
+	</mx:VBox>
+</mx:TitleWindow>
+
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/StyleConstants.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/StyleConstants.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/StyleConstants.as	(revision 5961)
@@ -0,0 +1,25 @@
+package clarin.cmdi.componentregistry.common {
+
+	public class StyleConstants {
+		//CSS style constant names
+		public static const XMLBROWSER:String = "xmlBrowser";
+		public static const XMLBROWSER_FIELD:String = "xmlBrowserField";
+		public static const XMLBROWSER_FIELD_VALUE:String = "xmlBrowserValueLabel";
+		public static const XMLBROWSER_HEADER:String = "xmlBrowserHeader";
+		public static const XMLEDITOR_EDIT_FIELD:String = "xmlEditorFieldEditField";
+		public static const EXPANDING_COMPONENT:String = "borderStyles";
+		public static const SHOW_INFO_PAGE_LABEL:String = "showInfoPageLabel";
+		
+
+		//		
+		public static const USER_BORDER_COLOR:String = "#F07048";
+		public static const GROUP_BORDER_COLOR:String = "yellow";
+
+		[Embed(source='/assets/images/layer-lower-3.png')]
+		public static const downIcon:Class;
+		[Embed(source='/assets/images/layer-raise-3.png')]
+		public static const upIcon:Class;
+		[Embed(source='/assets/images/rss_icon_glass_gray16.png')]
+		public static const rssIcon:Class;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/XmlAble.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/XmlAble.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/XmlAble.as	(revision 5961)
@@ -0,0 +1,7 @@
+package clarin.cmdi.componentregistry.common
+{
+    public interface XmlAble
+    {
+        function toXml():XML;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddAttributeLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddAttributeLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddAttributeLabelButton.as	(revision 5961)
@@ -0,0 +1,23 @@
+package clarin.cmdi.componentregistry.common.components {
+	import flash.events.MouseEvent;
+
+	import mx.controls.Label;
+
+	public class AddAttributeLabelButton extends Label {
+		public function AddAttributeLabelButton() {
+			super();
+			text = "+attribute";
+			toolTip = "click to add Attribute";
+			setStyle("color", "green");
+			addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "underline");
+				});
+			addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "none");
+				});
+
+
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddComponentLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddComponentLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddComponentLabelButton.as	(revision 5961)
@@ -0,0 +1,22 @@
+package clarin.cmdi.componentregistry.common.components {
+	import flash.events.MouseEvent;
+
+	import mx.controls.Label;
+
+	public class AddComponentLabelButton extends Label {
+		public function AddComponentLabelButton() {
+			super();
+			text = "+component";
+			toolTip = "click to add Component";
+			setStyle("color", "green");
+			addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "underline");
+				});
+			addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "none");
+				});
+
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddElementLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddElementLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/AddElementLabelButton.as	(revision 5961)
@@ -0,0 +1,23 @@
+package clarin.cmdi.componentregistry.common.components {
+	import flash.events.MouseEvent;
+	
+	import mx.controls.Label;
+
+	public class AddElementLabelButton extends Label {
+	    
+		public function AddElementLabelButton() {
+			super();
+			text = "+element";
+			toolTip = "click to add Element";
+			setStyle("color", "green");
+			addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "underline");
+				});
+			addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "none");
+				});
+
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/BasicLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/BasicLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/BasicLabelButton.as	(revision 5961)
@@ -0,0 +1,24 @@
+package clarin.cmdi.componentregistry.common.components {
+	import flash.events.MouseEvent;
+
+	import mx.controls.Label;
+
+	public class BasicLabelButton extends Label {
+		public function BasicLabelButton(textString:String = null, tooltipString:String = null, color:String = null) {
+			if (textString)
+				text = textString;
+			if (tooltipString)
+				toolTip = tooltipString;
+			if (color)
+				setStyle("color", color);
+			addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "underline");
+				});
+			addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+					event.currentTarget.setStyle("textDecoration", "none");
+				});
+
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/BrowseContextMenu.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/BrowseContextMenu.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/BrowseContextMenu.as	(revision 5961)
@@ -0,0 +1,163 @@
+package clarin.cmdi.componentregistry.common.components {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.ShowInfoPopUp;
+	import clarin.cmdi.componentregistry.services.Config;
+	import clarin.cmdi.componentregistry.services.DeleteService;
+	import clarin.cmdi.componentregistry.services.SaveItemDialog;
+	
+	import flash.events.ContextMenuEvent;
+	import flash.geom.Point;
+	import flash.ui.ContextMenu;
+	import flash.ui.ContextMenuItem;
+	
+	import mx.controls.Alert;
+	import mx.controls.DataGrid;
+	import mx.controls.Text;
+	import mx.events.CloseEvent;
+	import mx.managers.PopUpManager;
+
+
+	public class BrowseContextMenu {
+
+		[Bindable]
+		public var cm:ContextMenu;
+
+		[Bindable]
+		public var viewStack:RegistryViewStack;
+		[Bindable]
+		public var deleteService:DeleteService;
+
+		[Bindable]
+		private var _dataGrid:DataGrid;
+		
+		
+		private var saveItemDialog:SaveItemDialog = new SaveItemDialog();
+		private var isComponent:Boolean = false;
+		
+		private var editMenuItem:ContextMenuItem;
+		private var editAsNewMenuItem:ContextMenuItem;
+
+		public function BrowseContextMenu(isComponent:Boolean = false) {
+			this.isComponent = isComponent
+			cm = new ContextMenu();
+			cm.hideBuiltInItems();
+			cm.customItems = createMenuItems();
+			setItemStates();
+			
+			Config.instance.addEventListener(Config.REGISTRY_SPACE_TOGGLE_EVENT, setItemStates);
+		}
+
+		private function createMenuItems():Array {
+			var result:Array = new Array();
+			var cmi:ContextMenuItem = new ContextMenuItem("Show info");
+			cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, showInfo);
+			result.push(cmi);
+			cmi = new ContextMenuItem("Download as XML...");
+			cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, saveAsXml);
+			result.push(cmi);
+			if (!isComponent) {
+				cmi = new ContextMenuItem("Download as XSD...");
+				cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, saveAsXsd);
+				result.push(cmi);
+			}
+			editMenuItem = new ContextMenuItem("Edit Item...");
+			editMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, editItem);
+			result.push(editMenuItem);
+			
+			editAsNewMenuItem = new ContextMenuItem("Edit Item as New...");
+			editAsNewMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, editItem);
+			result.push(editAsNewMenuItem);
+			
+			cmi = new ContextMenuItem("Delete Item...", true);
+			cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, handleDelete);
+			result.push(cmi);
+
+			return result;
+		}
+		
+		private function setItemStates(event:Event = null):void {
+			editMenuItem.visible = (Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP);
+			editAsNewMenuItem.visible = (Config.instance.registrySpace.space == Config.SPACE_PUBLISHED);
+		}
+
+		public function set dataGrid(dataGrid:DataGrid):void {
+			_dataGrid = dataGrid;
+		}
+
+		private function showInfo(event:ContextMenuEvent):void {
+			var item:ItemDescription = _dataGrid.selectedItem as ItemDescription;
+			if (!item) {
+				showSelectAlert();
+				return;
+			}
+			var showInfoPanel:ShowInfoPopUp = new ShowInfoPopUp();
+			showInfoPanel.setItem(item);
+			var point:Point = new Point();
+			point.x = event.mouseTarget.mouseX;
+			point.y = event.mouseTarget.mouseY;
+			point = event.mouseTarget.localToGlobal(point);
+			showInfoPanel.x = point.x;
+			showInfoPanel.y = point.y;
+			PopUpManager.addPopUp(showInfoPanel, event.mouseTarget);
+		}
+
+		private function saveAsXml(event:ContextMenuEvent):void {
+			var item:ItemDescription = _dataGrid.selectedItem as ItemDescription;
+			if (!item) {
+				showSelectAlert();
+				return;
+			}
+			saveItemDialog.saveAsXML(item);
+		}
+
+		private function saveAsXsd(event:ContextMenuEvent):void {
+			var item:ItemDescription = _dataGrid.selectedItem as ItemDescription;
+			if (!item) {
+				showSelectAlert();
+				return;
+			}
+			saveItemDialog.saveAsXSD(item);
+		}
+
+		private function editItem(event:ContextMenuEvent):void {
+			var item:ItemDescription = _dataGrid.selectedItem as ItemDescription;
+			if (!item) {
+			    showSelectAlert();
+			    return;
+			}
+			viewStack.switchToEditor(item);
+		}
+
+		private function showSelectAlert():void {
+			Alert.show("First select a profile or component");
+		}
+
+		private function handleDelete(event:ContextMenuEvent):void {
+   			if (!_dataGrid.selectedItem) {
+			    showSelectAlert();
+			    return;
+			}
+			deleteSelectedItems();
+		}
+
+		public function deleteSelectedItems():void {
+			var message:String = "";
+			for each (var item:ItemDescription in _dataGrid.selectedItems) {
+				if (message != "") {
+					message += "\n";
+				}
+				message += item.name;
+			}
+			Alert.show("You will delete the following item(s):\n" + message + "\n\n This cannot be undone.", "Delete items", Alert.OK | Alert.CANCEL, null, handleDeleteAlert);
+		}
+
+		private function handleDeleteAlert(event:CloseEvent):void {
+			if (event.detail == Alert.OK) {
+				for each (var item:ItemDescription in _dataGrid.selectedItems) {
+					deleteService.deleteItem(item);
+				}
+			}
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/DownIconButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/DownIconButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/DownIconButton.as	(revision 5961)
@@ -0,0 +1,16 @@
+package clarin.cmdi.componentregistry.common.components {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+
+	import mx.controls.Button;
+
+	public class DownIconButton extends Button {
+		public function DownIconButton() {
+			super();
+			setStyle("icon", StyleConstants.downIcon);
+			setStyle("paddingTop", 18);
+			width = 5;
+			height = 0;
+			toolTip = "move down";
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/ExpandingComponentLabel.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/ExpandingComponentLabel.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/ExpandingComponentLabel.as	(revision 5961)
@@ -0,0 +1,153 @@
+package clarin.cmdi.componentregistry.common.components {
+	import clarin.cmdi.componentregistry.browser.CMDComponentXMLBrowser;
+	import clarin.cmdi.componentregistry.common.CMDSpecRenderer;
+	import clarin.cmdi.componentregistry.common.Component;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.editor.CMDComponentXMLEditor;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDModelFactory;
+	import clarin.cmdi.componentregistry.services.ComponentInfoService;
+	import clarin.cmdi.componentregistry.services.ComponentListService;
+	import clarin.cmdi.componentregistry.services.Config;
+	
+	import flash.display.DisplayObject;
+	import flash.events.MouseEvent;
+	
+	import mx.containers.VBox;
+	import mx.controls.Alert;
+	import mx.controls.Label;
+	import mx.managers.CursorManager;
+
+	public class ExpandingComponentLabel extends VBox {
+
+		[Bindable]
+		public var isExpanded:Boolean = false;
+		private var expandBusy:Boolean = false;
+
+		private var expanded:DisplayObject;
+		private var componentId:String;
+		private var item:ItemDescription;
+		private var componentSrv:ComponentInfoService = new ComponentInfoService();
+
+		private var editable:Boolean;
+		
+		protected function setItem(item:ItemDescription):void{
+			this.item = item;
+		}
+
+		public function ExpandingComponentLabel(componentId:String, editable:Boolean = false) {
+			super();
+			this.editable = editable;
+			this.componentId = componentId;			
+			styleName = StyleConstants.EXPANDING_COMPONENT;		
+
+			this.item = Config.instance.getCurrentComponentsSrv().findDescription(componentId);
+			// item not from current space? try public...
+			if (this.item==null) {
+				this.item = Config.instance.getPublicComponentsSrv().findDescription(componentId);
+			}
+			if (this.item==null) {
+				// retrieve the item by ID
+				componentSrv.addEventListener(ComponentInfoService.COMPONENT_LOADED, setRetrievedItem);
+				componentSrv.loadFromUrl(Config.instance.componentInfoUrl + componentId);
+			} else {
+				//item already available
+				processItem();
+			}
+		}
+		
+		private function setRetrievedItem(event:Event):void {
+			this.item = componentSrv.component.description;
+			processItem();
+		}
+		
+		private function processItem():void {
+			if (item && item.isPrivate) {
+				this.setStyle("borderColor", StyleConstants.USER_BORDER_COLOR);
+			}
+			if (item!=null)
+				updateView();
+		}
+		
+		private function updateView():void{
+			var id:Label = new Label();
+			if (item) {
+				id.text = item.name;
+				id.styleName = StyleConstants.XMLBROWSER_HEADER;
+				id.addEventListener(MouseEvent.CLICK, handleClick);
+				id.addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
+				id.addEventListener(MouseEvent.MOUSE_OUT, mouseOut);
+			} else {
+				id.text = "Component cannot be found (might not exist anymore).";
+			}
+			addChild(id);
+		}
+
+		private function handleClick(event:MouseEvent):void {
+			if (!expandBusy) {
+				expandStart();
+				try {
+					if (isExpanded) {
+						isExpanded = false;
+						unexpand();
+					} else {
+						isExpanded = true;
+						expand();
+					}
+				} catch (err:Error) {
+					trace(err);
+					CursorManager.removeBusyCursor();
+				}
+			}
+		}
+
+		private function expandStart():void {
+			expandBusy = true;
+			CursorManager.setBusyCursor();
+		}
+
+		private function expandFinished():void {
+			expandBusy = false;
+			CursorManager.removeBusyCursor();
+		}
+
+
+		private function unexpand():void {
+			if (expanded != null) {
+				removeChild(expanded);
+				expanded = null;
+			}
+			expandFinished();
+		}
+
+		private function expand():void {
+			componentSrv.addEventListener(ComponentInfoService.COMPONENT_LOADED, handleComponentLoaded);
+			componentSrv.load(item);
+		}
+
+		private function handleComponentLoaded(event:Event):void {
+			var comp:Component = componentSrv.component;
+			if (editable) {
+				expanded = new CMDComponentXMLEditor();
+			} else {
+				expanded = new CMDComponentXMLBrowser();
+			}
+			(expanded as CMDSpecRenderer).cmdSpec = CMDModelFactory.createModel(comp.componentMD.xml, comp.description);
+			addChild(expanded);
+			expandFinished();
+		}
+
+
+		private function mouseOver(event:MouseEvent):void {
+			event.currentTarget.setStyle("color", "0x0000FF");
+			event.currentTarget.setStyle("textDecoration", "underline");
+		}
+
+		private function mouseOut(event:MouseEvent):void {
+			event.currentTarget.setStyle("color", "0x000000");
+			event.currentTarget.setStyle("textDecoration", "none");
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/FilteringDataGrid.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/FilteringDataGrid.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/FilteringDataGrid.as	(revision 5961)
@@ -0,0 +1,74 @@
+package clarin.cmdi.componentregistry.common.components {
+	import com.rictus.controls.SearchBox;
+	
+	import flash.events.Event;
+	
+	import mx.collections.ICollectionView;
+	import mx.controls.DataGrid;
+	import mx.controls.dataGridClasses.DataGridColumn;
+	import mx.core.ClassFactory;
+	import mx.core.IFactory;
+
+	public class FilteringDataGrid extends DataGrid {
+
+		private var _searchText:String = "";
+		private var _searchInput:SearchBox;
+		[Bindable]
+		public var unfilteredLength:int = 0;
+
+        private var highlightSelectionRenderer:IFactory = new ClassFactory(HighlightSelectionItemRenderer);
+
+		public function FilteringDataGrid() {
+			super();
+		}
+		
+		override public function set columns(columns:Array):void {
+		    for each (var column:DataGridColumn in columns) {
+		        column.itemRenderer = highlightSelectionRenderer;
+		    }
+		    super.columns = columns;
+		}
+
+		override public function set dataProvider(dataProvider:Object):void {
+			var data:ICollectionView = dataProvider as ICollectionView;
+			data.filterFunction = filter;
+			unfilteredLength = data.length
+			super.dataProvider = data;
+		}
+
+		public function set searchInput(searchInput:SearchBox):void {
+			_searchInput = searchInput;
+			_searchInput.addEventListener(Event.CHANGE, doFiltering);
+		}
+
+        public function get searchText():String {
+            return _searchText;
+        }
+        
+		public function doFiltering(changeEvent:Event=null):void {
+			_searchText = _searchInput.text;
+			if (columns.length > 0) //Sometimes columns are not set yet resulting in empty list, so do not refresh in this case (only happens on startup).
+			    dataProvider.refresh();
+			validateNow();
+		}
+
+		private function filter(item:Object):Boolean {
+			return findMatchInColumns(item, _searchText);
+		}
+
+		private function findMatchInColumns(item:Object, searchText:String):Boolean {
+			for each (var column:DataGridColumn in columns) {
+				var value:String = item[column.dataField];
+				if (getIndexOfMatch(value, searchText) != -1) {
+					return true; //We have a match so whole row is in, can avoid matching the other columns
+				}
+			}
+			return false;
+		}
+
+		public function getIndexOfMatch(value:String, searchText:String):int {
+			var index:int = value.toLowerCase().indexOf(searchText.toLowerCase());
+			return index;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/HelpLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/HelpLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/HelpLabelButton.as	(revision 5961)
@@ -0,0 +1,20 @@
+package clarin.cmdi.componentregistry.common.components
+{
+	import flash.events.MouseEvent;
+	import flash.net.URLRequest;
+	import flash.net.navigateToURL;
+	
+	public class HelpLabelButton extends LabelButton{
+		
+		public function HelpLabelButton(){
+			super(goToDocumentationPage, "help");
+			toolTip = "Click to navigate to component-registry page";
+		}
+		
+		private function goToDocumentationPage(event:MouseEvent):void{
+			var request:URLRequest = new URLRequest("documentation.jsp");
+			navigateToURL(request, "_blank");
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/HighlightSelectionItemRenderer.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/HighlightSelectionItemRenderer.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/HighlightSelectionItemRenderer.as	(revision 5961)
@@ -0,0 +1,41 @@
+package clarin.cmdi.componentregistry.common.components {
+	import mx.controls.Label;
+
+	public class HighlightSelectionItemRenderer extends Label {
+
+		private static const OPEN_TAG:String = "<b>";
+		private static const CLOSE_TAG:String = "</b>";
+
+
+		public function HighlightSelectionItemRenderer() {
+			super();
+		}
+
+		override public function set text(value:String):void {
+			var highlight:Boolean = false;
+			if (listData && listData.owner is FilteringDataGrid) {
+				var _grid:FilteringDataGrid = listData.owner as FilteringDataGrid;
+				var searchText:String = _grid.searchText;
+				if (searchText != null && searchText.length > 0) {
+					var index:int = _grid.getIndexOfMatch(value, searchText);
+					if (index != -1) {
+						value = highlightMatch(value, searchText.length, index);
+						highlight = true;
+					}
+				}
+			}
+			if (highlight) {
+				super.htmlText = value;
+			} else {
+				super.text = value;
+			}
+		}
+
+		private function highlightMatch(value:String, len:int, index:int):String {
+			return value.substr(0, index).concat(OPEN_TAG, value.substr(index, len), CLOSE_TAG, value.substr(index + len));
+		}
+
+
+	}
+}
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LabelButton.as	(revision 5961)
@@ -0,0 +1,23 @@
+package clarin.cmdi.componentregistry.common.components {
+	import flash.events.MouseEvent;
+	
+	import mx.controls.Label;
+
+	public class LabelButton extends Label {
+		public function LabelButton(clickHandler:Function, text:String=null) {
+			super();
+			if(text != null){
+				this.text = text;
+			}
+			setStyle("color", "green");
+			addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				event.currentTarget.setStyle("textDecoration", "underline");
+			});
+			addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				event.currentTarget.setStyle("textDecoration", "none");
+			});
+			addEventListener(MouseEvent.CLICK, clickHandler);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LinkRenderer.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LinkRenderer.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LinkRenderer.mxml	(revision 5961)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml" click="linkListener(event)" mouseOver="mouseOver(event)" 
+				mouseOut="mouseOut(event)">
+ 
+	<mx:Script>
+		<![CDATA[
+			private function mouseOver(event:MouseEvent):void {
+			   event.currentTarget.setStyle("color","0x0000FF");
+			   event.currentTarget.setStyle("textDecoration","underline");
+			}
+ 
+			private function mouseOut(event:MouseEvent):void {
+			   event.currentTarget.setStyle("color","0x000000");
+			   event.currentTarget.setStyle("textDecoration","none");
+			}
+ 
+			private function linkListener(event:MouseEvent):void {
+			   var request:URLRequest = 
+				new URLRequest(event.currentTarget.text);
+			   navigateToURL(request, "_blank");
+			}
+		]]>
+	</mx:Script>
+</mx:Label>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LoginLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LoginLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/LoginLabelButton.as	(revision 5961)
@@ -0,0 +1,44 @@
+package clarin.cmdi.componentregistry.common.components {
+	import clarin.cmdi.componentregistry.services.Config;
+
+	import com.adobe.net.URI;
+
+	import flash.events.MouseEvent;
+	import flash.net.URLRequest;
+	import flash.net.navigateToURL;
+
+
+	public class LoginLabelButton extends LabelButton {
+
+		[Bindable]
+		public var viewType:String;
+		[Bindable]
+		public var spaceType:String;
+		[Bindable]
+		public var itemId:String;
+
+		public function LoginLabelButton() {
+			super(handleLogin, "login");
+			toolTip = "Click to login";
+		}
+
+		private function handleLogin(event:MouseEvent):void {
+			var req:URLRequest = new URLRequest();
+
+			var uri:URI  = new URI(Config.instance.serviceRootUrl);
+			uri.setQueryValue("shhaaDo", "lI");
+			if (viewType) {
+				uri.setQueryValue(Config.REGISTRY_PARAM_VIEW, viewType);
+			}
+			if (spaceType) {
+				uri.setQueryValue(Config.REGISTRY_PARAM_SPACE, spaceType);
+			}
+			if (itemId) {
+				uri.setQueryValue(Config.REGISTRY_PARAM_ITEM_ID, itemId);
+			}
+			req.url = uri.toString();
+			navigateToURL(req, "_top");
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RegistryView.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RegistryView.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RegistryView.as	(revision 5961)
@@ -0,0 +1,7 @@
+package clarin.cmdi.componentregistry.common.components {
+
+
+	public interface RegistryView {
+		function getType():String;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RegistryViewStack.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RegistryViewStack.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RegistryViewStack.as	(revision 5961)
@@ -0,0 +1,146 @@
+package clarin.cmdi.componentregistry.common.components {
+	import clarin.cmdi.componentregistry.browser.Browse;
+	import clarin.cmdi.componentregistry.browser.SwitchViewEvent;
+	import clarin.cmdi.componentregistry.common.Credentials;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.Login;
+	import clarin.cmdi.componentregistry.editor.Editor;
+	import clarin.cmdi.componentregistry.importer.Importer;
+	import clarin.cmdi.componentregistry.services.Config;
+	import clarin.cmdi.componentregistry.services.RegistrySpace;
+	
+	import flash.events.Event;
+	
+	import mx.containers.ViewStack;
+	import mx.controls.Alert;
+	import mx.events.CloseEvent;
+	import mx.events.FlexEvent;
+	
+	public class RegistryViewStack extends ViewStack {
+		public var browse:Browse = new Browse();
+		private var editor:Editor = new Editor();
+		private var importer:Importer = new Importer();
+		
+		private var loginPanel:Login;
+		private var selectedItem:ItemDescription;
+		
+		public function RegistryViewStack() {
+			loginPanel = new Login();
+			loginPanel.addEventListener(Login.FAILED, loginFailed);
+			browse.addEventListener(Browse.START_ITEM_LOADED, switchWithStartupItem);
+			Config._instance.addEventListener(SwitchViewEvent.SWITCH_VIEW, onSwitchingView);
+			addChild(browse); //everyone can browse
+			
+			if (!Config.instance.debug) {
+				editor.addEventListener(FlexEvent.SHOW, checkLogin);
+				importer.addEventListener(FlexEvent.SHOW, checkLogin);
+			}
+			addChild(editor);
+			addChild(importer);
+		}
+		
+		public static function showView(viewName:String, item:ItemDescription):void{
+			var event:SwitchViewEvent  = new SwitchViewEvent(viewName, item);
+			Config.instance.dispatchEvent(event);
+		}
+		
+		private function onSwitchingView(event:SwitchViewEvent):void{
+			switchView(event.view, event.item);
+		}
+		
+		private function switchWithStartupItem(even:Event):void {
+			var item:ItemDescription = browse.getSelectedStartItem();
+			switchView(Config.instance.view, item);
+		}
+		
+		public function loadStartup():void {
+			if ((Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP) && !Credentials.instance.isLoggedIn()) {
+				checkLogin();
+			} else {
+				if (Config.instance.startupItem) {
+					browse.loadStartup();
+				} else {
+					switchView(Config.instance.view);
+				}
+			}
+		}
+		
+		private function switchView(view:String, item:ItemDescription = null):void {
+			if (view == Config.VIEW_BROWSE) {
+				switchToBrowse(item);
+			} else if (view == Config.VIEW_EDIT) {
+				switchToEditor(item);
+			} else if (view == Config.VIEW_IMPORT) {
+				switchToImport();
+			}
+		}
+		
+		public function switchToBrowse(itemDescription:ItemDescription):void {
+			if (itemDescription != null) {				
+				
+				//Alert.show(itemDescription.id + " " +itemDescription.isPrivate + " " + Config.instance.registrySpace.space + " "+Config.instance.registrySpace.groupId);
+				
+				if (itemDescription.isPrivate) {
+					if (Config.instance.registrySpace.space == Config.SPACE_PUBLISHED) {
+						// from public registry we can save only to a private space
+					    Config.instance.registrySpace = new RegistrySpace(Config.SPACE_PRIVATE, "");
+					} else {
+						// registry, goup of private, stays the same
+					}
+				} else {					
+					if (Config.instance.registrySpace.space != Config.SPACE_PUBLISHED) {
+						// the item has been published, go to public space
+						Config.instance.registrySpace = new RegistrySpace( Config.SPACE_PUBLISHED, "");
+					} else {
+						// public item in a public registry, the registry setting stays intact
+					}
+				}
+				
+				browse.refresh();
+				browse.setSelectedDescription(itemDescription);
+			} 
+			this.selectedItem = itemDescription;
+			this.selectedChild = browse;
+		}
+		
+		public function switchToEditor(itemDescription:ItemDescription):void {
+			doSwitchToEditor(itemDescription);
+		}
+		
+		private function doSwitchToEditor(itemDescription:ItemDescription):void {
+			this.selectedChild = editor;
+			
+			//memoise registry space of config
+			//because component palette can alter it (unwanted side effect)
+		   editor.registrySpaceEditor = new RegistrySpace(Config.instance.registrySpace.space, Config.instance.registrySpace.groupId);
+		   
+		   if(itemDescription != null) {
+				this.selectedItem = itemDescription;
+				editor.setDescription(itemDescription);
+			}
+		   }
+		
+		public function switchToImport():void {
+			this.selectedChild = importer;
+		}
+		
+		private function checkLogin(event:Event = null):void {
+			if (!Credentials.instance.isLoggedIn()) {
+				var itemId:String = Config.instance.startupItem;
+				if (selectedItem) {
+					itemId = selectedItem.id;
+				}
+				loginPanel.show(this, RegistryView(this.selectedChild).getType(), Config.instance.registrySpace.space, itemId);
+			}
+		}
+		
+		private function loginFailed(event:Event):void {
+			this.selectedChild = browse;
+		}
+		
+		public function getEditor():Editor {
+			return this.editor;
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RemoveLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RemoveLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RemoveLabelButton.as	(revision 5961)
@@ -0,0 +1,12 @@
+package clarin.cmdi.componentregistry.common.components {
+	import flash.events.MouseEvent;
+
+	public class RemoveLabelButton extends BasicLabelButton {
+		public function RemoveLabelButton() {
+			super("X", "click to remove", "red");
+		}
+
+
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssCommentsContextMenu.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssCommentsContextMenu.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssCommentsContextMenu.as	(revision 5961)
@@ -0,0 +1,36 @@
+package clarin.cmdi.componentregistry.common.components
+{
+	
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.services.Config;
+	
+	import flash.events.Event;
+	import flash.events.ContextMenuEvent;
+	import flash.ui.ContextMenuItem;
+	import flash.system.System;
+	import flash.net.URLRequest;
+	import flash.net.navigateToURL;
+	
+	public class RssCommentsContextMenu extends RssContextMenu
+	{
+		private var _itemDescription:ItemDescription;
+		
+		public function RssCommentsContextMenu(itemDescription:ItemDescription)
+		{   super();
+			_itemDescription = itemDescription;
+		}
+		
+		override protected function copyRssLink(event:ContextMenuEvent):void {
+			System.setClipboard(Config.getRssUriComments(_itemDescription));
+		}
+		
+		override protected function showRssLink(event:ContextMenuEvent):void{
+			navigateToURL(new URLRequest(Config.getRssUriComments(_itemDescription)), "_blank");
+		}
+		
+		override protected function menuUpdateCaption(event:ContextMenuEvent):void {
+			_showRssLinkMenuItem.caption = Config.getRssUriComments(_itemDescription);
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssContextMenu.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssContextMenu.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssContextMenu.as	(revision 5961)
@@ -0,0 +1,58 @@
+package clarin.cmdi.componentregistry.common.components
+{
+	import clarin.cmdi.componentregistry.services.Config;
+	
+	import flash.events.Event;
+	import flash.events.ContextMenuEvent;
+	import flash.geom.Point;
+	import flash.system.System;
+	import flash.ui.ContextMenu;
+	import flash.ui.ContextMenuItem;
+	
+	public class RssContextMenu
+	{
+		
+		[Bindable]
+		public var cm:ContextMenu;
+		
+		private var _copyRssLinkMenuItem:ContextMenuItem;
+		protected var _showRssLinkMenuItem:ContextMenuItem;
+		
+		
+		public function RssContextMenu()
+		{ 
+			cm = new ContextMenu();
+			cm.hideBuiltInItems();
+			cm.customItems = createMenuItems();
+			cm.addEventListener(ContextMenuEvent.MENU_SELECT, menuUpdateCaption);
+		}
+		
+		private function createMenuItems():Array {
+			var result:Array = new Array();
+			
+			_showRssLinkMenuItem = new ContextMenuItem(" ");
+			_showRssLinkMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, showRssLink);
+			_showRssLinkMenuItem.visible = true;
+			result.push(_showRssLinkMenuItem);
+			
+			_copyRssLinkMenuItem = new ContextMenuItem("Copy Rss link to clipboard");
+			_copyRssLinkMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, copyRssLink);
+			_copyRssLinkMenuItem.visible = true;
+			result.push(_copyRssLinkMenuItem);
+			
+			return result;
+		}
+		
+		
+		protected function copyRssLink(event:ContextMenuEvent):void {
+		}
+		
+		protected function showRssLink(event:ContextMenuEvent):void{
+		}
+		
+		protected function menuUpdateCaption(event:ContextMenuEvent):void{
+		}
+		
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssDescriptionsContextMenu.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssDescriptionsContextMenu.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssDescriptionsContextMenu.as	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry.common.components
+{
+	import clarin.cmdi.componentregistry.services.Config;
+	
+	import flash.events.Event;
+	import flash.events.ContextMenuEvent;
+	import flash.ui.ContextMenuItem;
+	import flash.system.System;
+	import flash.net.URLRequest;
+	import flash.net.navigateToURL;
+	
+	public class RssDescriptionsContextMenu extends RssContextMenu
+	{
+		private var _typeOfDescription:String;
+
+		
+		public function RssDescriptionsContextMenu(typeOfDescription:String)
+		{   super();
+			_typeOfDescription = typeOfDescription;
+		}
+		
+		override protected function copyRssLink(event:ContextMenuEvent):void {
+			System.setClipboard(Config.getRssUriDescriptions(_typeOfDescription, Config.instance.registrySpace));
+		}
+				
+		override protected function showRssLink(event:ContextMenuEvent):void{
+			navigateToURL(new URLRequest(Config.getRssUriDescriptions(_typeOfDescription, Config.instance.registrySpace)), "_blank");
+		}
+		
+		override protected function menuUpdateCaption(event:ContextMenuEvent):void {
+			_showRssLinkMenuItem.caption = Config.getRssUriDescriptions(_typeOfDescription, Config.instance.registrySpace);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssLinkButton.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssLinkButton.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/RssLinkButton.mxml	(revision 5961)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
+		   cornerRadius="5"
+		   borderStyle="solid"
+		   width = "18"
+		   >
+	<mx:Script>	
+		<![CDATA[
+			import clarin.cmdi.componentregistry.services.Config;
+			import clarin.cmdi.componentregistry.common.StyleConstants;
+			
+			private const OUT_FOCUS_BORDER_COLOR:String="white";
+			private const IN_FOCUS_BORDER_COLOR:String = "haloBlue";
+			
+			private function focusBorder():void{
+				setStyle("borderColor", IN_FOCUS_BORDER_COLOR);
+				
+			}
+			
+			private function unFocusBorder():void{
+				setStyle("borderColor", OUT_FOCUS_BORDER_COLOR);
+			}
+		]]>
+	</mx:Script>
+	
+  <mx:Image id="pict"
+	  source="{StyleConstants.rssIcon}"
+	  toolTip = "RSS feed"
+	  useHandCursor="true" 
+	  buttonMode="true"
+	  mouseOver = "focusBorder()"
+	  mouseOut = "unFocusBorder()"
+	  />
+</mx:Canvas>
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/ScrollableTextArea.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/ScrollableTextArea.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/ScrollableTextArea.as	(revision 5961)
@@ -0,0 +1,39 @@
+package clarin.cmdi.componentregistry.common.components {
+	import flash.events.MouseEvent;
+	
+	import mx.controls.TextArea;
+	import mx.events.ScrollEvent;
+	import mx.events.ScrollEventDirection;
+
+    [Inspectable]
+	public class ScrollableTextArea extends TextArea {
+		public function ScrollableTextArea() {
+			super();
+		}
+
+		/**
+		 * Overrides the handler to be able to scroll, this is only needed for the shiny Macs out there. Implementation copied from mx.core.ScrollControlBase.as
+		 * Use this instead of mx.controls.TextArea
+		 **/
+		override protected function mouseWheelHandler(event:MouseEvent):void {
+			if (verticalScrollBar && verticalScrollBar.visible) {
+				event.stopPropagation();
+
+				var scrollDirection:int = event.delta <= 0 ? 1 : -1;
+
+				// Make sure we scroll by at least one line
+				var scrollAmount:Number = Math.max(Math.abs(event.delta), verticalScrollBar.lineScrollSize);
+
+				// Multiply by 3 to make scrolling a little faster
+				var oldPosition:Number = verticalScrollPosition;
+				verticalScrollPosition += 3 * scrollAmount * scrollDirection;
+
+				var scrollEvent:ScrollEvent = new ScrollEvent(ScrollEvent.SCROLL);
+				scrollEvent.direction = ScrollEventDirection.VERTICAL;
+				scrollEvent.position = verticalScrollPosition;
+				scrollEvent.delta = verticalScrollPosition - oldPosition;
+				dispatchEvent(scrollEvent);
+			}
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/SpaceSwitch.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/SpaceSwitch.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/SpaceSwitch.mxml	(revision 5961)
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml"
+			 width="110" change="selectionChangedHandler(event)"
+			 dataProvider="{spaces}" initialize="init()">
+	
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.common.Credentials;
+			import clarin.cmdi.componentregistry.common.Group;
+			import clarin.cmdi.componentregistry.common.Login;
+			import clarin.cmdi.componentregistry.services.Config;
+			import clarin.cmdi.componentregistry.services.ListUserGroupsMembershipService;
+			import clarin.cmdi.componentregistry.services.RegistrySpace;
+			
+			import mx.collections.ArrayCollection;
+			import mx.controls.Alert;
+			import mx.events.ListEvent;
+			
+			private static const PRIVATE_SPACE_LABEL:String = "Private space";
+			private static const PUBLIC_SPACE_LABEL:String = "Public space";
+			[Bindable]
+			public var spaces:ArrayCollection;
+			
+			//before groups are known
+			private function initSpaces():void{
+				spaces = new ArrayCollection([{label: PUBLIC_SPACE_LABEL, space: Config.SPACE_PUBLISHED, groupId:null}, {label: PRIVATE_SPACE_LABEL, space: Config.SPACE_PRIVATE, groupId:null}]);
+			}
+
+			public function init():void{
+				Config.instance.getListUserGroupsMembershipService().addEventListener(ListUserGroupsMembershipService.GROUPS_LOADED, onGroupsLoaded);
+				Config.instance.getListUserGroupsMembershipService().loadGroupsForUser(); // triggers the event ListUserGroupsMembershipService.GROUPS_LOADED
+			}
+			
+			private function selectionChangedHandler(event:ListEvent):void {
+				if (Credentials.instance.isLoggedIn()) {
+					var space:String = ComboBox(event.target).selectedItem.space;
+					var groupId:String = ComboBox(event.target).selectedItem.groupId;
+					if ((groupId != null) && (groupId != "")) {
+						space = Config.SPACE_GROUP; 
+					}
+					Config.instance.registrySpace = new RegistrySpace(space, groupId);
+				} else {
+					event.stopPropagation();
+					new Login().show(this.parent.parent, Config.VIEW_BROWSE, Config.instance.registrySpace.space, null);
+					selectedIndex = 0;
+				}
+			}
+			
+			public function onGroupsLoaded(event:Event):void{
+				initSpaces();
+				for each (var group:Group in Config.instance.getListUserGroupsMembershipService().groups) {
+					spaces.addItem({label:group.name, space:Config.SPACE_GROUP, groupId:group.id});					
+				} 
+				setSelectedIndex();
+			}
+			
+			/**
+			 * sets the index according to the current registry space
+			 */
+			public function setSelectedIndex():void{	
+				
+				if (Config.instance.registrySpace.space==Config.SPACE_PUBLISHED) {
+					this.selectedIndex = 0;
+					return;
+				}
+				
+				if(Credentials.instance.isLoggedIn()) {
+					if (Config.instance.registrySpace.space==Config.SPACE_PRIVATE) {
+						this.selectedIndex = 1;
+						return;
+					}
+					
+					var index:int;
+					if (Config.instance.registrySpace.space==Config.SPACE_GROUP) {
+						for (index=2;index<spaces.length; index++) {
+							if (spaces[index].groupId==Config.instance.registrySpace.groupId){
+								trace("indeces:" + index+" " +Config.instance.registrySpace.groupId +" " +spaces[index].groupId);
+								this.selectedIndex = index;
+								return;
+							}
+						}
+					}
+					
+					// in case of #$%^-up: 				
+					var spacesDump:String= spaces[0].space + "; "+spaces[1].space;
+					for (index=2;index<spaces.length; index++) {
+						spacesDump=spacesDump+";  "+spaces[index].space + " " +spaces[index].groupId;
+						}
+					
+					throw "Cannot identify the selection index for registry-space combobox. space = "+Config.instance.registrySpace.space+ " group "+Config.instance.registrySpace.groupId + spacesDump;
+				}
+			}
+				
+			
+		]]>
+	</mx:Script>
+</mx:ComboBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/UpIconButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/UpIconButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/UpIconButton.as	(revision 5961)
@@ -0,0 +1,18 @@
+package clarin.cmdi.componentregistry.common.components {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.controls.Button;
+
+	public class UpIconButton extends Button {
+		public function UpIconButton() {
+			super();
+			setStyle("icon", StyleConstants.upIcon);
+			setStyle("paddingTop", 15);
+			setStyle("paddingLeft", 18);
+			width = 5;
+			height = 0;
+			toolTip = "move up";
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/UserSettingsLabelButton.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/UserSettingsLabelButton.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/common/components/UserSettingsLabelButton.as	(revision 5961)
@@ -0,0 +1,32 @@
+package clarin.cmdi.componentregistry.common.components {
+	import clarin.cmdi.componentregistry.services.Config;
+
+	import com.adobe.net.URI;
+
+	import flash.events.MouseEvent;
+	import flash.net.URLRequest;
+	import flash.net.navigateToURL;
+
+	import mx.controls.Label;
+
+	public class UserSettingsLabelButton extends LabelButton {
+
+		[Bindable]
+		public var viewType:String;
+		[Bindable]
+		public var spaceType:String;
+		[Bindable]
+		public var itemId:String;
+
+		public function UserSettingsLabelButton() {
+			super(handleClick, "settings");
+			toolTip = "Click for user settings";
+		}
+
+		private function handleClick(event:MouseEvent):void {
+			var req:URLRequest = new URLRequest(Config.instance.userSettingsUrl);
+			navigateToURL(req, "_blank");
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/AttributeListEdit.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/AttributeListEdit.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/AttributeListEdit.as	(revision 5961)
@@ -0,0 +1,182 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.AddAttributeLabelButton;
+	import clarin.cmdi.componentregistry.common.components.RemoveLabelButton;
+	import clarin.cmdi.componentregistry.editor.model.AttributeContainer;
+	import clarin.cmdi.componentregistry.editor.model.CMDAttribute;
+	import clarin.cmdi.componentregistry.editor.model.ValueSchemeInterface;
+	import clarin.cmdi.componentregistry.services.ElementTypesListService;
+	import clarin.cmdi.componentregistry.services.IsocatService;
+	
+	import mx.binding.utils.ChangeWatcher;
+	
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.collections.ArrayCollection;
+	import mx.containers.Form;
+	import mx.containers.FormItem;
+	import mx.containers.FormItemDirection;
+	import mx.controls.Label;
+	import mx.core.UIComponent;
+	import mx.events.PropertyChangeEvent;
+
+	[Event(name="removeAttribute", type="flash.events.Event")]
+	public class AttributeListEdit extends Form {
+		private static const ATTRIBUTE_CHANGE_EVENT:String = "attributeChange";
+
+		private var _attributes:ArrayCollection;
+		private var _parent:UIComponent;
+		private var _parentContainer:AttributeContainer;
+		private var noAttributesLabel:Label = new Label();
+		[Bindable]
+		public var hasNoAttributes:Boolean = true;
+		private var addAttributeLabelButton:AddAttributeLabelButton;
+
+		public function AttributeListEdit(parentContainer:AttributeContainer, parent:UIComponent) {
+			super();
+			_parentContainer = parentContainer;
+			_attributes = parentContainer.getAttributeList();
+			_parent = parent;
+			hasNoAttributes = _attributes.length == 0;
+			styleName = StyleConstants.XMLBROWSER;
+			noAttributesLabel.text = "No Attributes";
+			BindingUtils.bindProperty(noAttributesLabel, "visible", this, "hasNoAttributes");
+			noAttributesLabel.styleName = StyleConstants.XMLBROWSER_FIELD_VALUE;
+			
+			
+		}
+
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(createHeading());
+			if (_attributes.length > 0) {
+				for each (var attribute:CMDAttribute in _attributes) {
+					addAttribute(createAttributeBox(attribute));
+				}
+			}
+			addAttributeButton();
+		}
+
+		private function addAttributeButton():void {
+			addAttributeLabelButton = new AddAttributeLabelButton();
+			addAttributeLabelButton.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+					var attr:CMDAttribute = CMDAttribute.createEmptyAttribute();
+					_attributes.addItem(attr);
+					hasNoAttributes = _attributes.length == 0;
+					addAttribute(createAttributeBox(attr));
+				});
+			addAttributeLabelButton.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+					drawFocus(true);
+				});
+			addAttributeLabelButton.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+					drawFocus(false);
+				});
+			addChild(addAttributeLabelButton);
+		}
+
+		private function createAttributeBox(attribute:CMDAttribute):Form {
+			var attributeBox:Form = new Form();
+			attributeBox.styleName = StyleConstants.XMLBROWSER;
+		    addEditBar(attribute, attributeBox);
+			attributeBox.addChild(ValueSchemeInput.makeValueSchemeInputFromValueScheme(attribute));
+			attributeBox.addChild(new ConceptLinkInput(LabelConstants.CONCEPTLINK, attribute.conceptLink, function(val:String):void {
+				attribute.conceptLink = val;}, IsocatService.TYPE_COMPLEX));
+			
+			return attributeBox;
+		}
+		
+		
+
+		private function addAttribute(attributeBox:Form):void {
+			if (!addAttributeLabelButton) {
+				addChild(attributeBox);
+			} else {
+				addChildAt(attributeBox, getChildIndex(addAttributeLabelButton));
+			}
+
+		}
+
+		/**
+		 * Turned into the constructor of ValueSchemeInput
+		 **/
+		
+		/*
+		public static function createAndAddValueScheme(valueScheme:ValueSchemeInterface):UIComponent {
+			
+			var valueSchemeInput:ValueSchemeInput = new ValueSchemeInput(LabelConstants.VALUESCHEME);
+			
+			if (valueScheme.valueSchemeEnumeration == null) {
+				if (valueScheme.valueSchemePattern) {
+					valueSchemeInput.valueSchemePattern = valueScheme.valueSchemePattern;
+				} else {
+					valueSchemeInput.valueSchemeSimple = valueScheme.valueSchemeSimple;
+				}
+			} else {
+				valueSchemeInput.valueSchemeEnumeration = valueScheme.valueSchemeEnumeration;
+			}
+			
+			ChangeWatcher.watch(valueSchemeInput, "valueSchemeSimple", function(e:PropertyChangeEvent):void {
+					valueScheme.valueSchemeSimple = e.newValue as String;
+					valueScheme.valueSchemePattern = "";
+					valueScheme.valueSchemeEnumeration = null;
+				});
+			
+			ChangeWatcher.watch(valueSchemeInput, "valueSchemePattern", function(e:PropertyChangeEvent):void {
+					valueScheme.valueSchemePattern = e.newValue as String;
+					valueScheme.valueSchemeEnumeration = null;
+					valueScheme.valueSchemeSimple = "";
+				});
+			
+			ChangeWatcher.watch(valueSchemeInput, "valueSchemeEnumeration", function(e:PropertyChangeEvent):void {
+					valueScheme.valueSchemeEnumeration = e.newValue as ArrayCollection;
+					valueScheme.valueSchemeSimple = "";
+					valueScheme.valueSchemePattern = "";
+				});
+			return valueSchemeInput;
+		}
+		*/
+
+		
+		private function addEditBar(attribute:CMDAttribute, attributeBox:Form):void {
+			var name:NameInputLine = new NameInputLine(attribute.name, function(val:String):void {
+					attribute.name = val;
+				}, new AttributeNameValidator(_parentContainer, attribute));
+			name.direction = FormItemDirection.HORIZONTAL
+			var removeButton:Label = new RemoveLabelButton();
+			removeButton.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+					attributeBox.drawFocus(false);
+					removeAttribute(attribute);
+					removeChild(attributeBox);
+				});
+			removeButton.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+					attributeBox.drawFocus(true);
+				});
+			removeButton.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+					attributeBox.drawFocus(false);
+				});
+			attributeBox.addChild(name);
+			name.addChild(removeButton);
+		}
+
+		private function removeAttribute(attribute:CMDAttribute):void {
+			var index:int = _attributes.getItemIndex(attribute);
+			if (index != -1) {
+				_attributes.removeItemAt(index);
+			}
+			hasNoAttributes = _attributes.length == 0;
+		}
+
+		private function createHeading():FormItem {
+			var heading:FormItem = new FormItem();
+			heading.label = LabelConstants.ATTRIBUTELIST;
+			heading.styleName = StyleConstants.XMLBROWSER_HEADER;
+			heading.addChild(noAttributesLabel);
+			return heading;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/AttributeNameValidator.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/AttributeNameValidator.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/AttributeNameValidator.as	(revision 5961)
@@ -0,0 +1,77 @@
+package clarin.cmdi.componentregistry.editor
+{
+	import clarin.cmdi.componentregistry.editor.model.AttributeContainer;
+	import clarin.cmdi.componentregistry.editor.model.CMDAttribute;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	
+	import mx.events.ValidationResultEvent;
+	import mx.validators.RegExpValidator;
+	import mx.validators.ValidationResult;
+	
+	public class AttributeNameValidator extends RegExpValidator
+	{
+		private var _parentComponent:AttributeContainer;
+		private var _childObject:CMDAttribute;
+		private var unique:Boolean;
+		private var nameAllowed:Boolean;
+		private var reservedComponentAttributes:Array = ["ref", "ComponentId"];
+		
+		public function AttributeNameValidator(parentComponent:AttributeContainer, childObject:CMDAttribute)
+		{
+			_parentComponent = parentComponent;
+			_childObject = childObject;
+			
+			expression = "^[A-Za-z0-9_\-]+$";
+			required = true;
+			noMatchError = "Name can only contain A-Z, a-z, 0-9, or _";
+		}
+		
+		override protected function doValidation(value:Object):Array{
+			var validatorResults:Array = super.doValidation(value);
+			
+			this.unique = true;
+			this.nameAllowed = true;
+			if(_parentComponent){								
+				var attributeName:String = String(value);
+
+				// check for illegal attribute names on components
+				if(_parentComponent is CMDComponent){
+					for each(var reservedName:String in reservedComponentAttributes){
+						if(reservedName == attributeName){
+							nameAllowed = false;
+							validatorResults = new Array();
+							validatorResults.push(new ValidationResult(true,null,"Illegal attribute name","'" + reservedName + "' is a reserved attribute name"));
+							return validatorResults;
+						}
+					}
+				}
+				
+				// check for duplicate attribute names
+				if(_childObject != null){
+					for each (var attribute:CMDAttribute in _parentComponent.getAttributeList()) {
+						if(attribute != _childObject && attribute.name == attributeName){
+							this.unique = false;
+							validatorResults = new Array();
+							validatorResults.push(new ValidationResult(true,null,"Duplicate attribute name","Name must be unqiue among attributes"));
+							return validatorResults;
+						}
+					}
+				}
+			}
+			
+			return validatorResults; 
+		}
+		
+		override protected function handleResults(errorResults:Array):ValidationResultEvent{
+			var result:ValidationResultEvent = super.handleResults(errorResults);
+			if(result.type == ValidationResultEvent.VALID){
+				if(!unique || !nameAllowed){
+					result = new ValidationResultEvent(ValidationResultEvent.INVALID);
+					result.results = errorResults;
+				}
+			}
+			return result;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CMDComponentXMLEditor.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CMDComponentXMLEditor.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CMDComponentXMLEditor.as	(revision 5961)
@@ -0,0 +1,433 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.CMDSpecRenderer;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.AddComponentLabelButton;
+	import clarin.cmdi.componentregistry.common.components.AddElementLabelButton;
+	import clarin.cmdi.componentregistry.common.components.LabelButton;
+	import clarin.cmdi.componentregistry.common.components.RemoveLabelButton;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	import clarin.cmdi.componentregistry.editor.model.CMDSpec;
+	import clarin.cmdi.componentregistry.services.IsocatService;
+	
+	import flash.display.DisplayObject;
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	import flash.utils.Dictionary;
+	import flash.utils.getTimer;
+	
+	import mx.collections.ArrayCollection;
+	import mx.containers.Form;
+	import mx.containers.FormItem;
+	import mx.containers.FormItemDirection;
+	import mx.containers.HBox;
+	import mx.controls.Alert;
+	import mx.controls.Label;
+	import mx.controls.Spacer;
+	import mx.core.Container;
+	import mx.core.UIComponent;
+	import mx.events.ChildExistenceChangedEvent;
+	import mx.events.CloseEvent;
+	import mx.events.DragEvent;
+	import mx.managers.DragManager;
+	import mx.managers.IFocusManagerComponent;
+	
+	[Event(name="editorChange", type="flash.events.Event")]
+	public class CMDComponentXMLEditor extends Form implements IFocusManagerComponent, CMDSpecRenderer {
+		
+		public static const DRAG_NEW_COMPONENT:String = "newComponent";
+		public static const DRAG_NEW_ELEMENT:String = "newElement";
+		public static const DRAG_NEW_ATTRIBUTE:String = "newAttribute";
+		private static const DRAG_ITEMS:String = "items";
+		public static const EDITOR_CHANGE_EVENT:String = "editorChange";
+		
+		private var _spec:CMDSpec;
+		private var _firstComponent:CMDComponent;
+		
+		[Bindable]
+		private var addComponentLabel:Label;
+		
+		private var addElementLabel:Label;
+		
+		// private var _editComponentBasics:ComponentEditorBasic;
+		
+		public function CMDComponentXMLEditor() {
+			super();
+			//_editComponentBasics = new ComponentEditorBasic(this, _firstComponent);
+			focusEnabled = true;
+			tabEnabled = true;
+			styleName = StyleConstants.XMLBROWSER;
+			// _editComponentBasics.addDragEventListenersAndProcessors();
+			addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
+			addEventListener(DragEvent.DRAG_OVER, dragOverHandler);
+			addEventListener(DragEvent.DRAG_DROP, dragDropHandler);
+			addEventListener(ChildExistenceChangedEvent.CHILD_ADD, dispatchEditorChangeEvent);
+			addEventListener(ChildExistenceChangedEvent.CHILD_REMOVE, dispatchEditorChangeEvent);
+		}
+		
+		public function validate():Boolean {
+			var componentDisplayPrioMap:Dictionary = new Dictionary(true);
+			componentDisplayPrioMap[this] = new ArrayCollection();
+			var result:Boolean = validateChildren(getChildren(), componentDisplayPrioMap, this);
+			result = validateDisplayPriorityFields(componentDisplayPrioMap) && result;
+			return result;
+		}
+		
+		private function validateChildren(children:Array, componentDisplayPrioMap:Dictionary, key:Object):Boolean {
+			var result:Boolean = true;
+			for each (var o:Object in children) {
+				if (o is CMDValidator) {
+					var validatorResult : Boolean = CMDValidator(o).validate();
+					if(!validatorResult){
+						CMDValidator(o).validate();
+					}
+					result = validatorResult && result;
+				}
+				if (o is Container) {
+					var newKey:Object = key;
+					if (o is ComponentEdit) {
+						componentDisplayPrioMap[o] = new ArrayCollection();
+						newKey = o;
+					}
+					result = validateChildren(Container(o).getChildren(), componentDisplayPrioMap, newKey) && result;
+					if (o is DisplayPriorityInput) {
+						componentDisplayPrioMap[newKey].addItem(o);
+					}
+				}
+			}
+			return result;
+		}
+		
+		private function validateDisplayPriorityFields(componentDisplayPrioMap:Dictionary):Boolean {
+			var result:Boolean = true;
+			for (var key:Object in componentDisplayPrioMap) {
+				var displayPrioritySet:Boolean = false;
+				var displayPriorityFields:ArrayCollection = componentDisplayPrioMap[key];
+				for each (var input:DisplayPriorityInput in displayPriorityFields) { // get values
+					if (input.getValue() > 0) {
+						displayPrioritySet = true;
+						break;
+					}
+				}
+				for each (var inputF:DisplayPriorityInput in displayPriorityFields) { // set results
+					if (displayPrioritySet) {
+						result = inputF.validate(input.getValue()) && result;
+					} else {
+						result = inputF.validate(null) && result;
+					}
+				}
+			}
+			return result;
+		}
+		
+		private function dragEnterHandler(event:DragEvent):void {
+		
+			DragManager.acceptDragDrop(event.currentTarget as UIComponent);
+			UIComponent(event.currentTarget).drawFocus(true);
+		} 
+		
+		
+		private function dragOverHandler(event:DragEvent):void {
+			if (event.dragSource.hasFormat(DRAG_ITEMS)) {
+				DragManager.showFeedback(DragManager.COPY);
+			} else {
+				DragManager.showFeedback(DragManager.NONE);
+			}
+		}
+		
+		private function dragDropHandler(event:DragEvent):void {
+			if (event.dragSource.hasFormat(DRAG_ITEMS)) {
+				var items:Array = event.dragSource.dataForFormat(DRAG_ITEMS) as Array;
+				for each (var item:ItemDescription in items) {
+					var comp:CMDComponent = new CMDComponent();
+					comp.componentId = item.id;
+					_firstComponent.cmdComponents.addItem(comp);
+					addComponent(comp);
+				}
+			}
+		}
+		
+		public function set cmdSpec(cmdSpec:CMDSpec):void {
+			_spec = cmdSpec;
+			createNewEditor();
+			dispatchEditorChangeEvent();
+		}
+		
+		private function dispatchEditorChangeEvent(event:Event = null):void {
+			dispatchEvent(new Event(EDITOR_CHANGE_EVENT));
+		}
+		
+		[Bindable]
+		public function get cmdSpec():CMDSpec {
+			return _spec;
+		}
+		
+		private function createNewEditor():void {
+			var start:int = getTimer();
+			//_editComponentBasics.addComponentLabel = null;
+			//_editComponentBasics.addElementLabel = null;
+			addComponentLabel = null;
+			addElementLabel = null;
+			removeAllChildren();
+			checkFirstDefiningComponent(_spec.cmdComponents);
+			handleHeader(_spec);
+			
+			addChild(createCollapseExpandBox());
+			
+			//_editComponentBasics.handleElements(_firstComponent.cmdElements);
+			//_editComponentBasics.addElementAddButton();
+			//_editComponentBasics.handleComponents(_firstComponent.cmdComponents);
+			//_editComponentBasics.addComponentAddButton();
+			
+			handleElements(_firstComponent.cmdElements);
+			addElementAddButton();
+			handleComponents(_firstComponent.cmdComponents);
+			addComponentAddButton();
+			
+			addChild(createCollapseExpandBox());
+
+			trace("Created editor view in " + (getTimer() - start) + " ms.");
+		}
+		
+		private function createCollapseExpandBox():HBox{
+			var collapseExpandBox:HBox = new HBox();
+			collapseExpandBox.addChild(createCollapseAllButton());
+			collapseExpandBox.addChild(createExpandAllButton());
+			return collapseExpandBox;
+		}
+		
+		private function createCollapseAllButton():UIComponent{
+			var button:LabelButton = new LabelButton(collapseAll,  "Collapse all");
+			button.setStyle("color","blue");
+			button.toolTip = "Collapse all components and elements in this editor";
+			return button;
+		}
+		
+		private function collapseAll(event:Event):void{
+			for(var i:int=0;i<numChildren;i++){
+				var child:Object = getChildAt(i);
+				if(child is ElementEdit || child is ComponentEdit){
+					ItemEdit(child).collapseAll();
+				}
+			}
+		}
+		
+		private function createExpandAllButton():UIComponent{
+			var button:LabelButton = new LabelButton(expandAll,  "Expand all");
+			button.setStyle("color","blue");
+			button.toolTip = "Expand all components and elements in this editor";
+			return button;
+		}		
+		
+		private function expandAll(event:Event):void{
+			for(var i:int=0;i<numChildren;i++){
+				var child:Object = getChildAt(i);
+				if(child is ElementEdit || child is ComponentEdit){
+					ItemEdit(child).expandAll();
+				}
+			}
+		}
+		
+		private function clearEditorHandler(event:Event):void {
+			if (_spec && !_spec.isProfile) {
+				clearEditorComponent();
+			} else {
+				clearEditorProfile();
+			}
+		}
+		
+		public function get specHasChanges():Boolean {
+			return _spec.hasChanged;
+		}
+		
+		public function clearEditorComponent() : void{		
+			clearEditorSubmit(doClearEditorComponent);
+		}	
+		
+		public function clearEditorProfile() : void{
+			clearEditorSubmit(doClearEditorProfile);
+		}
+		
+		private function clearEditorSubmit(clearFunction:Function) : void {
+			if(_spec.hasChanged) {
+				Alert.show("This will discard all changes to the component currently being edited", "Discard changes", Alert.OK|Alert.CANCEL, null, clearFunction); 
+			} else{
+				callLater(clearFunction);
+			}
+		}
+		
+		public function doClearEditorComponent(event:CloseEvent=null) : void{
+			if(event == null || event.detail == Alert.OK){
+				cmdSpec = CMDSpec.createEmptyComponent();
+				cmdSpec.changeTracking = true;
+				dispatchEditorChangeEvent();
+			}
+		}	
+		
+		public function doClearEditorProfile(event:CloseEvent=null) : void{
+			if(event == null || event.detail == Alert.OK){
+				cmdSpec = CMDSpec.createEmptyProfile();
+				cmdSpec.changeTracking = true;
+				dispatchEditorChangeEvent();
+			}
+		}
+		
+		/**
+		 * The xml model allows more component to be defined but we force only one component at the "root" level.
+		 */
+		private function checkFirstDefiningComponent(components:ArrayCollection):void {
+			if (components.length != 1) {
+				throw new Error("A profile/component must have 1 component defined at root level.");
+			} else {
+				_firstComponent = components.getItemAt(0) as CMDComponent;
+				if (_firstComponent.componentId != "" && _firstComponent.componentId != null) {
+					_firstComponent = new CMDComponent();
+					_firstComponent.name = _spec.headerName;
+					_firstComponent.cmdComponents = _spec.cmdComponents;
+					_spec.cmdComponents = new ArrayCollection();
+					_spec.cmdComponents.addItem(_firstComponent);
+				}
+			}
+		}
+		
+		private function handleHeader(spec:CMDSpec):void {
+			var head:FormItem = new FormItem();
+			head.direction = FormItemDirection.HORIZONTAL;
+			var buttons:FormItem = new SelectTypeRadioButtons(spec);
+			head.addChild(buttons);
+			var space:Spacer = new Spacer();
+			space.width = 55;
+			head.addChild(space);
+			addChild(head);
+			
+			var nameInput:NameInputLine = new NameInputLine(_firstComponent.name, function(val:String):void {
+				_firstComponent.name = val;
+				_spec.headerName = val;
+			}, InputValidators.getNameValidator());
+			addChild(nameInput);
+			
+			var groupNameInput:FormItemInputLine = new FormItemInputLine(LabelConstants.GROUP_NAME, spec.groupName, function(val:String):void {
+				spec.groupName = val;
+			}); // editable, not required
+			addChild(groupNameInput);
+			
+			var descriptionInput:FormItemInputText = new FormItemInputText(LabelConstants.DESCRIPTION, spec.headerDescription, function(val:String):void {
+				spec.headerDescription = val;
+			}, InputValidators.getIsRequiredValidator()); //editable, required
+			addChild(descriptionInput);
+			
+			var domainInput:ComboBoxInputLine = new ComboBoxInputLine(LabelConstants.DOMAIN_NAME, _spec.domainName, LabelConstants.DOMAIN_NAME_DATA, LabelConstants.DOMAIN_NAME_PROMPT, function(val:Object):void {
+				if (val) {
+					_spec.domainName = val.data;
+				}
+			}); // editable, not required
+			addChild(domainInput);
+			
+			//			var idInput:FormItemInputLine = new FormItemInputLine(XMLBrowser:"Id", spec.headerId, function(val:String):void {
+			//					spec.headerId = val;
+			//				}, false);
+			//			idInput.toolTip = "Id will be generated";
+			//			addChild(idInput);
+			var link:ConceptLinkInput = new ConceptLinkInput(LabelConstants.CONCEPTLINK, _firstComponent.conceptLink, function(val:String):void {
+				_firstComponent.conceptLink = val;
+			}, IsocatService.TYPE_CONTAINER);
+			addChild(link);
+			
+			addChild(new AttributeListEdit(_firstComponent, this))
+		}
+		
+		private function addComponentAddButton():void {
+			addComponentLabel = new AddComponentLabelButton();
+			addComponentLabel.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+				var comp:CMDComponent = CMDComponent.createEmptyComponent();
+				_firstComponent.cmdComponents.addItem(comp);
+				//_editComponentBasics.addComponent(comp);
+				addComponent(comp);
+				
+			});
+			addComponentLabel.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				drawFocus(true);
+			});
+			addComponentLabel.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				drawFocus(false);
+			});
+			addChild(addComponentLabel);
+		} 
+		
+		private function addElementAddButton():void {
+			addElementLabel = new AddElementLabelButton();
+			addElementLabel.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+				var element:CMDComponentElement = CMDComponentElement.createEmptyElement();
+				_firstComponent.cmdElements.addItem(element);
+				addElement(element);
+				
+			});
+			addElementLabel.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				drawFocus(true);
+			});
+			addElementLabel.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				drawFocus(false);
+			});
+			addChild(addElementLabel);
+		}
+		
+		/* Not Olha: private function createOptionalGroupNameInput(spec:CMDSpec):FormItem {
+		var result:FormItemInputLine = new FormItemInputLine(LabelConstants.GROUP_NAME, spec.groupName, function(val:String):void {
+		spec.groupName = val;
+		}, true, InputValidators.getIsRequiredValidator());
+		BindingUtils.bindSetter(function(val:Boolean):void {
+		result.visible = !val;
+		}, spec, "isProfile");
+		return result;
+		}  */
+		
+		private function handleComponents(components:ArrayCollection):void {
+			for each (var component:CMDComponent in components) {
+				//_editComponentBasics.addComponent(component);
+				addComponent(component);
+			}
+		}
+		
+		public function addComponent(component:CMDComponent):void {
+			var comp:Container = new ComponentEdit(component, this, _firstComponent);
+			comp.addEventListener(ComponentEdit.REMOVE_COMPONENT_EVENT, removeComponent);
+			if (!addComponentLabel) {
+				addChild(comp);
+			} else {
+				addChildAt(comp, getChildIndex(addComponentLabel)); //Add components at the place of the button so button moves down
+			}
+		}
+		
+		private function removeComponent(event:Event):void {
+			var comp:CMDComponent = ComponentEdit(event.currentTarget).component;
+			_firstComponent.removeComponent(comp);
+			removeChild(event.currentTarget as DisplayObject);
+		}
+		
+		
+		private function handleElements(elements:ArrayCollection):void {
+			for each (var element:CMDComponentElement in elements) {
+				addElement(element);
+			}
+		}
+		
+		public function addElement(element:CMDComponentElement):void {
+			var elem:Container = new ElementEdit(element, this, _firstComponent);
+			elem.setStyle("paddingLeft", "50");
+			elem.addEventListener(ElementEdit.REMOVE_ELEMENT_EVENT, removeElement);
+			if (!addElementLabel) {
+				addChild(elem);
+			} else {
+				addChildAt(elem, getChildIndex(addElementLabel));
+			}
+		}
+		
+		private function removeElement(event:Event):void {
+			var elem:CMDComponentElement = ElementEdit(event.currentTarget).element;
+			_firstComponent.removeElement(elem);
+			removeChild(event.currentTarget as DisplayObject);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CMDValidator.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CMDValidator.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CMDValidator.as	(revision 5961)
@@ -0,0 +1,7 @@
+package clarin.cmdi.componentregistry.editor
+{
+    public interface CMDValidator
+    {
+        function validate():Boolean;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CardinalityInput.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CardinalityInput.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CardinalityInput.as	(revision 5961)
@@ -0,0 +1,54 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.collections.ArrayCollection;
+	import mx.containers.FormItem;
+	import mx.containers.FormItemDirection;
+	import mx.controls.ComboBox;
+	
+	public class CardinalityInput extends FormItem {
+		public static const BOUNDED:String = "bounded";
+		public static const UNBOUNDED:String = "unbounded";
+		
+		private static var BOUNDED_CARDINALITY_DATA:ArrayCollection = createCardinalityData(false);
+		private static var UNBOUNDED_CARDINALITY_DATA:ArrayCollection = createCardinalityData(true);
+		
+		private static function createCardinalityData(includeUnbounded:Boolean):ArrayCollection {
+			var result:ArrayCollection = new ArrayCollection();
+			if(includeUnbounded){
+				result.addItem({label: "unbounded", data: "unbounded"});
+			}
+			for (var i:int = 0; i < 10; i++) {
+				result.addItem({label: i, data: i});
+			}
+			return result;
+		}
+		
+		private var numericList:ComboBox = new ComboBox();
+		
+		public function CardinalityInput(name:String, value:String, cardinalityType:String, bindingFunction:Function, editable:Boolean = true) {
+			super();
+			label = name;
+			direction = FormItemDirection.HORIZONTAL;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			BindingUtils.bindSetter(bindingFunction, numericList, "text");
+			numericList.width = 300;
+			numericList.editable = true;
+			numericList.prompt = value;
+			numericList.toolTip = "Pick a value or type any number";
+			if(cardinalityType == BOUNDED){
+				numericList.dataProvider = BOUNDED_CARDINALITY_DATA;
+			} else if(cardinalityType == UNBOUNDED){
+				numericList.dataProvider = UNBOUNDED_CARDINALITY_DATA
+			}
+		}
+		
+		
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(numericList);
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CheckboxInput.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CheckboxInput.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/CheckboxInput.as	(revision 5961)
@@ -0,0 +1,31 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.collections.ArrayCollection;
+	import mx.containers.FormItem;
+	import mx.containers.FormItemDirection;
+	import mx.controls.CheckBox;
+	import mx.controls.ComboBox;
+
+	public class CheckboxInput extends FormItem {
+		private var checkbox:CheckBox = new CheckBox();
+
+		public function CheckboxInput(name:String, value:Boolean, bindingFunction:Function) {
+			super();
+			label = name;
+			direction = FormItemDirection.HORIZONTAL;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			BindingUtils.bindSetter(bindingFunction, checkbox, "selected");
+			checkbox.width = 300;
+			checkbox.selected = value;
+		}
+
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(checkbox);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ChildNameValidator.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ChildNameValidator.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ChildNameValidator.as	(revision 5961)
@@ -0,0 +1,67 @@
+package clarin.cmdi.componentregistry.editor
+{
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	
+	import mx.events.ValidationResultEvent;
+	import mx.validators.RegExpValidator;
+	import mx.validators.ValidationResult;
+	
+	public class ChildNameValidator extends RegExpValidator
+	{
+		private var _parentComponent:CMDComponent;
+		private var _childObject:Object;
+		private var unique:Boolean;
+
+		public function ChildNameValidator(parentComponent:CMDComponent, childObject:Object)
+		{
+			_parentComponent = parentComponent;
+			_childObject = childObject;
+			
+			expression = "^[A-Za-z0-9_\-]+$";
+			required = true;
+			noMatchError = "Name can only contain A-Z, a-z, 0-9, or _";
+		}
+		
+		override protected function doValidation(value:Object):Array{
+			var validatorResults:Array = new Array();
+			validatorResults = super.doValidation(value);
+			
+			unique = true;
+			if(_parentComponent){						
+				var name:String = String(value);
+				if(_childObject != null){
+					for each (var component:CMDComponent in _parentComponent.cmdComponents) {
+						if(component != _childObject && component.name == name){
+							unique = false;
+							validatorResults = new Array();
+							validatorResults.push(new ValidationResult(true,null,"Duplicate component name","Name must be unqiue among siblings"));
+							return validatorResults;
+						}
+					}
+					for each (var element:CMDComponentElement in _parentComponent.cmdElements) {
+						if(element != _childObject && element.name == name){
+							unique = false;
+							validatorResults = new Array();
+							validatorResults.push(new ValidationResult(true,null,"Duplicate element name","Name must be unqiue among siblings"));
+							return validatorResults;
+						}
+					}
+				}
+			}
+			
+			return validatorResults; 
+		}
+		
+		override protected function handleResults(errorResults:Array):ValidationResultEvent{
+			var result:ValidationResultEvent = super.handleResults(errorResults);
+			if(result.type == ValidationResultEvent.VALID){
+				if(!unique){
+					result = new ValidationResultEvent(ValidationResultEvent.INVALID);
+					result.results = errorResults;
+				}
+			}
+			return result;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComboBoxInputLine.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComboBoxInputLine.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComboBoxInputLine.as	(revision 5961)
@@ -0,0 +1,36 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.collections.ArrayCollection;
+	import mx.containers.FormItem;
+	import mx.controls.ComboBox;
+
+	public class ComboBoxInputLine extends FormItem {
+
+		public var box:ComboBox = new ComboBox();
+
+
+		public function ComboBoxInputLine(name:String, value:String, dataProvider:ArrayCollection, prompt:String, bindingFunction:Function) {
+			super();
+			label = name;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			box.width = 300;
+			box.dataProvider = dataProvider;
+			box.selectedIndex = -1;
+			if (!value) {
+			    box.prompt = prompt;
+			} else {
+			    box.prompt = value;
+			}
+			BindingUtils.bindSetter(bindingFunction, box, "selectedItem");
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(box);
+		}
+
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentEdit.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentEdit.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentEdit.as	(revision 5961)
@@ -0,0 +1,334 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.AddComponentLabelButton;
+	import clarin.cmdi.componentregistry.common.components.AddElementLabelButton;
+	import clarin.cmdi.componentregistry.common.components.DownIconButton;
+	import clarin.cmdi.componentregistry.common.components.ExpandingComponentLabel;
+	import clarin.cmdi.componentregistry.common.components.RemoveLabelButton;
+	import clarin.cmdi.componentregistry.common.components.UpIconButton;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	import clarin.cmdi.componentregistry.services.IsocatService;
+	
+	import flash.display.DisplayObject;
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	
+	import mx.collections.ArrayCollection;
+	import mx.containers.Form;
+	import mx.containers.FormItem;
+	import mx.containers.HBox;
+	import mx.controls.Button;
+	import mx.controls.HRule;
+	import mx.controls.Label;
+	import mx.core.Container;
+	import mx.core.UIComponent;
+	import mx.events.DragEvent;
+	import mx.managers.DragManager;
+	
+	[Event(name="removeComponent", type="flash.events.Event")]
+	public class ComponentEdit extends ItemEdit {
+		public static const REMOVE_COMPONENT_EVENT:String = "removeComponent";
+		private static const DRAG_ITEMS:String = "items";
+		
+		private var _parent:UIComponent;
+		private var _component:CMDComponent;
+		private var _parentComponent:CMDComponent;
+		
+		[Bindable]
+		private var addComponentLabel:Label;
+		
+		private var addElementLabel:Label;
+		
+		//private var _editComponentBasics:ComponentEditorBasic;
+		
+		public function ComponentEdit(component:CMDComponent, parent:UIComponent, parentComponent:CMDComponent) {
+			super();
+			_component = component;
+			//_editComponentBasics  = new ComponentEditorBasic(this, _component);
+			_parentComponent = parentComponent;
+			_parent = parent;
+			styleName = StyleConstants.XMLBROWSER;
+			if (!component.componentId) { // new empty component, otherwise it would be an already existed component which cannot be edited.
+				//_editComponentBasics.addDragEventListenersAndProcessors();
+				addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
+				addEventListener(DragEvent.DRAG_OVER, dragOverHandler);
+				addEventListener(DragEvent.DRAG_DROP, dragDropHandler);
+			}
+		}
+		
+		public function get component():CMDComponent {
+			return _component;
+		}
+		
+		public function get parentComponent():CMDComponent {
+			return _parentComponent;
+		}
+		
+		private function dragEnterHandler(event:DragEvent):void {
+		
+	   	DragManager.acceptDragDrop(event.currentTarget as UIComponent);
+			UIComponent(event.currentTarget).drawFocus(true);
+		}
+		
+		
+		private function dragOverHandler(event:DragEvent):void {
+			if (event.dragSource.hasFormat(DRAG_ITEMS)) {
+				DragManager.showFeedback(DragManager.COPY);
+			} else {
+				DragManager.showFeedback(DragManager.NONE);
+			}
+		}
+		
+		private function dragDropHandler(event:DragEvent):void {
+			if (event.dragSource.hasFormat(DRAG_ITEMS)) {
+				var items:Array = event.dragSource.dataForFormat(DRAG_ITEMS) as Array;
+				for each (var item:ItemDescription in items) {
+					var comp:CMDComponent = new CMDComponent();
+					comp.componentId = item.id;
+					_component.cmdComponents.addItem(comp);
+					addComponent(comp);
+				}
+			}
+		}
+		
+		private function fireRemoveComponent(mouseEvent:MouseEvent):void {
+			drawFocus(false);
+			var event:Event = new Event(ComponentEditorBasic.REMOVE_COMPONENT_EVENT);
+			dispatchEvent(event);
+		}
+		
+		protected override function createChildren():void {
+			super.createChildren();
+			addRuler();
+			createComponentEditBar();
+			
+			addChild(getHideableForm());			
+			
+			var summary:ComponentSummary = new ComponentSummary();
+			summary.component = _component;
+			summary.visible = false;
+			
+			setSummaryContainer(summary);		
+			addChild(summary);
+			
+			var componentLink:FormItem = createComponentLink(_component);
+			if (componentLink != null) {
+				addCardinalityInput();
+				addToHideableForm(componentLink);
+			} else {
+				addNameInput();
+				addConceptLink();
+				addCardinalityInput();
+				handleCMDAttributeList();
+				//_editComponentBasics.handleElements(_component.cmdElements);
+				//_editComponentBasics.addElementAddButton();
+				//_editComponentBasics.handleComponents(_component.cmdComponents); //recursion
+				//_editComponentBasics.addComponentAddButton();
+				
+				
+				handleElements(_component.cmdElements);
+				addElementAddButton();
+				handleComponents(_component.cmdComponents); //recursion
+				addComponentAddButton();
+			}
+		}
+		
+		private function addComponentAddButton():void {
+			addComponentLabel = new AddComponentLabelButton();
+			addComponentLabel.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+				var comp:CMDComponent = CMDComponent.createEmptyComponent();
+				_component.cmdComponents.addItem(comp);
+				//_editComponentBasics.addComponent(comp);
+				addComponent(comp);
+			});
+			addComponentLabel.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				drawFocus(true);
+			});
+			addComponentLabel.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				drawFocus(false);
+			});
+			addChild(addComponentLabel);
+		}
+		
+		private function addElementAddButton():void {
+			addElementLabel = new AddElementLabelButton();
+			addElementLabel.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+				var element:CMDComponentElement = CMDComponentElement.createEmptyElement();
+				_component.cmdElements.addItem(element);
+				addElement(element);
+				
+			});
+			addElementLabel.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				drawFocus(true);
+			});
+			addElementLabel.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				drawFocus(false);
+			});
+			addChild(addElementLabel);
+		}
+		
+		private function addConceptLink():void {
+			addToHideableForm(new ConceptLinkInput(LabelConstants.CONCEPTLINK, _component.conceptLink, function(val:String):void {
+				_component.conceptLink = val;
+			}, IsocatService.TYPE_CONTAINER));
+		}
+		
+		private function addRuler():void {
+			var ruler:HRule = new HRule();
+			ruler.percentWidth = 80;
+			addChild(ruler);
+		}
+		
+		private function addNameInput():void {
+			var nameInput:FormItemInputLine = new NameInputLine(_component.name, function(val:String):void {
+				_component.name = val;	
+			}, new ChildNameValidator(_parentComponent, component));
+			addToHideableForm(nameInput);
+		}
+		
+		private function addCardinalityInput():void {
+			addToHideableForm(new CardinalityInput(LabelConstants.CARDINALITY_MIN, _component.cardinalityMin, CardinalityInput.BOUNDED, function(val:String):void {
+				_component.cardinalityMin = val;
+			}));
+			addToHideableForm(new CardinalityInput(LabelConstants.CARDINALITY_MAX, _component.cardinalityMax, CardinalityInput.UNBOUNDED,function(val:String):void {
+				_component.cardinalityMax = val;
+			}));
+		}
+		
+		private function createHidableForm():Form {
+			var form:Form = new Form();
+			form.styleName = StyleConstants.XMLBROWSER;
+			form.setStyle("paddingTop","0");
+			form.setStyle("paddingBottom","0");
+			form.verticalScrollPolicy = "off";
+			form.horizontalScrollPolicy = "off";
+			return form;
+		}
+		
+		private function createComponentEditBar():void {
+			var editBar:HBox = new HBox();
+			
+			editBar.addChild(getShowToggleBox());
+			
+			editBar.addChild(createHeading());
+			var removeButton:Label = new RemoveLabelButton();
+			addFocusListeners(removeButton).addEventListener(MouseEvent.CLICK, fireRemoveComponent);
+			editBar.addChild(removeButton);
+			
+			var downButton:Button = new DownIconButton();
+			addFocusListeners(downButton).addEventListener(MouseEvent.CLICK, moveDownComponent);
+			editBar.addChild(downButton);
+			
+			var upButton:Button = new UpIconButton();
+			addFocusListeners(upButton).addEventListener(MouseEvent.CLICK, moveUpComponent);
+			editBar.addChild(upButton);
+			addChild(editBar);
+		}
+		
+		private function moveDownComponent(event:Event):void {
+			var comp:CMDComponent = component;
+			if (parentComponent.moveDownComponent(comp)) {
+				var index:int = _parent.getChildIndex(this);
+				if (index != _parent.numChildren - 1) {
+					_parent.removeChild(this);
+					_parent.addChildAt(this, index + 1);
+				}
+			}
+		}
+		
+		private function moveUpComponent(event:Event):void {
+			var comp:CMDComponent = component;
+			if (parentComponent.moveUpComponent(comp)) {
+				var index:int = _parent.getChildIndex(this);
+				if (index != 0) {
+					_parent.removeChild(this);
+					_parent.addChildAt(this, index - 1);
+				}
+			}
+		}
+		
+		private function addFocusListeners(comp:UIComponent):UIComponent {
+			comp.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				drawFocus(true);
+			});
+			comp.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				drawFocus(false);
+			});
+			return comp;
+		}
+		
+		private function createComponentLink(component:CMDComponent):FormItem {
+			if (component.componentId != "" && component.componentId != null) {
+				var result:FormItem = new FormItem();
+				result.styleName = StyleConstants.XMLBROWSER_FIELD;
+				result.label = LabelConstants.COMPONENT_ID;
+				result.addChild(new ExpandingComponentLabel(component.componentId, false));
+				return result;
+			}
+			return null;
+		}
+		
+		private function handleCMDAttributeList():void {
+			addToHideableForm(new AttributeListEdit(_component, this));
+		}
+		
+		private function handleComponents(components:ArrayCollection):void {
+			for each (var component:CMDComponent in components) {
+				//_editComponentBasics.addComponent(component);
+				addComponent(component);
+			}
+		}
+		
+		public function addComponent(component:CMDComponent):void {
+			var comp:Container = new ComponentEdit(component, this, _component);
+			comp.addEventListener(ComponentEdit.REMOVE_COMPONENT_EVENT, removeComponent);
+			comp.setStyle("paddingLeft", "50");
+			if (!addComponentLabel) {
+				addChild(comp);
+			} else {
+				addChildAt(comp, getChildIndex(addComponentLabel));
+			}
+		}
+		
+		private function removeComponent(event:Event):void {
+			var comp:CMDComponent = ComponentEdit(event.currentTarget).component;
+			_component.removeComponent(comp);
+			removeChild(event.currentTarget as DisplayObject);
+		}
+		
+		private function handleElements(elements:ArrayCollection):void {
+			for each (var element:CMDComponentElement in elements) {
+				addElement(element);
+			}
+		}
+		
+		public function addElement(element:CMDComponentElement):void {
+			trace("ComponentEdit's addElement is called");
+			var elem:Container = new ElementEdit(element, this, _component);
+			elem.setStyle("paddingLeft", "50");
+			elem.addEventListener(ElementEdit.REMOVE_ELEMENT_EVENT, removeElement);
+			if (!addElementLabel) {
+				addChild(elem);
+			} else {
+				addChildAt(elem, getChildIndex(addElementLabel));
+			}
+		}
+		
+		private function removeElement(event:Event):void {
+			var elem:CMDComponentElement = ElementEdit(event.currentTarget).element;
+			_component.removeElement(elem);
+			removeChild(event.currentTarget as DisplayObject);
+		}
+		
+		
+		private function createHeading():FormItem {
+			var heading:FormItem = new FormItem();
+			heading.label = LabelConstants.COMPONENT;
+			heading.styleName = StyleConstants.XMLBROWSER_HEADER;
+			return heading;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentEditorBasic.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentEditorBasic.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentEditorBasic.as	(revision 5961)
@@ -0,0 +1,156 @@
+package clarin.cmdi.componentregistry.editor
+{   
+    import flash.events.Event;
+	import flash.events.MouseEvent;
+	
+	import flash.display.DisplayObject;
+	import flash.display.Sprite;
+	
+	import mx.managers.DragManager;
+	import mx.managers.IFocusManagerComponent;
+	import mx.core.Container;
+	import mx.core.UIComponent;
+	import mx.controls.Label;
+	import mx.events.DragEvent;
+	import mx.collections.ArrayCollection;
+	
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.components.AddComponentLabelButton;
+	import clarin.cmdi.componentregistry.common.components.AddElementLabelButton;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	
+	public class ComponentEditorBasic extends Sprite{
+		
+		public static const REMOVE_COMPONENT_EVENT:String = "removeComponent";
+		private static const DRAG_ITEMS:String = "items";
+		
+		private var _component:CMDComponent;
+		private var _ownerEditor:UIComponent;
+		public var addComponentLabel:Label;
+		public var addElementLabel:Label;
+		
+		
+		public function ComponentEditorBasic(ownerEditor:UIComponent, component:CMDComponent){
+			_ownerEditor=ownerEditor;
+			_component = component;
+		}
+		
+		
+		
+		public function addDragEventListenersAndProcessors():void {
+			addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
+			addEventListener(DragEvent.DRAG_OVER, dragOverHandler);
+			addEventListener(DragEvent.DRAG_DROP, dragDropHandler);
+		}
+		
+		
+		public function dragEnterHandler(event:DragEvent):void {
+			DragManager.acceptDragDrop(event.currentTarget as UIComponent);
+			UIComponent(event.currentTarget).drawFocus(true);
+		}
+		
+		private function dragOverHandler(event:DragEvent):void {
+			if (event.dragSource.hasFormat(DRAG_ITEMS)) {
+				DragManager.showFeedback(DragManager.COPY);
+			} else {
+				DragManager.showFeedback(DragManager.NONE);
+			}
+		}
+		
+		private function dragDropHandler(event:DragEvent):void {
+			if (event.dragSource.hasFormat(DRAG_ITEMS)) {
+				var items:Array = event.dragSource.dataForFormat(DRAG_ITEMS) as Array;
+				for each (var item:ItemDescription in items) {
+					var comp:CMDComponent = new CMDComponent();
+					comp.componentId = item.id;
+					_component.cmdComponents.addItem(comp);
+					addComponent(comp);
+				}
+			}
+		}
+		
+		public function addComponent(component:CMDComponent):void {
+			var comp:Container = new ComponentEdit(component, _ownerEditor, _component);
+			comp.addEventListener(ComponentEditorBasic.REMOVE_COMPONENT_EVENT, removeComponent);
+			
+			if (_ownerEditor is ComponentEdit) {comp.setStyle("paddingLeft", "50");};
+			
+			if (!(addComponentLabel)) {
+				_ownerEditor.addChild(comp);
+			} else {
+				_ownerEditor.addChildAt(comp, _ownerEditor.getChildIndex(addComponentLabel)); //Add components at the place of the button so button moves down
+			}
+		}
+		
+		private function removeComponent(event:Event):void {
+			var comp:CMDComponent = ComponentEdit(event.currentTarget).component;
+			_component.removeComponent(comp);
+			_ownerEditor.removeChild(event.currentTarget as DisplayObject);
+		}
+		
+		
+		public function addComponentAddButton():void {
+			addComponentLabel = new AddComponentLabelButton();
+			addComponentLabel.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+				var comp:CMDComponent = CMDComponent.createEmptyComponent();
+				_component.cmdComponents.addItem(comp);
+				addComponent(comp);
+			});
+			addComponentLabel.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				_ownerEditor.drawFocus(true);
+			});
+			addComponentLabel.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				_ownerEditor.drawFocus(false);
+			});
+			_ownerEditor.addChild(addComponentLabel);
+		}
+		
+		public function handleComponents(components:ArrayCollection):void {
+			for each (var component:CMDComponent in components) {
+				addComponent(component);
+			}
+		}
+		
+		public function addElementAddButton():void {
+			addElementLabel = new AddElementLabelButton();
+			addElementLabel.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {
+				var element:CMDComponentElement = CMDComponentElement.createEmptyElement();
+				_component.cmdElements.addItem(element);
+				addElement(element);
+				
+			});
+			addElementLabel.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+				_ownerEditor.drawFocus(true);
+			});
+			addElementLabel.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+				_ownerEditor.drawFocus(false);
+			});
+			_ownerEditor.addChild(addElementLabel);
+		}
+		
+		public function handleElements(elements:ArrayCollection):void {
+			for each (var element:CMDComponentElement in elements) {
+				addElement(element);
+			}
+		}
+		
+		public function addElement(element:CMDComponentElement):void {
+			var elem:Container = new ElementEdit(element, _ownerEditor, _component);
+			elem.setStyle("paddingLeft", "50");
+			elem.addEventListener(ElementEdit.REMOVE_ELEMENT_EVENT, removeElement);
+			if (!addElementLabel) {
+				_ownerEditor.addChild(elem);
+			} else {
+				_ownerEditor.addChildAt(elem, getChildIndex(addElementLabel));
+			}
+		}
+		
+		private function removeElement(event:Event):void {
+			var elem:CMDComponentElement = ElementEdit(event.currentTarget).element;
+			_component.removeElement(elem);
+			removeChild(event.currentTarget as DisplayObject);
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentSummary.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentSummary.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ComponentSummary.mxml	(revision 5961)
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 includeInLayout="{visible}"
+		 paddingLeft="50"
+		 >
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+			import clarin.cmdi.componentregistry.services.ComponentListService;
+			import clarin.cmdi.componentregistry.services.Config;
+			
+			[Bindable]
+			public var component:CMDComponent;
+		]]>
+	</mx:Script>
+	
+	<mx:HBox>	
+		<mx:HBox minWidth="160"
+				 visible="{component.componentId == null || component.componentId == ''}"
+				 includeInLayout="{component.componentId == null || component.componentId == ''}"
+				 >			
+			<mx:Label text="Name: " fontWeight="bold"/>
+			<mx:Label text="{component.name}" />
+		</mx:HBox>
+		
+		<mx:HBox minWidth="160"
+				 visible="{component.componentId != null &amp;&amp; component.componentId != ''}"
+				 includeInLayout="{component.componentId != null &amp;&amp; component.componentId != ''}"
+				 >			
+			<mx:Label text="ComponentId: " fontWeight="bold"/>
+			<mx:Label text="{Config.instance.getCurrentComponentsSrv().findDescription(component.componentId).name}" />
+		</mx:HBox>
+		
+		<mx:HBox minWidth="160">
+			<mx:Label text="Cardinality: " fontWeight="bold"/>
+			<mx:Label text="{component.cardinalityMin+' - '+component.cardinalityMax}" />
+		</mx:HBox>
+
+		<mx:HBox visible="{ component.attributeList.length > 0}"
+				 includeInLayout="{component.attributeList.length > 0}">
+			<mx:Label text="Attribute count: " fontWeight="bold"/>
+			<mx:Label text="{component.attributeList.length}" />
+		</mx:HBox>
+	</mx:HBox>
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ConceptLinkInput.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ConceptLinkInput.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ConceptLinkInput.as	(revision 5961)
@@ -0,0 +1,74 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.services.IsocatService;
+	
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.containers.FormItem;
+	import mx.containers.FormItemDirection;
+	import mx.controls.Button;
+	import mx.controls.TextInput;
+	import mx.events.ValidationResultEvent;
+	import mx.managers.PopUpManager;
+	import mx.validators.Validator;
+	
+	public class ConceptLinkInput extends FormItem implements CMDValidator {
+		
+		private var editField:TextInput = new TextInput();
+		private var searchConceptLink:Button = new Button();
+		private var isocatPopup:IsocatSearchPopUp;
+		private var conceptType:String;
+		private var validator:Validator = InputValidators.getConceptLinkValidator();
+		
+		public function ConceptLinkInput(name:String, value:String, bindingFunction:Function, conceptType:String = null) {
+			super();
+			direction = FormItemDirection.HORIZONTAL;
+			label = name;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			editField.styleName = StyleConstants.XMLEDITOR_EDIT_FIELD;
+			editField.width = 300;
+			editField.text = value;
+			BindingUtils.bindSetter(bindingFunction, editField, "text");
+			createSearchConceptLinkButton();
+			editField.addEventListener(Event.CHANGE, function():void {
+				editField.toolTip = null
+			});
+			validator.listener = this.editField;
+			this.conceptType = conceptType;			
+		}
+		
+		public function validate():Boolean {
+			var result:ValidationResultEvent = validator.validate(this.editField.text);
+			return result.type == ValidationResultEvent.VALID;
+		}
+		
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(editField);
+			addChild(searchConceptLink);
+		}
+		
+		private function createSearchConceptLinkButton():void {
+			searchConceptLink.label = "Search in concept registry...";
+			searchConceptLink.addEventListener(MouseEvent.CLICK, handleButtonClick);
+		}
+		
+		private function getIsocatPopup():IsocatSearchPopUp {
+			if (!isocatPopup) {
+				isocatPopup = EditorManager.getIsocatSearchPopUp(conceptType);
+				isocatPopup.addEventListener(IsocatSearchPopUp.OK_EVENT, function(e:Event):void {
+					editField.text = isocatPopup.editField.text;
+					editField.toolTip = isocatPopup.editField.toolTip;
+				});
+			}
+			return isocatPopup;
+		}
+		
+		private function handleButtonClick(event:MouseEvent):void {
+			PopUpManager.addPopUp(getIsocatPopup(), this.parent, false);
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/DisplayPriorityInput.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/DisplayPriorityInput.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/DisplayPriorityInput.as	(revision 5961)
@@ -0,0 +1,36 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+
+	import mx.binding.utils.BindingUtils;
+	import mx.events.ValidationResultEvent;
+	import mx.validators.Validator;
+
+	public class DisplayPriorityInput extends NumericStepperInputLine {
+		private var _validator:Validator;
+
+		public function DisplayPriorityInput(name:String, value:String, bindingFunction:Function) {
+			super(name, value, bindingFunction);
+			toolTip = LabelConstants.DISPLAY_PRIORITY_TOOLTIP;
+			_validator = InputValidators.getIsRequiredValidator();
+			_validator.listener = this.editField;
+			_validator.requiredFieldError = "At least one element should have it's displayPriority set to 1 or higher.";
+		}
+
+		public function getValue():Number {
+			return editField.value;
+		}
+
+		/**
+		 * Validate with given input because the DisplayPriority is a global setting 
+		 * which needs to be checked outside this class
+		 **/
+		public function validate(value:Object):Boolean {
+			if (_validator && this.visible) {
+				var result:ValidationResultEvent = _validator.validate(value);
+				return result.type == ValidationResultEvent.VALID;
+			}
+			return true;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/Editor.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/Editor.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/Editor.mxml	(revision 5961)
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
+		   xmlns:browser="clarin.cmdi.componentregistry.browser.*"
+		   xmlns:common="clarin.cmdi.componentregistry.common.*"
+		   xmlns:editor="clarin.cmdi.componentregistry.editor.*"
+		   width="100%"
+		   height="100%"
+		   label="Component Editor"
+		   creationComplete="init()"
+		   implements="clarin.cmdi.componentregistry.common.components.RegistryView" xmlns:components="clarin.cmdi.componentregistry.common.components.*"
+		   >
+	
+	<mx:Script source="EditorAS.as"/>
+	
+	<mx:VBox width="100%" height="100%">
+		
+		<mx:VBox width="100%" minHeight="30">
+			<editor:EditorButtonBar id="buttonBar"
+									width="100%"
+									height="90"
+									saveClick="saveSpec(UploadService.UPDATE)"
+									saveAsNewClick="saveSpec(UploadService.NEW)"
+									publishClick="publishSpec()"
+									cancelClick="cancel()"
+									/>
+			<mx:Text id="errorMessageField"
+					 text="{uploadService.message}"
+					 visible='{errorMessageField.text != ""}'
+					 includeInLayout='{errorMessageField.text != ""}'/>
+			<mx:ProgressBar id="uploadProgress"
+							label=""
+							mode="manual"
+							visible="false"
+							includeInLayout="false"/>
+		</mx:VBox>
+		
+		<mx:VDividedBox width="100%" height="100%" verticalScrollPolicy="off">
+			<mx:VBox width="100%" height="60%">
+				<editor:CMDComponentXMLEditor id="xmlEditor"
+											  cmdSpec="{cmdSpec}"
+											  editorChange="handleEditorChange(event)"
+											  width="100%"
+											  />
+			</mx:VBox>
+			
+			<mx:VBox styleName="borderStyles" width="100%" height="40%">
+				<mx:Label text="Drag existing components onto edit canvas"/>
+				<browser:BrowserOverviewList id="componentsPaletteOverview"
+											 width="100%" height="90%"
+											 buttonsEnabled="false"
+											 spaceSwitchEnabled="true"
+											 browserDataProvider="{componentsSrv.itemDescriptions}"
+											 browserColumns="{browserColumns.getComponentColumns()}"
+											 creationComplete="initPaletteOverview();"/>
+			</mx:VBox>
+			
+		</mx:VDividedBox>
+	</mx:VBox>
+	
+</mx:Canvas>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorAS.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorAS.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorAS.as	(revision 5961)
@@ -0,0 +1,248 @@
+// ActionScript file
+import clarin.cmdi.componentregistry.browser.BrowserColumns;
+import clarin.cmdi.componentregistry.browser.GroupSelectionEvent;
+import clarin.cmdi.componentregistry.common.ItemDescription;
+import clarin.cmdi.componentregistry.common.components.RegistryViewStack;
+import clarin.cmdi.componentregistry.editor.model.CMDModelFactory;
+import clarin.cmdi.componentregistry.editor.model.CMDSpec;
+import clarin.cmdi.componentregistry.importer.UploadCompleteEvent;
+import clarin.cmdi.componentregistry.services.ComponentInfoService;
+import clarin.cmdi.componentregistry.services.ComponentListService;
+import clarin.cmdi.componentregistry.services.ComponentUsageCheckEvent;
+import clarin.cmdi.componentregistry.services.ComponentUsageService;
+import clarin.cmdi.componentregistry.services.Config;
+import clarin.cmdi.componentregistry.services.ProfileInfoService;
+import clarin.cmdi.componentregistry.services.ProfileListService;
+import clarin.cmdi.componentregistry.services.RegistrySpace;
+import clarin.cmdi.componentregistry.services.UploadService;
+
+import flash.events.Event;
+
+import mx.collections.ArrayCollection;
+import mx.controls.Alert;
+import mx.events.CloseEvent;
+import mx.managers.CursorManager;
+
+
+private var profileSrv:ProfileInfoService = new ProfileInfoService();
+private var componentSrv:ComponentInfoService = new ComponentInfoService();
+private var itemDescription:ItemDescription;
+
+[Bindable]
+private var componentsSrv:ComponentListService = Config.instance.getCurrentComponentsSrv();
+
+[Bindable]
+private var profilesSrv:ProfileListService = Config.instance.getCurrentProfilesSrv();
+
+[Bindable]
+public var cmdComponent:XML;
+
+[Bindable]
+private var cmdSpec:CMDSpec;
+
+[Bindable]
+private var browserColumns:BrowserColumns = new BrowserColumns();
+
+[Bindable]
+private var uploadService:UploadService = new UploadService();
+
+[Bindable]
+private var viewStack:RegistryViewStack;
+
+private var _registrySpaceEditor:RegistrySpace;
+
+public function init():void {
+	
+	cmdSpec  = CMDSpec.createEmptyProfile();
+	profileSrv.addEventListener(ProfileInfoService.PROFILE_LOADED, profileLoaded);
+	componentSrv.addEventListener(ComponentInfoService.COMPONENT_LOADED, componentLoaded);
+	uploadService.addEventListener(UploadCompleteEvent.UPLOAD_COMPLETE, handleSaveComplete);
+	uploadService.init(uploadProgress);
+	Config.instance.addEventListener(Config.REGISTRY_SPACE_TOGGLE_EVENT, toggleRegistrySpace);
+	viewStack = this.parent as RegistryViewStack;
+	
+}
+
+public function set registrySpaceEditor(rs:RegistrySpace):void{
+	_registrySpaceEditor = rs;
+	componentsPaletteOverview.registrySpaceComboBox.setSelectedIndex();
+}
+
+private function toggleRegistrySpace(event:Event):void {
+	componentsSrv = Config.instance.getCurrentComponentsSrv();
+	profilesSrv = Config.instance.getCurrentProfilesSrv();
+}
+
+private function determineSaveButtonEnabled():void {
+	buttonBar.saveBtn.enabled =  (itemDescription != null && itemDescription.isPrivate && itemDescription.id != null && xmlEditor.cmdSpec.headerId != null && ( _registrySpaceEditor.space == Config.SPACE_PRIVATE || _registrySpaceEditor.space == Config.SPACE_GROUP));
+}
+
+private function determinePublishButtonEnabled():void {
+	buttonBar.publishBtn.enabled =  (itemDescription != null && itemDescription.isPrivate && itemDescription.id != null && xmlEditor.cmdSpec.headerId != null && ( _registrySpaceEditor.space == Config.SPACE_PRIVATE || _registrySpaceEditor.space == Config.SPACE_GROUP));
+}
+
+private function profileLoaded(event:Event):void {
+	var cmdComponent:XML = profileSrv.profile.profileSource;
+	this.cmdSpec = CMDModelFactory.createModel(cmdComponent, profileSrv.profile.description);
+	this.cmdSpec.changeTracking = true;
+	determineSaveButtonEnabled();
+	determinePublishButtonEnabled();	
+	Config.instance.getListGroupsOfItemService().loadGroupsForItem(itemDescription.id);
+	CursorManager.removeBusyCursor();
+}
+
+private function componentLoaded(event:Event):void {
+	var cmdComponent:XML = componentSrv.component.componentMD.xml;
+	this.cmdSpec = CMDModelFactory.createModel(cmdComponent, componentSrv.component.description);
+	// Track changes for components being edited
+	this.cmdSpec.changeTracking = true;
+	determineSaveButtonEnabled();
+	determinePublishButtonEnabled();
+	
+	Config.instance.getListGroupsOfItemService().loadGroupsForItem(itemDescription.id);
+	CursorManager.removeBusyCursor();
+}
+
+
+public function setDescription(itemDescription:ItemDescription):void {
+	if (itemDescription) {
+		this.itemDescription = itemDescription;
+		CursorManager.setBusyCursor();
+		if (itemDescription.isProfile) {
+			profileSrv.load(itemDescription);
+		} else {
+			componentSrv.load(itemDescription);
+		}
+		buttonBar.saveBtn.enabled = false;
+	}
+}
+
+
+
+private function publishSpec():void {
+	Alert.show("If your profile/component is ready to be used by other people press ok, otherwise press cancel and save it in your workspace or continue editing.", "Publish", Alert.OK | Alert.CANCEL, null, handlePublishAlert);
+	Config.instance.registrySpace = _registrySpaceEditor;
+}
+
+private function handlePublishAlert(event:CloseEvent):void {
+	if (event.detail == Alert.OK) {
+		saveSpec(UploadService.PUBLISH);
+	}
+}
+
+private function saveSpec(uploadAction:int):void {
+	if (xmlEditor.validate()) {
+		var item:ItemDescription = new ItemDescription();
+		item.description = xmlEditor.cmdSpec.headerDescription;
+		item.name = xmlEditor.cmdSpec.headerName;
+		item.isProfile = xmlEditor.cmdSpec.isProfile;
+		item.groupName = xmlEditor.cmdSpec.groupName;
+		item.domainName = xmlEditor.cmdSpec.domainName;
+		item.isPrivate = (_registrySpaceEditor.space ==  Config.SPACE_PRIVATE || _registrySpaceEditor.space == Config.SPACE_GROUP);
+		if (itemDescription && itemDescription.isPrivate ) {
+			item.id = xmlEditor.cmdSpec.headerId;
+		}
+		
+		// Private components that are in updated require usage check call. If in use, the user can choose whether or not to save the changes .
+		if(( (_registrySpaceEditor.space) == Config.SPACE_PRIVATE || 
+			(_registrySpaceEditor.space) == Config.SPACE_GROUP) && uploadAction == UploadService.UPDATE && !item.isProfile){
+			checkUsage(item, _registrySpaceEditor.space);
+		}else{
+			doUpload(uploadAction,item);
+		}
+		
+		if (uploadAction == UploadService.NEW) {
+			_registrySpaceEditor=new RegistrySpace(Config.SPACE_PRIVATE, "");
+		}
+		
+		if (uploadAction == UploadService.PUBLISH) {
+			_registrySpaceEditor=new RegistrySpace(Config.SPACE_PUBLISHED, "");
+		}
+		
+	} else {
+		errorMessageField.text = "Validation errors: red colored fields are invalid.";
+	}
+	Config.instance.registrySpace = _registrySpaceEditor;
+}
+
+
+
+private function cancel():void {
+	if(xmlEditor.specHasChanges){
+	Alert.show("There are pending changes. Cancelling will discard these. Are you sure you want to proceed?", "Discard changes?", Alert.YES|Alert.NO, null, 
+		function (eventObj:CloseEvent):void{
+			if(eventObj.detail == Alert.YES){
+				viewStack.switchToBrowse(itemDescription);				
+			}
+		});
+	} else {
+		viewStack.switchToBrowse(itemDescription);
+	}
+	Config.instance.registrySpace = _registrySpaceEditor;
+}
+
+/**
+ * Calls usage check for the specified component. If in use, asks user whether to proceed; if positive, initiates update.
+ */
+private function checkUsage(item:ItemDescription, space:String, uploadAction:int = 0):void{
+	var componentUsageService:ComponentUsageService = new ComponentUsageService(item);
+	componentUsageService.addEventListener(ComponentUsageCheckEvent.COMPONENT_IN_USE, 
+		function (event:ComponentUsageCheckEvent):void{
+			if(event.isComponentInUse){
+				var messageBody:String = "The component you are about to save is used by the following component(s) and/or profile(s):\n\n";
+				for each(var name:String in event.itemUsingComponent){
+					messageBody += " - " + name + "\n";
+				}
+				messageBody += "\nChanges in this component will affect the above. Do you want to proceed?";
+				Alert.show(messageBody,"Component is used", Alert.YES|Alert.NO,null,
+					function (eventObj:CloseEvent):void{
+						if(eventObj.detail == Alert.YES){
+							doUpload(uploadAction, item);
+						}
+					});
+			} else {
+				doUpload(uploadAction,item);
+			}
+		});
+	componentUsageService.checkUsage();
+}
+
+private function doUpload(uploadAction:int, item:ItemDescription):void{
+	uploadService.upload(uploadAction, item, xmlEditor.cmdSpec.toXml());
+}
+
+private function handleSaveComplete(event:UploadCompleteEvent):void {	
+	setDescription(event.itemDescription);
+	parentApplication.viewStack.switchToBrowse(event.itemDescription);	
+}
+
+
+private function handleEditorChange(event:Event):void {
+	errorMessageField.text = "";
+	uploadProgress.visible = false;
+	uploadProgress.includeInLayout = false;
+	determineSaveButtonEnabled();
+	determinePublishButtonEnabled();
+}
+
+private function initPaletteOverview():void {
+	componentsPaletteOverview.dataGrid.dragEnabled = true;
+	componentsPaletteOverview.dataGrid.allowMultipleSelection = true;
+	componentsPaletteOverview.dataGrid.resizableColumns = true;
+	componentsPaletteOverview.topPlank.getChildByName("rssLink").visible = false;
+	
+}
+
+public function getType():String {
+	return Config.VIEW_EDIT;
+}
+
+
+private function onGroupsLoaded(event:Event):void{
+	var groups:ArrayCollection = Config.instance.getListGroupsOfItemService().groups;
+	if (groups.length < 1);
+	else{
+		var groupId:String = groups.getItemAt(0).id;
+		var itemId:String = itemDescription.id;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorButtonBar.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorButtonBar.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorButtonBar.mxml	(revision 5961)
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 xmlns:editor="clarin.cmdi.componentregistry.editor.*"
+		 width="400"
+		 creationComplete="init()"
+		 paddingTop="10"
+		 height="90"
+		 >
+	<mx:Metadata>
+		[Event(name="saveClick", type="flash.events.MouseEvent")]
+		[Event(name="saveAsNewClick", type="flash.events.MouseEvent")]
+		[Event(name="publishClick", type="flash.events.MouseEvent")]
+		[Event(name="cancelClick", type="flash.events.MouseEvent")]
+	</mx:Metadata>
+		
+	<mx:HBox width="800" height="30">
+	<mx:Button id="saveBtn"
+			   label="Save"
+			   click="dispatchEvent(new MouseEvent('saveClick'))"/>
+	<mx:Button id="saveAsNewBtn"
+			   label="Save as new in your private space"
+			   click="dispatchEvent(new MouseEvent('saveAsNewClick'))"/>
+	<mx:Button id="publishBtn"
+			   label="Publish in public space"
+			   click="dispatchEvent(new MouseEvent('publishClick'))"/>
+	
+	<mx:Button id="cancelBtn"
+			   label="Cancel"
+			   click="dispatchEvent(new MouseEvent('cancelClick'))"/>
+	</mx:HBox>
+	
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.services.Config;
+			import mx.collections.ArrayCollection;
+			import mx.controls.Alert;
+			import mx.events.ListEvent;
+
+
+			[Bindable]
+			private var groups:ArrayCollection = new ArrayCollection();
+			private var previousSelectedIndex:int=0;
+			private static var currentSelectedGroup:String="";
+			
+			
+			public function init():void{
+			}
+			
+			
+			
+		]]>
+	</mx:Script>
+
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorManager.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorManager.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/EditorManager.as	(revision 5961)
@@ -0,0 +1,22 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.services.IsocatService;
+
+
+	/**
+	 * Manages static Editor components
+	 *
+	 **/
+	public final class EditorManager {
+
+		/**
+		 * Specify isocatSearchType see IsocatService. default is null which means search in all types
+		 **/
+		public static function getIsocatSearchPopUp(isocatSearchType:String = null):IsocatSearchPopUp {
+			var isocatSearchPopUp:IsocatSearchPopUp = new IsocatSearchPopUp();
+			isocatSearchPopUp.searchService = new IsocatService();
+			isocatSearchPopUp.isocatSearchType = isocatSearchType;
+			return isocatSearchPopUp;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ElementEdit.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ElementEdit.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ElementEdit.as	(revision 5961)
@@ -0,0 +1,191 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.common.components.DownIconButton;
+	import clarin.cmdi.componentregistry.common.components.RemoveLabelButton;
+	import clarin.cmdi.componentregistry.common.components.UpIconButton;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponent;
+	import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+	import clarin.cmdi.componentregistry.services.IsocatService;
+	
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.containers.Box;
+	import mx.containers.Form;
+	import mx.containers.FormItem;
+	import mx.containers.HBox;
+	import mx.containers.VBox;
+	import mx.controls.Button;
+	import mx.controls.Label;
+	import mx.core.Container;
+	import mx.core.UIComponent;
+
+	[Event(name="removeElement", type="flash.events.Event")]
+	public class ElementEdit extends ItemEdit {
+		public static const REMOVE_ELEMENT_EVENT:String = "removeElement";
+		private var _element:CMDComponentElement;
+		private var _parentComponent:CMDComponent;
+		private var _parent:UIComponent;
+
+		public function ElementEdit(element:CMDComponentElement, parent:UIComponent, parentComponent:CMDComponent) {
+			super();
+			this._element = element;
+			this._parentComponent = parentComponent;
+			this._parent = parent;
+			styleName = StyleConstants.XMLBROWSER;
+			
+			setStyle("paddingBottom","5");
+			verticalScrollPolicy = "off";
+			horizontalScrollPolicy = "off";
+			
+		}
+
+		public function get element():CMDComponentElement {
+			return _element;
+		}
+
+		public function get parentComponent():CMDComponent {
+			return _parentComponent;
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+						
+			addChild(createEditBar());
+			
+			addChild(getHideableForm());
+			
+			var summary:ElementSummary = new ElementSummary();
+			summary.element = _element;
+			summary.visible = false;
+			
+			setSummaryContainer(summary);
+			addChild(summary);
+			
+			addToHideableForm(createNameInput());
+			addToHideableForm(new ConceptLinkInput(LabelConstants.CONCEPTLINK, _element.conceptLink, function(val:String):void {
+					_element.conceptLink = val;
+				}, IsocatService.TYPE_COMPLEX));
+			addToHideableForm(new FormItemInputLine(LabelConstants.DOCUMENTATION, _element.documentation, function(val:String):void {
+					_element.documentation = val;
+				}));
+			addToHideableForm(new DisplayPriorityInput(LabelConstants.DISPLAY_PRIORITY, _element.displayPriority, function(val:String):void {
+					_element.displayPriority = val;
+				}));
+			
+			var cardinalityMinInput:CardinalityInput = new CardinalityInput(LabelConstants.CARDINALITY_MIN, _element.cardinalityMin, CardinalityInput.BOUNDED, function(val:String):void {
+				_element.cardinalityMin = val;
+			});
+			addToHideableForm(cardinalityMinInput);
+			
+			var cardinalityMaxInput:CardinalityInput = new CardinalityInput(LabelConstants.CARDINALITY_MAX, _element.cardinalityMax, CardinalityInput.UNBOUNDED, function(val:String):void {
+				_element.cardinalityMax = val;
+			});
+			// Max cardinatlity field should be disabled when multilingual is selected - binding to that field here
+			BindingUtils.bindSetter(function(value:String):void {
+				cardinalityMaxInput.enabled = _element.multilingual != "true";
+			}, _element, "multilingual");
+			addToHideableForm(cardinalityMaxInput);
+			
+			//  Editing "Type" in the form
+			addToHideableForm(ValueSchemeInput.makeValueSchemeInputFromValueScheme(_element));
+			
+			var multiLingualCheck:CheckboxInput = new CheckboxInput(LabelConstants.MULTILINGUAL, _element.multilingual == "true", function(val:Boolean):void {
+					_element.multilingual = String(val);
+				});
+			
+			multiLingualCheck.toolTip = "Can the value of this element be in multiple languages? Setting this will cause \"Max occurences\" to be always unbounded.";
+			BindingUtils.bindSetter(function(val:String):void {
+					var show:Boolean = "string" == val;
+					multiLingualCheck.visible = show;
+					multiLingualCheck.includeInLayout = show;
+					if (!show) {
+						_element.multilingual = null;
+					}
+				}, _element, "valueSchemeSimple");
+			
+			addToHideableForm(multiLingualCheck);
+			
+			handleCMDAttributeList();
+		}
+
+		private function createEditBar():HBox {
+			var editBar:HBox = new HBox();
+			
+			editBar.addChild(getShowToggleBox());
+			
+			editBar.addChild(createHeading());
+			var removeButton:Label = new RemoveLabelButton();
+			addFocusListeners(removeButton).addEventListener(MouseEvent.CLICK, fireRemoveComponent);
+			editBar.addChild(removeButton);
+
+			var downButton:Button = new DownIconButton();
+			addFocusListeners(downButton).addEventListener(MouseEvent.CLICK, moveDownElement);
+			editBar.addChild(downButton);
+
+			var upButton:Button = new UpIconButton();
+			addFocusListeners(upButton).addEventListener(MouseEvent.CLICK, moveUpElement);
+			editBar.addChild(upButton);
+			return editBar;
+		}
+
+		private function moveDownElement(event:Event):void {
+			var elem:CMDComponentElement = element;
+			if (parentComponent.moveDownElement(elem)) {
+				var index:int = _parent.getChildIndex(this);
+				if (index != numChildren - 1) {
+					_parent.removeChild(this);
+					_parent.addChildAt(this, index + 1);
+				}
+			}
+		}
+
+		private function moveUpElement(event:Event):void {
+			var elem:CMDComponentElement = element;
+			if (parentComponent.moveUpElement(elem)) {
+				var index:int = _parent.getChildIndex(this);
+				if (index != 0) {
+					_parent.removeChild(this);
+					_parent.addChildAt(this, index - 1);
+				}
+			}
+		}
+
+		private function addFocusListeners(comp:UIComponent):UIComponent {
+			comp.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
+					drawFocus(true);
+				});
+			comp.addEventListener(MouseEvent.MOUSE_OUT, function(event:MouseEvent):void {
+					drawFocus(false);
+				});
+			return comp;
+		}
+
+		private function fireRemoveComponent(mouseEvent:MouseEvent):void {
+			drawFocus(false);
+			var event:Event = new Event(REMOVE_ELEMENT_EVENT);
+			dispatchEvent(event);
+		}
+
+		private function handleCMDAttributeList():void {
+			var attributeEdit:Container = new AttributeListEdit(_element, this);
+			addToHideableForm(attributeEdit);
+		}
+
+		private function createHeading():FormItem {
+			var heading:FormItem = new FormItem();
+			heading.label = LabelConstants.ELEMENT;
+			heading.styleName = StyleConstants.XMLBROWSER_HEADER;
+			return heading;
+		}
+
+		private function createNameInput():NameInputLine {
+			var nameInput:NameInputLine = new NameInputLine(_element.name, function(val:String):void {
+					_element.name = val;
+			}, new ChildNameValidator(_parentComponent, element));
+			return nameInput;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ElementSummary.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ElementSummary.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ElementSummary.mxml	(revision 5961)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
+		 includeInLayout="{visible}"
+		 paddingLeft="50"
+		 >
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.editor.model.CMDComponentElement;
+			
+			[Bindable]
+			public var element:CMDComponentElement;
+		]]>
+	</mx:Script>
+	
+	<mx:HBox>	
+		<mx:HBox minWidth="160">			
+			<mx:Label text="Name: " fontWeight="bold"/>
+			<mx:Label text="{element.name}" />
+		</mx:HBox>
+		
+		<mx:HBox minWidth="120" visible="{element.valueSchemeSimple != null}" 
+				 includeInLayout="{element.valueSchemeSimple != null}">			
+			<mx:Label text="Type: " fontWeight="bold"/>
+			<mx:Label text="{element.valueSchemeSimple}" />
+		</mx:HBox>
+		
+		<mx:HBox minWidth="120" visible="{element.valueSchemePattern != null}" 
+				 includeInLayout="{element.valueSchemePattern != null}">			
+			<mx:Label text="Pattern: " fontWeight="bold"/>
+			<mx:Label text="{element.valueSchemePattern}" />
+		</mx:HBox>
+		
+		<mx:HBox minWidth="120" visible="{element.valueSchemeEnumeration != null}" 
+				 includeInLayout="{element.valueSchemeEnumeration != null}">			
+			<mx:Label text="Type: " fontWeight="bold"/>
+			<mx:Label text="vocabulary" />
+		</mx:HBox>
+	<!--
+	</mx:HBox>
+		
+	<mx:HBox>	
+		-->
+		<mx:HBox minWidth="160">
+			<mx:Label text="Cardinality: " fontWeight="bold"/>
+			<mx:Label text="{element.cardinalityMin+' - '+element.cardinalityMax}" />
+		</mx:HBox>
+	
+		<mx:HBox minWidth="120">
+			<mx:Label text="Display priority: " fontWeight="bold"/>
+			<mx:Label text="{element.displayPriority}" />
+		</mx:HBox>
+	
+		<mx:HBox visible="{element.attributeList.length > 0}"
+				 includeInLayout="{element.attributeList.length > 0}">
+			<mx:Label text="Attribute count: " fontWeight="bold"/>
+			<mx:Label text="{element.attributeList.length}" />
+		</mx:HBox>
+	</mx:HBox>
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/FormItemInputLine.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/FormItemInputLine.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/FormItemInputLine.as	(revision 5961)
@@ -0,0 +1,45 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.containers.FormItem;
+	import mx.controls.TextInput;
+	import mx.events.ValidationResultEvent;
+	import mx.validators.Validator;
+
+	public class FormItemInputLine extends FormItem implements CMDValidator {
+
+		public var editField:TextInput = new TextInput();
+
+		private var _validator:Validator;
+
+		public function FormItemInputLine(name:String, value:String, bindingFunction:Function, editable:Boolean = true, validator:Validator = null) {
+			super();
+			label = name;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			editField.styleName = StyleConstants.XMLEDITOR_EDIT_FIELD;
+			editField.width = 300;
+			editField.text = value;
+			editField.editable = editable;
+			BindingUtils.bindSetter(bindingFunction, editField, "text");
+			if (validator) {
+				_validator = validator;
+				_validator.listener = this.editField;
+			}
+		}
+
+		public function validate():Boolean {
+			if (_validator && this.visible) {
+				var result:ValidationResultEvent = _validator.validate(this.editField.text);
+				return result.type == ValidationResultEvent.VALID;
+			}
+			return true;
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(editField);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/FormItemInputText.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/FormItemInputText.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/FormItemInputText.as	(revision 5961)
@@ -0,0 +1,44 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.containers.FormItem;
+	import mx.controls.TextArea;
+	import mx.events.FlexEvent;
+	import mx.events.ValidationResultEvent;
+	import mx.validators.Validator;
+
+	public class FormItemInputText extends FormItem implements CMDValidator{
+
+		private var editArea:TextArea = new TextArea();
+		private var _validator:Validator;
+
+		public function FormItemInputText(name:String, value:String, bindingFunction:Function, validator:Validator = null) {
+			super();
+			label = name;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			editArea.styleName = StyleConstants.XMLEDITOR_EDIT_FIELD;
+			editArea.width = 300;
+			editArea.text = value;
+			BindingUtils.bindSetter(bindingFunction, editArea, "text");
+			if (validator) {
+			    _validator = validator;
+			    _validator.listener = this.editArea;
+			}
+		}
+
+		public function validate():Boolean {
+			if (_validator && this.visible) {
+				var result:ValidationResultEvent = _validator.validate(this.editArea.text);
+				return result.type == ValidationResultEvent.VALID;
+			}
+			return true;
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(editArea);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/InputValidators.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/InputValidators.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/InputValidators.as	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry.editor {
+	import mx.validators.RegExpValidator;
+	import mx.validators.Validator;
+
+
+	public final class InputValidators {
+		public function InputValidators() {
+		}
+
+		public static function getNameValidator():RegExpValidator {
+			var result:RegExpValidator = new RegExpValidator();
+			result.expression = "^[A-Za-z0-9_\-]+$";
+			result.required = true;
+			result.noMatchError = "Name can only contain A-Z, a-z, 0-9, or _";
+			return result;
+		}
+		
+		public static function getConceptLinkValidator():RegExpValidator {
+			var result:RegExpValidator = new RegExpValidator();
+			// Concept link must be a valid absolute URI
+			result.expression = "^([^:/?#]+):(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
+			result.required = false;
+			result.noMatchError = "Concept link must be a valid absolute URI";
+			return result;
+		}
+		
+		public static function getIsRequiredValidator():Validator {
+			var result:Validator = new Validator();
+			result.required = true;
+			return result;
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/IsocatSearchPopUp.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/IsocatSearchPopUp.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/IsocatSearchPopUp.mxml	(revision 5961)
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
+				xmlns:rictus="com.rictus.controls.*"
+				showCloseButton="true"
+				creationComplete="PopUpManager.centerPopUp(this)"
+				close="cleanUp();"
+				title="Search in CLARIN Concept Registry">
+
+	<mx:Metadata>
+		[Event(name="OK", type="flash.events.Event")]
+	</mx:Metadata>
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.services.IsocatService;
+			
+			import mx.controls.TextInput;
+			import mx.managers.PopUpManager;
+
+			public static const OK_EVENT:String = "OK";
+
+			[Bindable]
+			public var searchService:IsocatService = null;
+
+			public var isocatSearchType:String = null;
+
+			//To store the result
+			public var editField:TextInput;
+
+			private function handleOkClick():void {
+				dispatchEvent(new Event(OK_EVENT));
+				cleanUp();
+			}
+
+			private function cleanUp():void {
+				searchService.close();
+				PopUpManager.removePopUp(this);
+			}
+
+			private function initializeDataGrid():void {
+				editField = new TextInput();
+			}
+
+			private function setItem():void {
+				var selectedItem:XML = dataGrid.selectedItem as XML;
+				if (selectedItem) {
+					editField.text = selectedItem.@pid;
+					editField.toolTip = selectedItem.@name + ": " + selectedItem.@definition;
+				}
+			}
+
+			private function handleSearch(event:Event):void {
+				if(event is MouseEvent || (event is KeyboardEvent && KeyboardEvent(event).keyCode == Keyboard.ENTER)){
+					searchService.load(searchBox.text, isocatSearchType);					
+				}				
+			}
+			
+			private function openCCR():void {
+				var urlRequest:URLRequest = new URLRequest("http://www.clarin.eu/ccr/");
+                navigateToURL(urlRequest, "_blank");
+			}
+		]]>
+	</mx:Script>
+
+	<mx:VBox>
+		<mx:HBox>
+			<rictus:SearchBox id="searchBox"
+							  label="type keyword and press 'enter' to search"
+							  keyDown="handleSearch(event);"
+							  minWidth="300"/>
+			<mx:Button id="searchButton" 
+					   label="Search"
+					   click="handleSearch(event);" />
+			<mx:Label text="{dataGrid.dataProvider.length} results"/>
+			
+		    <mx:Spacer width="100%"/>
+		    
+			<mx:Label textAlign="right" textDecoration="underline" click="openCCR()" >
+            	<mx:htmlText><![CDATA[Searching in the <a href="http://www.clarin.eu/ccr/">CLARIN Concept Registry</a>]]></mx:htmlText>
+			</mx:Label>
+		</mx:HBox>
+		<mx:DataGrid id="dataGrid"
+					 dataProvider="{searchService.searchResults}"
+					 initialize="initializeDataGrid()"
+					 itemClick="setItem()"
+					 resizableColumns="true"
+					 itemRenderer="mx.controls.Label"
+					 showDataTips="true">
+			<mx:columns>
+				<mx:DataGridColumn dataField="@name"
+								   dataTipField="@name"
+								   headerText="Name"/>
+				<mx:DataGridColumn dataField="@definition"
+								   dataTipField="@definition"
+								   headerText="Definition"/>
+				<mx:DataGridColumn dataField="@identifier"
+								   dataTipField="@identifier"
+								   headerText="Identifier"/>
+				<mx:DataGridColumn dataField="@owner"
+								   dataTipField="@owner"
+								   headerText="Owner"/>
+				<mx:DataGridColumn dataField="@pid"
+								   dataTipField="@pid"
+								   headerText="Persistent Identifier"
+								   width="130"
+								   itemRenderer="clarin.cmdi.componentregistry.common.components.LinkRenderer"/>
+				<mx:DataGridColumn dataField="@type"
+								   dataTipField="@type"
+								   headerText="Type"/>
+				<mx:DataGridColumn dataField="@version"
+								   dataTipField="@version"
+								   headerText="Version"/>
+			</mx:columns>
+		</mx:DataGrid>
+		<mx:HBox width="100%">
+			<mx:Spacer width="100%"/>
+			<mx:Button id="okBtn"
+					   label="OK"
+					   click="handleOkClick()"
+					   enabled="{dataGrid.selectedItem != null}"
+					   />
+			<mx:Button label="Cancel"
+					   click="cleanUp()"/>
+		</mx:HBox>
+	</mx:VBox>
+</mx:TitleWindow>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ItemEdit.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ItemEdit.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ItemEdit.as	(revision 5961)
@@ -0,0 +1,76 @@
+package clarin.cmdi.componentregistry.editor
+{
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import flash.display.DisplayObject;
+	
+	import mx.containers.Form;
+	import mx.core.Container;
+	
+	public class ItemEdit extends Form
+	{
+		private var showToggleBox:ShowToggleBox;
+		private var hideableForm:Form;
+		
+		public function ItemEdit()
+		{
+			super();
+			hideableForm = createHidableForm();
+			
+			showToggleBox = new ShowToggleBox();
+			showToggleBox.visibleState = true;
+			
+			showToggleBox.visibleContainer = hideableForm;
+		}
+		
+		private function createHidableForm():Form {
+			var form:Form = new Form();
+			form.styleName = StyleConstants.XMLBROWSER;
+			form.setStyle("paddingTop","0");
+			form.setStyle("paddingBottom","0");
+			form.verticalScrollPolicy = "off";
+			form.horizontalScrollPolicy = "off";
+			return form;
+		}
+		
+		protected function getShowToggleBox():ShowToggleBox{
+			return showToggleBox;
+		}
+		
+		protected function setSummaryContainer(container:Container):void{
+			showToggleBox.invisibleContainer = container;
+		}
+		
+		protected function getHideableForm():Form{
+			return hideableForm;
+		}
+		
+		protected function addToHideableForm(child:DisplayObject):void{
+			hideableForm.addChild(child);
+		}
+		
+		public function setDetailsVisibleState(visibleState:Boolean):void{
+			showToggleBox.visibleState = visibleState;
+		}
+		
+		
+		
+		protected function setAllVisibleState(visibleState:Boolean):void{
+			setDetailsVisibleState(visibleState);
+			for(var i:int=0;i<numChildren;i++){
+				var child:Object = getChildAt(i);
+				if(child is ElementEdit || child is ComponentEdit){
+					ItemEdit(child).setAllVisibleState(visibleState);
+				}
+			}
+		}
+		
+		public function collapseAll():void{
+			setAllVisibleState(false);
+		}
+		
+		public function expandAll():void{
+			setAllVisibleState(true);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/NameInputLine.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/NameInputLine.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/NameInputLine.as	(revision 5961)
@@ -0,0 +1,16 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	
+	import mx.events.ValidationResultEvent;
+	import mx.validators.Validator;
+
+	public class NameInputLine extends FormItemInputLine {
+
+		private var validator:Validator;
+
+		public function NameInputLine(value:String, bindingFunction:Function, validator:Validator=null) {
+			super(LabelConstants.NAME, value, bindingFunction, true, validator);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/NumericStepperInputLine.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/NumericStepperInputLine.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/NumericStepperInputLine.as	(revision 5961)
@@ -0,0 +1,29 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.containers.FormItem;
+	import mx.controls.NumericStepper;
+
+	public class NumericStepperInputLine extends FormItem {
+		protected var editField:NumericStepper = new NumericStepper();
+
+
+		public function NumericStepperInputLine(name:String, value:String, bindingFunction:Function) {
+			super();
+			label = name;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			editField.styleName = StyleConstants.XMLEDITOR_EDIT_FIELD;
+			editField.width = 300;
+			editField.value = Number(value);
+			editField.maximum = 10;
+			BindingUtils.bindSetter(bindingFunction, editField, "value");
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(editField);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/SelectTypeRadioButtons.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/SelectTypeRadioButtons.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/SelectTypeRadioButtons.as	(revision 5961)
@@ -0,0 +1,51 @@
+package clarin.cmdi.componentregistry.editor {
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.editor.model.CMDSpec;
+	
+	import flash.events.MouseEvent;
+	
+	import mx.containers.FormItem;
+	import mx.containers.FormItemDirection;
+	import mx.controls.ButtonLabelPlacement;
+	import mx.controls.Label;
+	import mx.controls.RadioButton;
+
+	public class SelectTypeRadioButtons extends FormItem {
+
+		private var _spec:CMDSpec;
+
+		public function SelectTypeRadioButtons(spec:CMDSpec) {
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			_spec = spec;
+			direction = FormItemDirection.HORIZONTAL;
+		}
+
+		protected override function createChildren():void {
+			super.createChildren();
+			var isProfileButton:RadioButton = new RadioButton();
+			isProfileButton.groupName = "selectType";
+			isProfileButton.label = "Profile";
+			isProfileButton.selected = _spec.isProfile;
+			isProfileButton.labelPlacement = ButtonLabelPlacement.LEFT;
+			isProfileButton.addEventListener(MouseEvent.CLICK, handleIsProfile);
+			addChild(isProfileButton);
+
+			var isComponentButton:RadioButton = new RadioButton();
+			isComponentButton.groupName = "selectType";
+			isComponentButton.label = "Component";
+			isComponentButton.selected = !_spec.isProfile;
+			isComponentButton.labelPlacement = ButtonLabelPlacement.LEFT;
+			isComponentButton.addEventListener(MouseEvent.CLICK, handleIsComponent);
+			addChild(isComponentButton);
+		}
+
+		private function handleIsProfile(event:MouseEvent):void {
+			_spec.isProfile = true;
+		}
+
+		private function handleIsComponent(event:MouseEvent):void {
+			_spec.isProfile = false;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ShowToggleBox.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ShowToggleBox.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ShowToggleBox.mxml	(revision 5961)
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Box xmlns:mx="http://www.adobe.com/2006/mxml"
+		borderStyle="solid"
+		initialize="initHandler(event)"
+		click="clickHandler(event)"
+		mouseOver="mouseOverHandler(event)"
+		mouseOut="mouseOutHandler(event)"
+		toolTip="Expand/collapse item details"
+		borderColor="#B7BABC"
+		>
+	<mx:Script>
+		<![CDATA[
+			import mx.binding.utils.BindingUtils;
+			import mx.core.Container;
+			import mx.events.FlexEvent;
+			
+			[Bindable]
+			public var visibleState:Boolean;
+			[Bindable]
+			public var visibleContainer:Container;
+			[Bindable]
+			public var invisibleContainer:Container;	
+			
+			protected function initHandler(event:FlexEvent):void
+			{
+				BindingUtils.bindSetter(updateState, this, "visibleState");
+			}
+			
+			protected function clickHandler(event:MouseEvent):void
+			{
+				visibleState = !visibleState;
+				//removeDrawFocus();
+			}
+			
+			protected function mouseOverHandler(event:MouseEvent):void
+			{
+				event.currentTarget.setStyle("borderColor", "#000000");
+				if(visibleContainer != null){
+					visibleContainer.drawFocus(visibleState);
+				}
+				if(invisibleContainer != null){
+					invisibleContainer.drawFocus(!visibleState);
+				}
+			}
+			
+			private function updateState(val:Boolean):void{
+				if(visibleContainer != null){
+					visibleContainer.visible = visibleState;
+					visibleContainer.includeInLayout = visibleState;
+					if(visibleState){
+						if(invisibleContainer != null){
+							invisibleContainer.drawFocus(false);
+						}
+						visibleContainer.drawFocus(true);
+					}
+				}
+				
+				if(invisibleContainer != null){
+					invisibleContainer.visible = !visibleState;
+					invisibleContainer.includeInLayout = !visibleState;
+					if(!visibleState){
+						if(visibleContainer != null){
+							visibleContainer.drawFocus(false);
+						}
+						invisibleContainer.drawFocus(true);
+					}					
+				}
+			}
+
+			protected function mouseOutHandler(event:MouseEvent):void
+			{
+				event.currentTarget.setStyle("borderColor", "#B7BABC");
+				removeDrawFocus();
+			}
+			
+			private function removeDrawFocus():void{
+				if(visibleContainer != null){
+					visibleContainer.drawFocus(false);
+				}
+				if(invisibleContainer != null){
+					invisibleContainer.drawFocus(false);
+				}
+			}
+
+		]]>
+	</mx:Script>
+	
+	<mx:Label textAlign="center" text="{visibleState?'-':'+'}" />
+</mx:Box>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeEnumerationGrid.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeEnumerationGrid.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeEnumerationGrid.mxml	(revision 5961)
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">
+	<mx:Script>
+		<![CDATA[
+			import mx.binding.utils.BindingUtils;
+			import mx.core.IDataRenderer;
+			import mx.controls.Button;
+			import mx.events.ListEvent;
+			import mx.events.DataGridEventReason;
+			import clarin.cmdi.componentregistry.common.ComponentMD;
+			import mx.collections.XMLListCollection;
+			import mx.controls.TextInput;
+			import mx.events.DataGridEvent;
+			import mx.collections.ArrayCollection;
+			import mx.managers.PopUpManager;
+
+			private static const ADD_ROW:String = "Click to add a row";
+
+			[Bindable]
+			public var valueSchemeEnumeration:ArrayCollection = new ArrayCollection();
+			[Bindable]
+			public var conceptLinkEdit:Boolean = false;
+			private var currentEditPosition:Object;
+
+			public function initEnumeration(valueSchemeData:ArrayCollection):void {
+				if (valueSchemeData) {
+					for each (var item:ValueSchemeItem in valueSchemeData) {
+						valueSchemeEnumeration.addItem(item);
+					}
+				}
+				valueSchemeEnumeration.addItem(new ValueSchemeItem(ADD_ROW, "", ""));
+			}
+
+			private function editEnd(e:DataGridEvent):void {
+				if (e.rowIndex == valueSchemeEnumeration.length - 1 && e.columnIndex == 0 && e.reason != DataGridEventReason.CANCELLED) {
+					var row:Object = valueSchemeEnumeration.getItemAt(valueSchemeEnumeration.length - 1);
+					var input:Object = TextInput(e.currentTarget.itemEditorInstance);
+					if (row.item == ADD_ROW && input.text != ADD_ROW) {
+						valueSchemeEnumeration.addItem(new ValueSchemeItem(ADD_ROW, "", ""));
+						//scroll down
+						dataGrid.validateNow();
+						dataGrid.selectedIndex = valueSchemeEnumeration.length - 1;
+						dataGrid.scrollToIndex(valueSchemeEnumeration.length);
+					}
+				}
+			}
+
+			private function checkEdit(event:DataGridEvent):void {
+				// Do not allow editing of "Add row" row except for "Click to Add" column
+				if (event.rowIndex == valueSchemeEnumeration.length - 1 && event.columnIndex != 0)
+					event.preventDefault();
+			}
+
+			public function setConceptLink(input:TextInput):void {
+				var currentEditRow:Object = valueSchemeEnumeration.getItemAt(currentEditPosition.rowIndex);
+				currentEditRow.conceptLink = input.text;
+				dataGrid.invalidateList();
+				conceptLinkEdit = false;
+			}
+
+			private function handleItemEditBegin(e:DataGridEvent):void {
+				if (e.rowIndex < valueSchemeEnumeration.length - 1 && e.columnIndex == 2) {
+					conceptLinkEdit = true;
+					currentEditPosition = dataGrid.editedItemPosition;
+				} else {
+					conceptLinkEdit = false;
+				}
+			}
+
+			private function handleKeyUp(event:KeyboardEvent):void {
+				if (event.keyCode == Keyboard.DELETE) {
+					deleteRow(event);
+				}
+			}
+
+			private function deleteRow(event:*):void {
+				var indices:Array = dataGrid.selectedIndices;
+				for each (var index:int in indices) {
+					if (index != valueSchemeEnumeration.length - 1) { //Don't delete last row
+						valueSchemeEnumeration.removeItemAt(index);
+					}
+				}
+				dataGrid.validateNow();
+			}
+
+			private function insertRowAbove(event:ContextMenuEvent):void {
+				var index:int = Math.max(0, dataGrid.selectedIndex);
+				valueSchemeEnumeration.addItemAt(new ValueSchemeItem(ADD_ROW, "", ""), index);
+			}
+
+			private function createContextMenu():ContextMenu {
+				var cm:ContextMenu = new ContextMenu();
+				cm.hideBuiltInItems();
+				var items:Array = new Array();
+				var cmi:ContextMenuItem = new ContextMenuItem("Insert row above selected row...");
+				cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, insertRowAbove);
+				items.push(cmi);
+				cmi = new ContextMenuItem("Delete row...", true);
+				cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, deleteRow);
+				items.push(cmi);
+				cm.customItems = items;
+				return cm;
+			}
+		]]>
+	</mx:Script>
+
+	<mx:DataGrid id="dataGrid"
+				 editable="true"
+				 doubleClickEnabled="true"
+				 sortableColumns="false"
+				 dataProvider="{valueSchemeEnumeration}"
+				 itemEditEnd="editEnd(event)"
+				 itemEditBeginning="checkEdit(event)"
+				 itemEditBegin="handleItemEditBegin(event)"
+				 allowMultipleSelection="true"
+				 keyUp="handleKeyUp(event)"
+				 contextMenu="{createContextMenu()}"
+				 useRollOver="false">
+		<mx:columns>
+			<mx:DataGridColumn dataField="item" headerText="Value"/>
+			<mx:DataGridColumn dataField="appInfo" headerText="Description"/>
+			<mx:DataGridColumn dataField="conceptLink" headerText="Concept link"/>
+		</mx:columns>
+	</mx:DataGrid>
+</mx:VBox>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeInput.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeInput.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeInput.as	(revision 5961)
@@ -0,0 +1,185 @@
+package clarin.cmdi.componentregistry.editor { // trunk version
+	import clarin.cmdi.componentregistry.browser.XMLBrowserValueSchemeLine;
+	import clarin.cmdi.componentregistry.common.LabelConstants;
+	import clarin.cmdi.componentregistry.common.StyleConstants;
+	import clarin.cmdi.componentregistry.editor.model.ValueSchemeInterface;
+	import clarin.cmdi.componentregistry.services.ElementTypesListService;
+	
+	import flash.events.Event;
+	import flash.events.MouseEvent;
+	
+	import mx.binding.utils.ChangeWatcher;
+	import mx.collections.ArrayCollection;
+	import mx.containers.FormItem;
+	import mx.containers.FormItemDirection;
+	import mx.controls.Button;
+	import mx.controls.ComboBox;
+	import mx.controls.TextInput;
+	import mx.core.UIComponent;
+	import mx.events.ValidationResultEvent;
+	import mx.managers.PopUpManager;
+	import mx.validators.Validator;
+	
+	public class ValueSchemeInput extends FormItem implements CMDValidator {
+
+		private var textField:TextInput = new TextInput();
+		private var enumeration:ComboBox;
+		private var valueSchemeButton:Button = new Button();
+		private var _valueSchemeEnumeration:ArrayCollection;
+		private var _valueSchemePattern:String = "";
+		private var _valueSchemeSimple:String = "";
+		private var _validator:Validator = InputValidators.getIsRequiredValidator();
+		
+		[Bindable]
+		public  var elementTypesService:ElementTypesListService;
+		
+		public function ValueSchemeInput(name:String, required:Boolean = true) {
+			super();
+			direction = FormItemDirection.HORIZONTAL;
+			label = name;
+			styleName = StyleConstants.XMLBROWSER_FIELD;
+			createValueSchemeButton();
+			textField.styleName = StyleConstants.XMLEDITOR_EDIT_FIELD;
+			textField.width = 300;
+			textField.editable = false;
+			enumeration = createEnumeration();
+			elementTypesService = new ElementTypesListService();
+			elementTypesService.addEventListener(ElementTypesListService.ALLOWED_TYPES_LOADED, makeTypeEditPopUpHandler);	
+		}
+		
+		public static function makeValueSchemeInputFromValueScheme(valueScheme:ValueSchemeInterface):UIComponent{
+			var valueSchemeInput:ValueSchemeInput = new ValueSchemeInput(LabelConstants.VALUESCHEME); 
+			if (valueScheme.valueSchemeEnumeration == null) {
+				if (valueScheme.valueSchemePattern) {
+					valueSchemeInput.valueSchemePattern = valueScheme.valueSchemePattern;
+				} else {
+					valueSchemeInput.valueSchemeSimple = valueScheme.valueSchemeSimple;
+				}
+			} else {
+				valueSchemeInput.valueSchemeEnumeration = valueScheme.valueSchemeEnumeration;
+			}
+			
+			ChangeWatcher.watch(valueSchemeInput, "valueSchemeSimple", function(e:PropertyChangeEvent):void {
+				valueScheme.valueSchemeSimple = e.newValue as String;
+				valueScheme.valueSchemePattern = "";
+				valueScheme.valueSchemeEnumeration = null;
+			});
+			
+			ChangeWatcher.watch(valueSchemeInput, "valueSchemePattern", function(e:PropertyChangeEvent):void {
+				valueScheme.valueSchemePattern = e.newValue as String;
+				valueScheme.valueSchemeEnumeration = null;
+				valueScheme.valueSchemeSimple = "";
+			});
+			
+			ChangeWatcher.watch(valueSchemeInput, "valueSchemeEnumeration", function(e:PropertyChangeEvent):void {
+				valueScheme.valueSchemeEnumeration = e.newValue as ArrayCollection;
+				valueScheme.valueSchemeSimple = "";
+				valueScheme.valueSchemePattern = "";
+			});
+			
+			return valueSchemeInput;
+		}
+		
+		
+		protected override function createChildren():void {
+			super.createChildren();
+			addChild(valueSchemeButton);
+		}
+
+		[Bindable]
+		public function get valueSchemeSimple():String {
+			return _valueSchemeSimple;
+		}
+
+		public function set valueSchemeSimple(valueSchemeSimple:String):void {
+			_valueSchemeEnumeration = null
+			_valueSchemePattern = "";
+			_valueSchemeSimple = valueSchemeSimple
+			textField.text = valueSchemeSimple as String;
+			if (getChildren().length > 1) {
+				removeChildAt(0);
+			}
+			addChildAt(textField, 0);
+			_validator.listener = this.textField;
+		}
+
+		[Bindable]
+		public function get valueSchemePattern():String {
+			return _valueSchemePattern;
+		}
+
+		public function set valueSchemePattern(valueSchemePattern:String):void {
+			_valueSchemeEnumeration = null;
+			_valueSchemeSimple = "";
+			_valueSchemePattern = valueSchemePattern
+			textField.text = valueSchemePattern;
+			if (getChildren().length > 1) {
+				removeChildAt(0);
+			}
+			addChildAt(textField, 0);
+			_validator.listener = this.textField;
+		}
+
+		[Bindable]
+		public function get valueSchemeEnumeration():ArrayCollection {
+			return _valueSchemeEnumeration;
+		}
+
+		public function set valueSchemeEnumeration(valueScheme:ArrayCollection):void {
+			_valueSchemeEnumeration = valueScheme;
+			_valueSchemeSimple = "";
+			_valueSchemePattern = "";
+			if (getChildren().length > 1) {
+				removeChildAt(0);
+			}
+			enumeration = createEnumeration();
+			enumeration.dataProvider = valueScheme;
+			addChildAt(enumeration, 0);
+			_validator.listener = this.enumeration;
+		}
+
+		private function createEnumeration():ComboBox {
+			var result:ComboBox = XMLBrowserValueSchemeLine.createValueSchemeComboBox();
+			result.width = 300;
+			return result;
+
+		}
+
+		private function createValueSchemeButton():void {
+			valueSchemeButton.label = "Edit...";
+			valueSchemeButton.addEventListener(MouseEvent.CLICK, handleButtonClick);
+		}
+		
+
+		private function handleButtonClick(event:MouseEvent):void {
+			if (elementTypesService.allowedTypes == null) {
+				elementTypesService.load();
+			}
+			else { 
+				makeTypeEditPopUp();
+			}
+		}
+		
+		private function makeTypeEditPopUp():void {
+			var popup:ValueSchemePopUp = new ValueSchemePopUp();
+			popup.setParentValueScheme(this);
+			PopUpManager.addPopUp(popup, this.parent, false);
+		}
+		
+		private function makeTypeEditPopUpHandler(allowedTypesLoaded:Event):void {
+			makeTypeEditPopUp();
+		}
+
+		public function validate():Boolean {
+			var result:ValidationResultEvent;
+			if (_valueSchemeEnumeration == null) {
+				result = _validator.validate(this.textField.text);
+			} else {
+				result = _validator.validate(this.enumeration.dataProvider);
+			}
+			return result.type == ValidationResultEvent.VALID;
+		}
+		
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeItem.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeItem.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemeItem.as	(revision 5961)
@@ -0,0 +1,19 @@
+package clarin.cmdi.componentregistry.editor
+{
+    public class ValueSchemeItem
+    {
+        
+        public var item:String;
+        public var appInfo:String;
+        public var conceptLink:String;
+        
+    
+        public function ValueSchemeItem(item:String, appInfo:String, conceptLink:String)
+        {
+            this.item = item;
+            this.appInfo = appInfo;
+            this.conceptLink = conceptLink;
+        }
+
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemePopUp.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemePopUp.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/ValueSchemePopUp.mxml	(revision 5961)
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
+				showCloseButton="true"
+				close="cleanUp();"
+				creationComplete="PopUpManager.centerPopUp(this)"
+				title="Edit and choose a type"
+				xmlns:editor="clarin.cmdi.componentregistry.editor.*">
+
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.services.IsocatService;
+			
+			import mx.collections.ArrayCollection;
+			import mx.controls.TextInput;
+			import mx.core.Container;
+			import mx.managers.PopUpManager;
+			
+
+			
+			[Bindable]
+			public var valueSchemeInput:ValueSchemeInput;
+			
+			public static const DEFAULT_VALUE:String = "string";
+			
+			private var isocatPopup:IsocatSearchPopUp;
+			
+			public function setParentValueScheme(valueSchemeInputParent:ValueSchemeInput):void{
+				valueSchemeInput = valueSchemeInputParent;
+			}
+			
+			private function setType():void {
+				valueSchemeInput.valueSchemeSimple = (simpleValueSchemeBox.selectedItem == null) ? 
+					DEFAULT_VALUE : simpleValueSchemeBox.selectedItem.data;
+				cleanUp();
+			}
+
+			private function setPattern():void {
+				valueSchemeInput.valueSchemePattern = patternInput.text;
+				cleanUp();
+			}
+
+			private function setControlledVocabulary():void {
+				var enumeration:ArrayCollection = new ArrayCollection();
+				for (var i:int = 0; i < enumerationGrid.valueSchemeEnumeration.length - 1; i++) { //copy except the "Add new"
+					var item:ValueSchemeItem = enumerationGrid.valueSchemeEnumeration.getItemAt(i) as ValueSchemeItem;
+					enumeration.addItem(item);
+				}
+				valueSchemeInput.valueSchemeEnumeration = enumeration;
+				cleanUp();
+			}
+
+			private function cleanUp():void {
+				PopUpManager.removePopUp(this);
+			}
+
+			private function getIsocatPopup():IsocatSearchPopUp {
+				if (!isocatPopup) {
+					isocatPopup = EditorManager.getIsocatSearchPopUp(IsocatService.TYPE_SIMPLE);
+					isocatPopup.addEventListener(IsocatSearchPopUp.OK_EVENT, function(e:Event):void {
+							enumerationGrid.setConceptLink(isocatPopup.editField);
+						});
+				}
+				return isocatPopup;
+			}
+
+			private function handleIsocatButtonClick(event:MouseEvent):void {
+				PopUpManager.addPopUp(getIsocatPopup(), this, false);
+			}
+			
+			private function getInitialTab():Container {
+				if(valueSchemeInput != null){
+					if(valueSchemeInput.valueSchemeSimple) {
+						return typeTab;
+					}
+					if(valueSchemeInput.valueSchemeEnumeration) {
+						return cvTab;
+					}
+					if(valueSchemeInput.valueSchemePattern) {
+						return patternTab;
+					}
+				}
+				return typeTab;
+			}
+			
+		]]>
+	</mx:Script>
+
+	<mx:TabNavigator id="tabnav"
+					 width="100%"
+					 height="100%"
+					 color="0x323232"
+					 y="59"
+					 borderStyle="outset"
+					 resizeToContent="true"
+					 minWidth="400"
+					 minHeight="200"
+					 selectedChild="{getInitialTab()}"
+					 >
+	
+		<mx:VBox id="typeTab" label="Type"
+						width="100%" 
+						paddingLeft="5" paddingRight="5">	
+			<mx:Label text="Select type:"/>
+			<mx:HBox width="100%">
+				<mx:ComboBox id="simpleValueSchemeBox"
+							 selectedItem="{valueSchemeInput.valueSchemeSimple}"
+							 prompt="{valueSchemeInput.valueSchemeSimple}"
+							 dataProvider="{valueSchemeInput.elementTypesService.allowedTypes}">
+				</mx:ComboBox>
+				<mx:Spacer width="100%"/>
+				<mx:Button label="Use Type"
+						   click="setType()"/>
+			</mx:HBox>
+		</mx:VBox>
+	
+		<mx:VBox id="cvTab" label="Controlled vocabulary"
+						width="100%"
+						paddingLeft="5" paddingRight="5">
+		<!-- PD  TODO how should we implement open vocabularies?? -->
+		<mx:Label text="Create controlled vocabularies:"/>
+			<mx:HBox width="100%">
+				<editor:ValueSchemeEnumerationGrid id="enumerationGrid"
+												   creationComplete="enumerationGrid.initEnumeration(valueSchemeInput.valueSchemeEnumeration)"/>
+				<mx:VBox>
+					<mx:Button label="Use Controlled Vocabulary"
+							   click="setControlledVocabulary()"/>
+					<mx:Button label="Search in concept registry..."
+							   click="handleIsocatButtonClick(event)"
+							   enabled="{enumerationGrid.conceptLinkEdit}"/>
+				</mx:VBox>
+			</mx:HBox>
+		</mx:VBox>
+		
+		<mx:VBox id="patternTab" label="Pattern"
+				 width="100%"
+				 paddingLeft="5" paddingRight="5">
+			<mx:Label text="Enter pattern:"/>
+			<mx:HBox width="100%">
+				<mx:TextInput id="patternInput"
+							  text="{valueSchemeInput.valueSchemePattern}">
+					<!-- PD TODO how can I validate this -->
+				</mx:TextInput>
+				<mx:Spacer width="100%"/>
+				<mx:Button label="Use Pattern"
+						   click="setPattern()"/>
+			</mx:HBox>
+		</mx:VBox>
+		
+	</mx:TabNavigator>
+
+	<mx:HBox width="100%">
+		<mx:Spacer width="100%"/>
+		<mx:Button label="Cancel"
+				   click="cleanUp()"/>
+	</mx:HBox>
+</mx:TitleWindow>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/AttributeContainer.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/AttributeContainer.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/AttributeContainer.as	(revision 5961)
@@ -0,0 +1,9 @@
+package clarin.cmdi.componentregistry.editor.model
+{
+	import mx.collections.ArrayCollection;
+
+	public interface AttributeContainer
+	{
+		function getAttributeList():ArrayCollection;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDAttribute.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDAttribute.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDAttribute.as	(revision 5961)
@@ -0,0 +1,95 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import clarin.cmdi.componentregistry.common.ChangeTrackingCMDElement;
+	import clarin.cmdi.componentregistry.common.ComponentMD;
+	import clarin.cmdi.componentregistry.common.XmlAble;
+	import clarin.cmdi.componentregistry.editor.ValueSchemeItem;
+	import clarin.cmdi.componentregistry.editor.ValueSchemePopUp;
+	//import clarin.cmdi.componentregistry.editor.ValueSchemePopUpNew;
+	
+	import mx.collections.ArrayCollection;
+
+	public class CMDAttribute implements XmlAble, ValueSchemeInterface, ChangeTrackingCMDElement {
+		//No Attributes
+
+		//Elements
+		public var name:String;
+		private var type:String;
+		public var conceptLink:String;
+		private var _valueSchemePattern:String; //pattern
+		private var _valueSchemeEnumeration:ArrayCollection; // enumeration 
+		
+		private var changed:Boolean = false;
+		private var _changeTracking:Boolean = false;
+		
+		public function CMDAttribute() {
+		}
+
+		public static function createEmptyAttribute():CMDAttribute {
+			var result:CMDAttribute = new CMDAttribute();
+			result.valueSchemeSimple = ValueSchemePopUp.DEFAULT_VALUE;
+			return result;
+		}
+		
+		public function set changeTracking(value:Boolean):void{
+			_changeTracking = value;
+		}
+		
+		public function setChanged(value:Boolean):void {
+			if(_changeTracking) {
+				this.changed = value;
+			}
+		}
+		
+		public function get hasChanged():Boolean{
+			return changed;
+		}
+		
+		public function get valueSchemeSimple():String {
+			return this.type
+		}
+
+		public function set valueSchemeSimple(valueSchemeSimple:String):void {
+			this.type = valueSchemeSimple;
+			setChanged(true);
+		}
+
+		public function get valueSchemeEnumeration():ArrayCollection {
+			return this._valueSchemeEnumeration
+		}
+
+		public function set valueSchemeEnumeration(valueSchemeEnumeration:ArrayCollection):void {
+			this._valueSchemeEnumeration = valueSchemeEnumeration;
+			setChanged(true);
+		}
+
+		public function get valueSchemePattern():String {
+			return this._valueSchemePattern;
+		}
+
+		public function set valueSchemePattern(valueSchemePattern:String):void {
+			this._valueSchemePattern = valueSchemePattern;
+			setChanged(true);
+		}
+
+		public function toXml():XML {
+			var result:XML = <Attribute></Attribute>;
+			result.appendChild(<Name>{name}</Name>);
+			if (conceptLink) {
+				result.appendChild(<ConceptLink>{conceptLink}</ConceptLink>);
+			}
+			if (valueSchemePattern) {
+				result.appendChild(<ValueScheme><pattern>{valueSchemePattern}</pattern></ValueScheme>);
+			} else if (valueSchemeEnumeration) {
+				var enumerationScheme:XML = <enumeration></enumeration>;
+				for each (var item:ValueSchemeItem in valueSchemeEnumeration) {
+					enumerationScheme.appendChild(<item {ComponentMD.APP_INFO}={item.appInfo} {ComponentMD.CONCEPTLINK}={item.conceptLink}>{item.item}</item>);
+				}
+				result.appendChild(<ValueScheme>{enumerationScheme}</ValueScheme>);
+			} else {
+				result.appendChild(<Type>{type}</Type>);
+			}
+
+			return result
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDComponent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDComponent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDComponent.as	(revision 5961)
@@ -0,0 +1,186 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import clarin.cmdi.componentregistry.common.ChangeTrackingCMDElement;
+	import clarin.cmdi.componentregistry.common.XmlAble;
+	
+	import mx.collections.ArrayCollection;
+	import mx.events.CollectionEvent;
+	import mx.events.CollectionEventKind;
+
+	[Bindable]
+	public class CMDComponent implements XmlAble, AttributeContainer, ChangeTrackingCMDElement {
+
+		//Attributes
+		public var name:String;
+		public var componentId:String;
+		public var conceptLink:String;
+		public var filename:String;
+		public var cardinalityMin:String = "1";
+		public var cardinalityMax:String = "1";
+
+		//elements
+		public var attributeList:ArrayCollection = new ArrayCollection();
+		public var cmdElements:ArrayCollection = new ArrayCollection();
+		public var cmdComponents:ArrayCollection = new ArrayCollection();
+
+		private var changed:Boolean = false;
+		private var _changeTracking:Boolean = false;
+
+		public function CMDComponent() {
+			attributeList.addEventListener(CollectionEvent.COLLECTION_CHANGE, collectionChangedHandler);
+			cmdElements.addEventListener(CollectionEvent.COLLECTION_CHANGE, collectionChangedHandler);
+			cmdComponents.addEventListener(CollectionEvent.COLLECTION_CHANGE, collectionChangedHandler);
+		}
+
+		public static function createEmptyComponent():CMDComponent {
+			var result:CMDComponent = new CMDComponent();
+			return result;
+		}
+		
+		private function collectionChangedHandler(event:CollectionEvent):void {
+			if(event.kind == CollectionEventKind.ADD ||event.kind == CollectionEventKind.MOVE || event.kind == CollectionEventKind.REMOVE || event.kind == CollectionEventKind.REPLACE){
+				setChanged(true);
+			}
+			if(event.kind == CollectionEventKind.ADD){
+				for each(var item:ChangeTrackingCMDElement in event.items){
+					item.changeTracking = _changeTracking;
+				}
+			}
+		}
+		
+		public function set changeTracking(value:Boolean):void {
+			_changeTracking = value;
+			for each (var component:CMDComponent in cmdComponents){
+				component.changeTracking = value;
+			}
+			for each (var element:CMDComponentElement in cmdElements){
+				element.changeTracking = value;
+			}
+			for each (var attribute:CMDAttribute in attributeList){
+				attribute.changeTracking = value;
+			}
+		}
+		
+		public function setChanged(value:Boolean):void {
+			if(_changeTracking) {
+				this.changed = value;
+			}
+		}
+		
+		public function get hasChanged():Boolean{
+			if(changed){
+				return changed;
+			} else {
+				for each (var attriubte:CMDAttribute in attributeList){
+					if(attriubte.hasChanged){
+						return true;
+					}
+				}
+				for each (var element:CMDComponentElement in cmdElements){
+					if(element.hasChanged){
+						return true;
+					}
+				}
+				for each (var component:CMDComponent in cmdComponents){
+					if(component.hasChanged){
+						return true;
+					}
+				}
+			}
+			return false;
+		}
+
+		public function removeComponent(component:CMDComponent):void {
+			var index:int = cmdComponents.getItemIndex(component);
+			if (index != -1) {
+				cmdComponents.removeItemAt(index);
+				setChanged(true);
+			}
+		}
+
+		public function removeElement(element:CMDComponentElement):void {
+			var index:int = cmdElements.getItemIndex(element);
+			if (index != -1) {
+				cmdElements.removeItemAt(index);
+				setChanged(true);
+			}
+		}
+
+		public function moveDownElement(element:CMDComponentElement):Boolean {
+			var index:int = cmdElements.getItemIndex(element);
+			if (index < cmdElements.length - 1) {
+				cmdElements.removeItemAt(index);
+    			cmdElements.addItemAt(element, index + 1);
+				setChanged(true);
+    			return true;
+			}
+			return false;
+		}
+		
+		public function moveUpElement(element:CMDComponentElement):Boolean {
+			var index:int = cmdElements.getItemIndex(element);
+			if (index > 0) {
+				cmdElements.removeItemAt(index);
+    			cmdElements.addItemAt(element, index - 1);
+				setChanged(true);
+    			return true;
+			}
+			return false;
+		}
+		
+		public function moveDownComponent(comp:CMDComponent):Boolean {
+			var index:int = cmdComponents.getItemIndex(comp);
+			if (index < cmdComponents.length - 1) {
+				cmdComponents.removeItemAt(index);
+    			cmdComponents.addItemAt(comp, index + 1);
+				setChanged(true);
+    			return true;
+			}
+			return false;
+		}
+		
+		public function moveUpComponent(comp:CMDComponent):Boolean {
+			var index:int = cmdComponents.getItemIndex(comp);
+			if (index > 0) {
+				cmdComponents.removeItemAt(index);
+    			cmdComponents.addItemAt(comp, index - 1);
+				setChanged(true);
+    			return true;
+			}
+			return false;
+		}
+
+		public function toXml():XML {
+			var result:XML = <CMD_Component></CMD_Component>;
+			if (name)
+				result.@name = name;
+			if (componentId)
+				result.@ComponentId = componentId;
+			if (conceptLink)
+				result.@ConceptLink = conceptLink;
+			if (filename)
+				result.@filename = filename;
+			if (cardinalityMin)
+				result.@CardinalityMin = cardinalityMin;
+			if (cardinalityMax)
+				result.@CardinalityMax = cardinalityMax;
+			if (attributeList.length > 0) {
+				var attributeListTag:XML = <AttributeList></AttributeList>;
+				for each (var attribute:CMDAttribute in attributeList) {
+					attributeListTag.appendChild(attribute.toXml());
+				}
+				result.appendChild(attributeListTag);
+			}
+			for each (var element:CMDComponentElement in cmdElements) {
+				result.appendChild(element.toXml());
+			}
+			for each (var component:CMDComponent in cmdComponents) {
+				result.appendChild(component.toXml());
+			}
+			return result;
+		}
+		
+		public function getAttributeList():ArrayCollection {
+			return attributeList;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDComponentElement.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDComponentElement.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDComponentElement.as	(revision 5961)
@@ -0,0 +1,152 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import clarin.cmdi.componentregistry.common.ChangeTrackingCMDElement;
+	import clarin.cmdi.componentregistry.common.ComponentMD;
+	import clarin.cmdi.componentregistry.common.XmlAble;
+	import clarin.cmdi.componentregistry.editor.ValueSchemeItem;
+	import clarin.cmdi.componentregistry.editor.ValueSchemePopUp;
+	//import clarin.cmdi.componentregistry.editor.ValueSchemePopUpNew;
+	
+	import mx.collections.ArrayCollection;
+	import mx.events.CollectionEvent;
+	import mx.events.CollectionEventKind;
+	
+	[Bindable]
+	public class CMDComponentElement implements XmlAble, ValueSchemeInterface, AttributeContainer, ChangeTrackingCMDElement {
+		
+		//Attributes
+		public var name:String;
+		public var conceptLink:String;
+		public var documentation:String;
+		public var displayPriority:String;
+		public var multilingual:String;
+		private var _valueSchemeSimple:String;
+		public var cardinalityMin:String = "1";
+		public var cardinalityMax:String = "1";
+		
+		//elements
+		public var attributeList:ArrayCollection = new ArrayCollection();
+		private var _valueSchemeEnumeration:ArrayCollection;
+		private var _valueSchemePattern:String;
+		
+		private var changed:Boolean = false;
+		private var _changeTracking:Boolean = false;
+		
+		public function CMDComponentElement() {
+			attributeList.addEventListener(CollectionEvent.COLLECTION_CHANGE, collectionChangedHandler);
+		}
+		
+		public function set changeTracking(value:Boolean):void{
+			_changeTracking = value;
+			for each (var attribute:CMDAttribute in attributeList){
+				attribute.changeTracking = value;
+			}
+		}
+		
+		private function collectionChangedHandler(event:CollectionEvent):void {
+			if(event.kind == CollectionEventKind.ADD ||event.kind == CollectionEventKind.MOVE || event.kind == CollectionEventKind.REMOVE || event.kind == CollectionEventKind.REPLACE){ 
+				setChanged(true);
+			}
+			if(event.kind == CollectionEventKind.ADD){
+				for each(var item:ChangeTrackingCMDElement in event.items){
+					item.changeTracking = _changeTracking;
+				}
+			}
+		}
+		
+		public function setChanged(value:Boolean):void {
+			if(_changeTracking) {
+				this.changed = value;
+			}
+		}
+		
+		public function get hasChanged():Boolean{
+			if(changed){
+				return changed;
+			} else {
+				for each (var attribute:CMDAttribute in attributeList){
+					if(attribute.hasChanged){
+						return true;
+					}
+				}
+			}
+			return false;
+		}
+		
+		public static function createEmptyElement():CMDComponentElement {
+			var result:CMDComponentElement = new CMDComponentElement();
+			result.valueSchemeSimple = ValueSchemePopUp.DEFAULT_VALUE;
+			return result;
+		}
+		
+		
+		public function get valueSchemeSimple():String {
+			return this._valueSchemeSimple
+		}
+		
+		public function set valueSchemeSimple(valueSchemeSimple:String):void {
+			this._valueSchemeSimple = valueSchemeSimple;
+			setChanged(true);
+		}
+		
+		public function get valueSchemeEnumeration():ArrayCollection {
+			return this._valueSchemeEnumeration
+		}
+		
+		public function set valueSchemeEnumeration(valueSchemeEnumeration:ArrayCollection):void {
+			this._valueSchemeEnumeration = valueSchemeEnumeration;
+			setChanged(true);
+		}
+		
+		public function get valueSchemePattern():String {
+			return this._valueSchemePattern;
+		}
+		
+		public function set valueSchemePattern(valueSchemePattern:String):void {
+			this._valueSchemePattern = valueSchemePattern;
+			setChanged(true);
+		}
+		
+		public function toXml():XML {
+			var result:XML = <CMD_Element></CMD_Element>;
+			if (name)
+				result.@name = name;
+			if (conceptLink)
+				result.@ConceptLink = conceptLink;
+			if (documentation)
+				result.@Documentation = documentation;
+			if (displayPriority && displayPriority != "0")
+				result.@DisplayPriority = displayPriority;
+			if (valueSchemeSimple)
+				result.@ValueScheme = valueSchemeSimple;
+			if (cardinalityMin)
+				result.@CardinalityMin = cardinalityMin;
+			if (cardinalityMax)
+				result.@CardinalityMax = cardinalityMax;
+			if (multilingual != null)
+				result.@Multilingual = multilingual;
+			if (attributeList.length > 0) {
+				var attributeListTag:XML = <AttributeList></AttributeList>;
+				for each (var attribute:CMDAttribute in attributeList) {
+					attributeListTag.appendChild(attribute.toXml());
+				}
+				result.appendChild(attributeListTag);
+			}
+			if (valueSchemePattern) {
+				result.appendChild(<ValueScheme><pattern>{valueSchemePattern}</pattern></ValueScheme>)
+			}
+			if (valueSchemeEnumeration != null) {
+				var enumerationScheme:XML = <enumeration></enumeration>;
+				for each (var item:ValueSchemeItem in valueSchemeEnumeration) {
+					enumerationScheme.appendChild(<item {ComponentMD.APP_INFO}={item.appInfo} {ComponentMD.CONCEPTLINK}={item.conceptLink}>{item.item}</item>);
+				}
+				result.appendChild(<ValueScheme>{enumerationScheme}</ValueScheme>);
+			}
+			return result;
+		}
+		
+		public function getAttributeList():ArrayCollection {
+			return attributeList;
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDModelFactory.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDModelFactory.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDModelFactory.as	(revision 5961)
@@ -0,0 +1,118 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import clarin.cmdi.componentregistry.common.ComponentMD;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.editor.ValueSchemeItem;
+	
+	import mx.collections.ArrayCollection;
+	import mx.collections.XMLListCollection;
+
+	public final class CMDModelFactory {
+		public function CMDModelFactory() {
+		}
+
+		public static function createModel(xml:XML, description:ItemDescription):CMDSpec {
+			var result:CMDSpec = new CMDSpec(xml.@isProfile == "true");
+			result.headerName = xml.Header.Name;
+			result.headerId = xml.Header.ID;
+			result.headerDescription = xml.Header.Description;
+			result.groupName = description.groupName;
+			result.domainName = description.domainName;
+			var components:XMLList = xml.elements(ComponentMD.CMD_COMPONENT);
+			for each (var component:XML in components) {
+				var cmdComp:CMDComponent = createComponent(component);
+				result.cmdComponents.addItem(cmdComp);
+			}
+			return result;
+		}
+
+		private static function createComponent(xml:XML):CMDComponent {
+			var result:CMDComponent = new CMDComponent();
+			result.name = xml.@name;
+			result.componentId = xml.@ComponentId;
+			result.conceptLink = xml.@ConceptLink;
+			result.filename = xml.@filename;
+			if (xml.hasOwnProperty("@CardinalityMin"))
+				result.cardinalityMin = xml.@CardinalityMin;
+			if (xml.hasOwnProperty("@CardinalityMax"))
+				result.cardinalityMax = xml.@CardinalityMax;
+			result.attributeList = createAttributeList(xml);
+			var elements:XMLList = xml.elements(ComponentMD.CMD_ELEMENT);
+			for each (var element:XML in elements) {
+				var cmdElement:CMDComponentElement = createComponentElement(element);
+				result.cmdElements.addItem(cmdElement);
+			}
+			var components:XMLList = xml.elements(ComponentMD.CMD_COMPONENT);
+			for each (var component:XML in components) {
+				var cmdComponent:CMDComponent = createComponent(component);
+				result.cmdComponents.addItem(cmdComponent);
+			}
+			return result;
+		}
+
+		private static function createComponentElement(xml:XML):CMDComponentElement {
+			var result:CMDComponentElement = new CMDComponentElement();
+			result.name = xml.@name;
+			result.conceptLink = xml.@ConceptLink;
+			result.documentation = xml.@Documentation;
+			result.displayPriority = xml.@DisplayPriority;
+			if (xml.hasOwnProperty("@CardinalityMin"))
+				result.cardinalityMin = xml.@CardinalityMin;
+			if (xml.hasOwnProperty("@CardinalityMax"))
+				result.cardinalityMax = xml.@CardinalityMax;
+			if (xml.hasOwnProperty("@Multilingual"))
+				result.multilingual = xml.@Multilingual;
+			result.attributeList = createAttributeList(xml);
+			if (xml.hasOwnProperty(ComponentMD.VALUE_SCHEME)) {
+				if (xml.ValueScheme.hasOwnProperty(ComponentMD.PATTERN)) {
+					result.valueSchemePattern = xml.ValueScheme.pattern;
+				} else if (xml.ValueScheme.hasOwnProperty(ComponentMD.ENUMERATION)) {
+					var xmlList:XMLListCollection = new XMLListCollection(xml.ValueScheme.enumeration.*);
+					var valueSchemeItems:ArrayCollection = new ArrayCollection();
+					for each (var xml:XML in xmlList) {
+						valueSchemeItems.addItem(new ValueSchemeItem(String(xml.text()), String(xml.@AppInfo), String(xml.@ConceptLink)));
+					}
+					result.valueSchemeEnumeration = valueSchemeItems;
+				}
+			} else if (xml.hasOwnProperty("@ValueScheme")) {
+				result.valueSchemeSimple = xml.@ValueScheme;
+			} else {
+				result.valueSchemeSimple = "";
+			}
+			return result;
+		}
+
+		private static function createAttributeList(xml:XML):ArrayCollection {
+			var result:ArrayCollection = new ArrayCollection();
+			if (xml.hasOwnProperty(ComponentMD.ATTRIBUTE_LIST)) {
+				var attributes:XMLList = xml.AttributeList.descendants(ComponentMD.ATTRIBUTE);
+				for each (var attribute:XML in attributes) {
+					var cmdAttribute:CMDAttribute = createAttribute(attribute);
+					result.addItem(cmdAttribute);
+				}
+			}
+			return result;
+		}
+
+		private static function createAttribute(xml:XML):CMDAttribute {
+			var result:CMDAttribute = new CMDAttribute();
+			result.name = xml.Name;
+			result.conceptLink = xml.ConceptLink;
+			if (xml.hasOwnProperty(ComponentMD.TYPE)) {
+				result.valueSchemeSimple = xml.Type;
+			} else {
+				if (xml.ValueScheme.hasOwnProperty(ComponentMD.PATTERN)) {
+					result.valueSchemePattern = xml.ValueScheme.pattern;
+				} else if (xml.ValueScheme.hasOwnProperty(ComponentMD.ENUMERATION)) {
+					var xmlList:XMLListCollection = new XMLListCollection(xml.ValueScheme.enumeration.*);
+					var valueSchemeItems:ArrayCollection = new ArrayCollection();
+					for each (var xml:XML in xmlList) {
+						valueSchemeItems.addItem(new ValueSchemeItem(String(xml.text()), String(xml.@AppInfo), String(xml.@ConceptLink)));
+					}
+					result.valueSchemeEnumeration = valueSchemeItems;
+				}
+			}
+			return result;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDSpec.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDSpec.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/CMDSpec.as	(revision 5961)
@@ -0,0 +1,121 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import clarin.cmdi.componentregistry.common.ChangeTrackingCMDElement;
+	import clarin.cmdi.componentregistry.common.XmlAble;
+	
+	import mx.collections.ArrayCollection;
+	import mx.events.CollectionEvent;
+	import mx.events.CollectionEventKind;
+
+	[Bindable]
+	public class CMDSpec implements XmlAble, ChangeTrackingCMDElement {
+		//Attribute
+		public var isProfile:Boolean;
+
+		//Elements
+		public var headerName:String;
+		public var headerId:String;
+		public var headerDescription:String;
+		public var cmdComponents:ArrayCollection = new ArrayCollection();
+
+		public var groupName:String = ""; //Not in xml but stored in the description
+		private var _domainName:String = ""; //Not in xml but stored in the description
+		
+		private var changed:Boolean = false;
+		private var _changeTracking:Boolean = false;
+
+		public function CMDSpec(isProfile:Boolean) {
+			this.isProfile = isProfile;
+			cmdComponents.addEventListener(CollectionEvent.COLLECTION_CHANGE, collectionChangedHandler);
+		}
+		
+		
+		public function set changeTracking(value:Boolean):void {
+			_changeTracking = value;
+			for each (var component:CMDComponent in cmdComponents){
+				component.changeTracking = value;
+			}
+		}
+		
+		public function setChanged(value:Boolean):void {
+			if(_changeTracking) {
+				this.changed = value;
+			}
+		}
+		
+		public function get hasChanged():Boolean{
+			if(changed){
+				return changed;
+			} else {
+				for each (var component:CMDComponent in cmdComponents){
+					if(component.hasChanged){
+						return true;
+					}
+				}
+			}
+			return false;
+		}
+		
+		private function collectionChangedHandler(event:CollectionEvent):void {
+			if(event.kind == CollectionEventKind.ADD ||event.kind == CollectionEventKind.MOVE || event.kind == CollectionEventKind.REMOVE){ 
+				setChanged(true);
+			}
+			if(event.kind == CollectionEventKind.ADD){
+				for each(var item:ChangeTrackingCMDElement in event.items){
+					item.changeTracking = _changeTracking;
+				}
+			}
+		}
+
+		public function removeComponent(component:CMDComponent):void {
+			var index:int = cmdComponents.getItemIndex(component);
+			if (index != -1) {
+				cmdComponents.removeItemAt(index);
+				setChanged(true);
+			}
+		}
+
+		public function toXml():XML {
+			var result:XML = <CMD_ComponentSpec>
+					<Header>
+						<ID>{headerId}</ID>
+						<Name>{headerName}</Name>
+						<Description>{headerDescription}</Description>
+					</Header>
+				</CMD_ComponentSpec>;
+			result.@isProfile = isProfile;
+			for each (var component:CMDComponent in cmdComponents) {
+				result.appendChild(component.toXml());
+			}
+			return result;
+		}
+
+		public function get domainName():String {
+			return _domainName;
+		}
+
+		public function set domainName(domainName:String):void {
+			if (domainName) {
+				_domainName = domainName;
+			} else {
+				_domainName = "";
+			}
+			setChanged(true);
+		}
+
+		public static function createEmptyComponent():CMDSpec {
+			var result:CMDSpec = new CMDSpec(false);
+			var c:CMDComponent = CMDComponent.createEmptyComponent();
+			result.cmdComponents.addItem(c);
+			c.cmdElements.addItem(CMDComponentElement.createEmptyElement());
+			return result
+		}
+
+		public static function createEmptyProfile():CMDSpec {
+			var result:CMDSpec = new CMDSpec(true);
+			var c:CMDComponent = CMDComponent.createEmptyComponent();
+			result.cmdComponents.addItem(c);
+			c.cmdElements.addItem(CMDComponentElement.createEmptyElement());
+			return result
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/ValueSchemeInterface.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/ValueSchemeInterface.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/editor/model/ValueSchemeInterface.as	(revision 5961)
@@ -0,0 +1,17 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import mx.collections.ArrayCollection;
+
+	public interface ValueSchemeInterface {
+		function get valueSchemeSimple():String;
+		function set valueSchemeSimple(valueSchemeSimple:String):void;
+
+		/**
+		 * ArrayCollection of ValueSchemeItem's
+		 * */
+		function get valueSchemeEnumeration():ArrayCollection;
+		function set valueSchemeEnumeration(valueSchemeEnumeration:ArrayCollection):void;
+
+		function get valueSchemePattern():String;
+		function set valueSchemePattern(valueSchemePattern:String):void;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/FileLoadedEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/FileLoadedEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/FileLoadedEvent.as	(revision 5961)
@@ -0,0 +1,24 @@
+package clarin.cmdi.componentregistry.importer {
+	
+	import flash.events.Event;
+	import flash.net.FileReference;
+
+	public class FileLoadedEvent extends Event {
+		public static const FILE_LOADED:String = "fileLoaded";
+		private var _fileReference:FileReference;
+
+		public function FileLoadedEvent(fileReference:FileReference, bubbles:Boolean = false, cancelable:Boolean = false) {
+			super(FILE_LOADED, bubbles, cancelable);
+			_fileReference = fileReference;
+		}
+
+		public function get fileReference():FileReference {
+			return _fileReference;
+		}
+
+		override public function clone():Event {
+			return new FileLoadedEvent(_fileReference, bubbles, cancelable);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/Importer.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/Importer.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/Importer.mxml	(revision 5961)
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
+		   xmlns:local="clarin.cmdi.componentregistry.services.*"
+		   width="100%"
+		   height="100%"
+		   label="Import file"
+		   implements="clarin.cmdi.componentregistry.common.components.RegistryView"
+		   >
+
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.common.ComponentMD;
+			import clarin.cmdi.componentregistry.common.Credentials;
+			import clarin.cmdi.componentregistry.common.ItemDescription;
+			import clarin.cmdi.componentregistry.common.LabelConstants;
+			import clarin.cmdi.componentregistry.common.Profile;
+			import clarin.cmdi.componentregistry.common.components.RegistryViewStack;
+			import clarin.cmdi.componentregistry.editor.InputValidators;
+			import clarin.cmdi.componentregistry.services.Config;
+			
+			import mx.collections.ArrayCollection;
+			import mx.controls.Alert;
+			import mx.core.Application;
+			import mx.core.UIComponent;
+			import mx.events.ValidationResultEvent;
+			import mx.validators.Validator;
+
+			private var validators:ArrayCollection = new ArrayCollection();
+
+			[Bindable]
+			private var isProfile:Boolean = true;
+			[Bindable]
+			private var importTypeString:String = "";
+
+			private var loadedXML:XML;
+
+			private function submit(event:Event):void {
+				if (validate()) {
+					var item:ItemDescription = new ItemDescription();
+					item.description = description.text;
+					item.name = nameInput.text;
+					item.groupName = groupName.text;
+					if (domainName.selectedIndex != -1)
+						item.domainName = domainName.selectedItem.data;
+					item.isProfile = isProfile;
+					item.isPrivate = true; //We only allow import into workspace it can be published from there.
+					if (loadedXML) {
+						updateXMLFromFormFields(loadedXML);
+						uploadSrv.upload(UploadService.NEW, item, loadedXML.toXMLString());
+					} else {
+						// No loaded XML. Let the upload service try with file reference
+						uploadSrv.upload(UploadService.NEW, item);
+					}
+				}
+			}
+			
+			private function close():void{
+				var viewStack:RegistryViewStack = this.parent as RegistryViewStack;
+				viewStack.switchToBrowse(null);
+			}
+
+			private function validate():Boolean {
+				var result:Boolean = true;
+				for (var i:int; i < validators.length; i++) {
+					var val:Validator = validators.getItemAt(i) as Validator;
+					if (val.listener.visible) {
+						var event:ValidationResultEvent = val.validate();
+						if (event.type != ValidationResultEvent.VALID) {
+							result = false;
+						}
+					}
+				}
+				return result;
+			}
+
+			private function setIsProfile(isProfileValue:Boolean):void {
+				isProfile = isProfileValue;
+				if (isProfile) {
+					importTypeString = "Profile";
+				} else {
+					importTypeString = "Component";
+				}
+			}
+
+			private function registryChange(event:UploadCompleteEvent):void {
+				// Upload completed. Reset upload services and form
+				uploadSrv.reset();
+				clearForm();
+				// Browse to uploaded item
+				parentApplication.viewStack.switchToBrowse(event.itemDescription);
+			}
+
+			private function fileLoaded(event:FileLoadedEvent):void {
+				var data:ByteArray = event.fileReference.data;
+				if (data && data.bytesAvailable) {
+					try {
+						var utfBytes:String = data.readUTFBytes(data.length);
+						loadedXML = new XML(utfBytes);
+
+						// New file selected, clear all previous entries
+						clearForm();
+						// Set import type (profile or component) from attribute in XML
+						setImportTypeFromFile(loadedXML);
+						// Set name, description from values in XML
+						setFormFieldsFromFile(loadedXML);
+					} catch (error:Error) {
+						Alert.show("Could not read the selected file. Not a valid XML file?", "Error");
+						importTypeString = "Error";
+						trace("Error while reading loaded file " + event.fileReference.name);
+						return;
+					}
+				}
+			}
+
+			private function setImportTypeFromFile(resultXml:XML):void {
+				if (resultXml.hasOwnProperty("@isProfile")) {
+					setIsProfile(("true" == resultXml.@isProfile));
+				} else {
+					Alert.show("Unable to determine import type. Selected file may not be a valid component specification!", "Warning");
+					importTypeString = "Unknown";
+				}
+			}
+
+			private function setFormFieldsFromFile(resultXml:XML):void {
+				var header:XML = getHeaderXML(resultXml);
+				var component:XML = getComponentXML(resultXml);
+				if (header) {
+					description.text = header.Description;
+				}
+				if(component){
+					nameInput.text = component.@name;
+				}
+			}
+
+			private function updateXMLFromFormFields(xml:XML):void {
+				var header:XML = getHeaderXML(xml);
+				var component:XML = getComponentXML(xml);
+				if (header) {
+					header.Name = nameInput.text;
+					header.Description = description.text;
+				}
+				if(component){
+					component.@name = nameInput.text;
+				}
+			}
+
+			private function getHeaderXML(xml:XML):XML {
+				if (xml.hasOwnProperty("Header")) {
+					var nodes:XMLList = xml.Header;
+					if (nodes && nodes.length() > 0) {
+						return nodes[0];
+					}
+				}
+				return null;
+			}
+			
+			private function getComponentXML(xml:XML):XML {
+				if (xml.hasOwnProperty("CMD_Component")) {
+					var nodes:XMLList = xml.CMD_Component;
+					if (nodes && nodes.length() > 0) {
+						return nodes[0];
+					}
+				}
+				return null;
+			}
+
+			private function clearForm():void {
+				importTypeString = "";
+				nameInput.text = "";
+				description.text = "";
+				groupName.text = "";
+				domainName.selectedItem = null;
+
+				// Reset all error strings on components with validators, so previous validation error message don't show anymore
+				for (var i:int; i < validators.length; i++) {
+					var val:Validator = validators.getItemAt(i) as Validator;
+					if (val.listener.visible) {
+						(val.source as UIComponent).errorString = "";
+					}
+				}
+			}
+
+			private function registerNameValidator(event:Event):void {
+				var validator:Validator = InputValidators.getNameValidator();
+				validator.listener = event.currentTarget;
+				validator.source = event.currentTarget;
+				validator.property = "text";
+				validators.addItem(validator);
+			}
+
+			private function registerIsRequiredValidator(event:Event, source:Object = null):void {
+				var validator:Validator = InputValidators.getIsRequiredValidator();
+				validator.listener = event.currentTarget;
+				if (!source) {
+					validator.source = event.currentTarget;
+				} else {
+					validator.source = source;
+				}
+				validator.property = "text";
+				validators.addItem(validator);
+			}
+
+			public function getType():String {
+				return Config.VIEW_IMPORT;
+			}
+		]]>
+	</mx:Script>
+
+	<local:UploadService id="uploadSrv"
+						 loadBeforeUploading="true"
+						 fileLoaded="fileLoaded(event)"
+						 uploadComplete="registryChange(event)"/>
+	<mx:VBox>
+		
+		<mx:Form>
+			<mx:HBox>
+				<mx:Button label="Select xml..."
+						   id="btnSelect"
+						   click="uploadSrv.selectXmlFile(event)"
+						   creationComplete="registerIsRequiredValidator(event, txtSelectedFile)"/>
+				<mx:Text id="txtSelectedFile"
+						 text="{uploadSrv.selectedFile}"/>
+			</mx:HBox>
+
+			<mx:FormItem label="Type">
+				<mx:Label id="importType"
+						  width="300"
+						  text="{importTypeString}"/>
+			</mx:FormItem>
+			<mx:FormItem label="Name">
+				<mx:TextInput id="nameInput"
+							  width="300"
+							  creationComplete="registerNameValidator(event)"/>
+			</mx:FormItem>
+			<mx:FormItem label="Description">
+				<mx:TextArea id="description"
+							 width="300"
+							 height="120"
+							 creationComplete="registerIsRequiredValidator(event)"/>
+			</mx:FormItem>
+			<mx:FormItem label="Creator Name">
+				<mx:Text id="creatorName"
+						 width="300"
+						 text="{Credentials.instance.userName}"/>
+			</mx:FormItem>
+			<mx:FormItem label="Domain Name">
+				<mx:ComboBox id="domainName"
+							 selectedIndex="-1"
+							 prompt="{LabelConstants.DOMAIN_NAME_PROMPT}"
+							 dataProvider="{LabelConstants.DOMAIN_NAME_DATA}"/>
+			</mx:FormItem>
+			<mx:FormItem label="Group Name">
+				<mx:TextInput id="groupName"
+							  width="300"/>
+			</mx:FormItem>
+
+			<mx:HBox>
+				<mx:Button label="Submit"
+						   click="submit(event)"/>
+				<mx:Button label="Close"
+						   click="close()"/>				
+			</mx:HBox>
+			
+			<mx:ProgressBar id="uploadProgress"
+							label=""
+							mode="manual"
+							creationComplete="uploadSrv.init(uploadProgress)"
+							visible="false"/>
+		</mx:Form>
+
+		<mx:Text id="errorMessageField"
+				 text="{uploadSrv.message}"/>
+
+	</mx:VBox>
+
+</mx:Canvas>
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/UploadCompleteEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/UploadCompleteEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/importer/UploadCompleteEvent.as	(revision 5961)
@@ -0,0 +1,24 @@
+package clarin.cmdi.componentregistry.importer {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+
+	import flash.events.Event;
+
+	public class UploadCompleteEvent extends Event {
+		public static const UPLOAD_COMPLETE:String = "uploadComplete";
+		private var _itemDescription:ItemDescription;
+
+		public function UploadCompleteEvent(itemDescription:ItemDescription, bubbles:Boolean = false, cancelable:Boolean = false) {
+			super(UPLOAD_COMPLETE, bubbles, cancelable);
+			_itemDescription = itemDescription;
+		}
+
+		public function get itemDescription():ItemDescription {
+			return _itemDescription;
+		}
+
+		override public function clone():Event {
+			return new UploadCompleteEvent(_itemDescription, bubbles, cancelable);
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/BaseRemoteService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/BaseRemoteService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/BaseRemoteService.as	(revision 5961)
@@ -0,0 +1,70 @@
+package clarin.cmdi.componentregistry.services {
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	
+	import mx.controls.Alert;
+	import mx.messaging.messages.HTTPRequestMessage;
+	import mx.rpc.AsyncToken;
+	import mx.rpc.Responder;
+	import mx.rpc.events.FaultEvent;
+	import mx.rpc.events.ResultEvent;
+	import mx.rpc.http.HTTPService;
+	import mx.utils.StringUtil;
+	
+	import clarin.cmdi.componentregistry.services.remote.HttpServiceFactory;
+	import clarin.cmdi.componentregistry.services.remote.RemoteService;
+	
+/**
+ * Handles communication with any arbitrary XML backend service, implements error handling and dispatching of success events.
+ * Extending classes must override handleXmlResult.
+ * @author george.georgovassilis@mpi.nl
+ */
+	public class BaseRemoteService extends EventDispatcher {
+
+		protected var successEventName:String;
+		protected var readService:RemoteService;
+		
+		/**
+		 * Constructor
+		 * @param successEventName name of event that will be dispatched when the remote request succeeds
+		 */
+		public function BaseRemoteService(successEventName:String) {
+			readService = HttpServiceFactory.createRemoteService();
+			readService.setMethod(HTTPRequestMessage.GET_METHOD);
+			readService.setResultFormat(HTTPService.RESULT_FORMAT_E4X);
+			this.successEventName = successEventName;
+		}
+
+		/**
+		 * Send a remote request to a url
+		 * @param url URL to send request to
+		 */
+		protected function dispatchRequest(url:URI):void {
+			readService.setUrl(url);
+			var token:AsyncToken = readService.send();
+			token.addResponder(new Responder(this.requestCallbackOk, this.requestCallbackFailed));
+		}
+		
+		/**
+		 * Invoked with XML result from a successful service call. Extending services must override.
+		 */
+		protected function handleXmlResult(resultXml:XML):void{
+			throw new Error("Not implemented");
+		}
+		
+		protected function requestCallbackOk(resultEvent:ResultEvent):void {
+			var resultXml:XML = resultEvent.result as XML;
+			this.handleXmlResult(resultXml);
+			this.dispatchEvent(new Event(this.successEventName));
+			
+		}
+
+		protected function requestCallbackFailed(faultEvent:FaultEvent):void {
+			var errorMessage:String = StringUtil.substitute("Error in {0}: {1} - {2}", this, faultEvent.fault.faultString, faultEvent.fault.faultDetail);
+			Alert.show(errorMessage);
+		}
+	}
+}
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/BrowserService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/BrowserService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/BrowserService.as	(revision 5961)
@@ -0,0 +1,63 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import com.adobe.net.URI;
+	
+	import mx.collections.ArrayCollection;
+	import mx.controls.Alert;
+
+	public class BrowserService extends ComponentRegistryService {
+
+		/**
+		 * Typed ArrayCollection publicly available for outside code to bind to and watch.
+		 */
+		[Bindable]
+		[ArrayElementType("ItemDescription")]
+		public var itemDescriptions:ArrayCollection;
+		
+			
+		protected var registrySpace:RegistrySpace;
+		
+		public function BrowserService(successEvent:String, restUrl:URI, registrySpace_:RegistrySpace) {
+			super(successEvent, restUrl);
+			this.registrySpace = registrySpace_;
+		}
+		
+		[Bindable(event=REGISTRY_SPACE_TOGGLE_EVENT)]
+		public function setRegistrySpace(registrySpace_:RegistrySpace):void{
+			this.registrySpace = registrySpace_;
+		}
+		
+
+		// propagates to two child calsses: component and profile list services
+		override protected function dispatchRequest(url:URI):void {
+			var copy:URI = new URI();
+			copy.copyURI(url);
+			if (this.registrySpace.space) {
+				copy.setQueryValue(Config.REGISTRY_PARAM_SPACE, this.registrySpace.space);
+				if ((this.registrySpace.space) == Config.SPACE_GROUP) {
+					if (this.registrySpace.groupId == null || this.registrySpace.groupId == "") {
+						throw "Group Id is not given";
+					}
+					copy.setQueryValue(Config.REGISTRY_PARAM_GROUP_ID, this.registrySpace.groupId);
+				} 
+			} 
+			super.dispatchRequest(copy);
+		}
+		
+		/**
+		 * finds a component inside the currently loaded space
+		 */
+		public function findDescription(id:String):ItemDescription {
+			//look in the current space
+			//TODO: faster (hash)map based lookup?
+			for each (var item:ItemDescription in itemDescriptions) {
+				if (item.id == id) {
+					return item;
+				}
+			}
+			return null;
+		}
+	}
+}
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/CommentListService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/CommentListService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/CommentListService.as	(revision 5961)
@@ -0,0 +1,45 @@
+package clarin.cmdi.componentregistry.services {
+	import com.adobe.net.URI;
+	
+	import mx.collections.ArrayCollection;
+	
+	import clarin.cmdi.componentregistry.common.Comment;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	[Event(name="CommentsLoaded", type="flash.events.Event")]
+	public class CommentListService extends ComponentRegistryService {
+		public static const COMMENTS_LOADED:String = "CommentsLoaded";
+		private var itemDescription:ItemDescription;
+		
+		/**
+		 * Typed ArrayCollection publicly available for outside code to bind to and watch.
+		 */
+		[Bindable]
+		[ArrayElementType("Comment")]
+		public var comments:ArrayCollection;
+		
+		public function CommentListService(itemDescription:ItemDescription) {
+			var url:String;
+			if(itemDescription.isProfile){
+				url = Config.instance.getProfileCommentsPath(itemDescription.id);
+			} else{
+				url = Config.instance.getComponentCommentsPath(itemDescription.id);
+			}
+			super(COMMENTS_LOADED, new URI(url));
+			
+			this.itemDescription = itemDescription;
+		}
+		
+		override protected function handleXmlResult(resultXml:XML):void{
+			var nodes:XMLList = resultXml.comment;
+			
+			comments = new ArrayCollection();
+			for each (var node:XML in nodes) {
+				var comment:Comment = new Comment();
+				comment.create(node, itemDescription);
+				comments.addItem(comment);
+			}
+			comments.refresh();
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/CommentPostService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/CommentPostService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/CommentPostService.as	(revision 5961)
@@ -0,0 +1,139 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.common.Comment;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.HTTPStatusEvent;
+	import flash.events.IOErrorEvent;
+	import flash.events.ProgressEvent;
+	import flash.events.SecurityErrorEvent;
+	import flash.utils.ByteArray;
+	
+	import mx.managers.CursorManager;
+	
+	import ru.inspirit.net.MultipartURLLoader;
+	
+	[Event(name="postComplete", type="flash.events.Event")]
+	public class CommentPostService extends EventDispatcher{
+		
+		public static const POST_COMPLETE:String = "postComplete";
+		
+		public function CommentPostService() {
+		}
+		
+		[Bindable]
+		public var message:String = "";
+		
+		private var ml:MultipartURLLoader;
+		
+		private function createAndInitRequest():void {
+			CursorManager.setBusyCursor();
+			ml = new MultipartURLLoader();
+			ml.addEventListener(Event.COMPLETE, completeHandler);
+			ml.addEventListener(ProgressEvent.PROGRESS, progressHandler);
+			ml.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
+			ml.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+		}
+		
+		/**
+		 * submits a comment
+		 */
+		public function upload(comment:Comment, itemDescription:ItemDescription):void {
+			createAndInitRequest();
+			var uri:URI = createUri(comment, itemDescription);
+			submit(createByteArray(comment.toXml()), uri);
+		}
+		
+		private function createUri(comment:Comment, itemDescription:ItemDescription):URI {
+			var uri:URI = null;
+			if(itemDescription){
+				if (itemDescription.isProfile) {
+				uri = new URI(Config.instance.getProfileCommentsPath(itemDescription.id));
+				} else {
+				uri = new URI(Config.instance.getComponentCommentsPath(itemDescription.id));
+				}
+			} else{
+				return null;
+			}
+			
+			return uri;
+		}
+		
+		private function createByteArray(data:String):ByteArray {
+			var result:ByteArray = null;
+			if (data != null) {
+				result = new ByteArray();
+				result.writeUTFBytes(data);
+				result.position = 0;
+			}
+			return result
+		}
+		
+		private function submit(data:ByteArray, uri:URI):void {
+			message = "";
+			try {
+				ml.addFile(data, "comment.xml", "data");
+				ml.load(uri.toString());
+			} catch (error:Error) {
+				trace("Unable to post comment. Error: " + error);
+				CursorManager.removeBusyCursor();
+				throw error;
+			}
+		}
+		
+		private function completeHandler(event:Event):void {
+			uploadComplete();
+			var response:XML = new XML(ml.loader.data);
+			handleResponse(response);
+		}
+		
+		private function httpStatusHandler(event:HTTPStatusEvent):void {
+			if (event.status != 200) {
+				addToMessage("Server Failed to handle registration. Unexpected error, try again later. (httpstatus code was: " + event.status + ")\n");
+			}
+			CursorManager.removeBusyCursor();
+		}
+		
+		private function securityErrorHandler(event:SecurityErrorEvent):void {
+			addToMessage("Server Failed to handle registration. Unexpected error, try again later. (error: " + event.text + ")\n");
+			CursorManager.removeBusyCursor();
+		}
+		
+		private function progressHandler(event:ProgressEvent):void {
+			trace("Uploading: " + event.bytesLoaded + "/" + event.bytesTotal);
+		}
+		
+		private function startUploadHandler():void {
+			trace("uploading start");
+		}
+		
+		private function handleResponse(response:XML):void {
+			if (response.@registered == true) {
+				// TODO
+				dispatchEvent(new Event(POST_COMPLETE));
+			} else {
+				createErrorMessage(response);
+			}
+		}
+		
+		private function uploadComplete():void {
+			CursorManager.removeBusyCursor();
+		}
+		
+		private function createErrorMessage(response:XML):void {
+			addToMessage("Failed to register:");
+			var errors:XMLList = response.errors.error;
+			for each (var error:XML in errors) {
+				message += " - " + error.toString() + "\n";
+			}
+		}
+		
+		private function addToMessage(text:String):void {
+			message += text;
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentInfoService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentInfoService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentInfoService.as	(revision 5961)
@@ -0,0 +1,55 @@
+package clarin.cmdi.componentregistry.services {
+
+	import clarin.cmdi.componentregistry.common.Component;
+	import clarin.cmdi.componentregistry.common.ComponentMD;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import com.adobe.net.URI;
+	
+	import mx.controls.Alert;
+	
+	
+	[Event(name="ComponentLoaded", type="flash.events.Event")]
+	public class ComponentInfoService extends BaseRemoteService{
+		
+		public static const COMPONENT_LOADED:String="ComponentLoaded";
+
+		[Bindable]
+		public var component:Component;
+
+		public function ComponentInfoService() {
+			super(COMPONENT_LOADED);
+		}
+
+		public function load(item:ItemDescription):void {
+			this.component = new Component();
+			component.description = item;
+			var url:URI = new URI(item.dataUrl);
+			dispatchRequest(url);
+		}
+		
+		public function loadFromUrl(dataUrl:String):void {
+			var description:ItemDescription = new ItemDescription();
+			description.dataUrl = dataUrl;
+			// rest of description will be filled in when handling result
+			
+			load(description);
+		}
+
+		override protected function handleXmlResult(resultXml:XML):void {
+			var metaData:ComponentMD = new ComponentMD();
+			metaData.name = resultXml.CMD_Component.@name;
+			metaData.xml = resultXml;
+			component.componentMD = metaData;
+			
+			if(component.description.id == null) {
+				// was loaded from URL, not item - set available details
+				component.description.id = resultXml.Header.ID;
+				component.description.name = resultXml.Header.Name;
+				component.description.description = resultXml.Header.Description;
+			}
+		}
+
+	}
+}
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentListService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentListService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentListService.as	(revision 5961)
@@ -0,0 +1,36 @@
+package clarin.cmdi.componentregistry.services {
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	
+	import mx.collections.ArrayCollection;
+	
+	import clarin.cmdi.componentregistry.browser.BrowserColumns;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	public class ComponentListService extends BrowserService {
+		
+		public  const COMPONENTS_LOADED:String = "componentsLoaded";
+		
+		public function ComponentListService(registrySpace:RegistrySpace) {
+			super(COMPONENTS_LOADED, new URI(Config.instance.componentListUrl), registrySpace);
+		}
+		
+		override protected function handleXmlResult(resultXml:XML):void{
+			var nodes:XMLList = resultXml.componentDescription;
+			
+			var tempArray:ArrayCollection = new ArrayCollection();
+			for each (var node:XML in nodes) {
+				var item:ItemDescription = new ItemDescription();
+				var isPrivate:Boolean = (registrySpace.space == Config.SPACE_PRIVATE || registrySpace.space == Config.SPACE_GROUP);
+				item.createComponent(node, isPrivate);
+				tempArray.addItem(item);
+			}
+			tempArray.sort = BrowserColumns.getInitialSortForComponents();
+			tempArray.refresh();
+			itemDescriptions = new ArrayCollection(tempArray.toArray());
+			dispatchEvent(new Event(this.COMPONENTS_LOADED));
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentRegistryService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentRegistryService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentRegistryService.as	(revision 5961)
@@ -0,0 +1,58 @@
+package clarin.cmdi.componentregistry.services //trunk 
+{
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.services.remote.RemoteService;
+	
+	import com.adobe.net.URI;
+	
+	import mx.controls.Alert;
+	import mx.rpc.AsyncToken;
+	import mx.rpc.Responder;
+	import mx.rpc.http.HTTPService;
+	
+	public class ComponentRegistryService extends BaseRemoteService {
+		
+		protected var serviceUrl:URI;
+		
+		public function ComponentRegistryService(successEvent:String, serviceUrl:URI) {
+			super(successEvent);
+			this.serviceUrl = serviceUrl;
+		}
+		
+		
+		override protected function dispatchRequest(url:URI):void {
+			url.setQueryValue("unique", new Date().getTime().toString());
+			if (Config.instance.registrySpace != null) {
+				url.setQueryValue(Config.REGISTRY_PARAM_SPACE, Config.instance.registrySpace.space);
+				if (Config.instance.registrySpace.space==Config.SPACE_GROUP) {
+					url.setQueryValue(Config.REGISTRY_PARAM_GROUP_ID, Config.instance.registrySpace.groupId);
+				}
+			} else {
+				throw "Registry space is lost."
+			}
+			trace("Dispatching request to " + url.toDisplayString())
+			super.dispatchRequest(url);
+		}
+		
+		
+		
+		public function load():void {
+			dispatchRequest(serviceUrl);
+		}
+		
+		public function getComponent(componentId:String, callback:Function):void{
+			readService.setUrl(new URI(Config.instance.serviceRootUrl+Config.ITEMS_URL+"/"+componentId));
+			var token:AsyncToken = readService.send();
+			token.addResponder(new Responder(function(resultEvent):void{
+				var resultXml:XML = resultEvent.result as XML;
+				var item:ItemDescription = new ItemDescription();
+				item.createComponent(resultXml, "user");
+				//there's a problem (fixed in trunk): the return data class is an abstractDescription for which we don't know whether it's a component or profile (isProfile value is incorrect)
+				//but we can fix that one missing property here because we can know the flavour from its ID
+				item.isProfile = (componentId.indexOf(Config.PROFILE_PREFIX)==0);
+				callback(item);
+			}, this.requestCallbackFailed));
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentUsageCheckEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentUsageCheckEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentUsageCheckEvent.as	(revision 5961)
@@ -0,0 +1,31 @@
+package clarin.cmdi.componentregistry.services
+{
+	import flash.events.Event;
+	
+	import mx.collections.ArrayCollection;
+	
+	public class ComponentUsageCheckEvent extends Event
+	{	
+		public static const COMPONENT_IN_USE:String = "componentInUse";
+		private var _itemsUsingComponent:ArrayCollection;
+		
+		public function ComponentUsageCheckEvent(type:String, itemsUsingComponent:ArrayCollection, bubbles:Boolean = false, cancelable:Boolean = false)
+		{
+			super(type, bubbles, cancelable);
+			_itemsUsingComponent = itemsUsingComponent;
+		}
+		
+		private var _isComponentInUse:Boolean;
+		
+		public function get isComponentInUse():Boolean{
+			return _itemsUsingComponent != null && _itemsUsingComponent.length > 0;
+		}
+		
+		/**
+		 * Names of components that use the specified item
+		 */
+		public function get itemUsingComponent():ArrayCollection{
+			return _itemsUsingComponent;
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentUsageService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentUsageService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ComponentUsageService.as	(revision 5961)
@@ -0,0 +1,64 @@
+package clarin.cmdi.componentregistry.services
+{
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	
+	import mx.collections.ArrayCollection;
+	import mx.controls.Alert;
+	import mx.messaging.messages.HTTPRequestMessage;
+	import mx.rpc.AsyncToken;
+	import mx.rpc.Responder;
+	import mx.rpc.events.FaultEvent;
+	import mx.rpc.events.ResultEvent;
+	import mx.rpc.http.HTTPService;
+	import mx.utils.StringUtil;
+	
+	/**
+	 * Service that calls registry/components/usage/{id} for the specified component, which is used to check
+	 * whether the component is used by any other components or profiles in the same registry. 
+	 */
+	[Event(name="componentInUse", type="clarin.cmdi.componentregistry.services.ComponentUsageCheckEvent")]
+	public class ComponentUsageService extends EventDispatcher
+	{
+		private var service:HTTPService;
+		
+		public function ComponentUsageService(itemDescription:ItemDescription)
+		{
+			var url:URI = new URI(Config.instance.componentUsageUrl + itemDescription.id);			
+			service = new HTTPService();
+			service.url = url.toString();
+			service.method = HTTPRequestMessage.GET_METHOD;
+			service.resultFormat = HTTPService.RESULT_FORMAT_E4X;
+			service.showBusyCursor = true;
+		}
+				
+		public function checkUsage():void{
+			var token:AsyncToken = this.service.send();
+			token.addResponder(new Responder(result, fault));
+		}
+		
+		private function result(resultEvent:ResultEvent):void {
+			// Result contains list of items that use the specified component
+			var resultXml:XML = resultEvent.result as XML;
+			
+			// Collect item names so the view can show them to the user
+			var resultItems:ArrayCollection = new ArrayCollection();
+			for each (var description:XML in resultXml.children()) {
+				resultItems.addItem(description.name.toString());
+			}
+			
+			var event:ComponentUsageCheckEvent = new ComponentUsageCheckEvent(ComponentUsageCheckEvent.COMPONENT_IN_USE, resultItems);					
+			dispatchEvent(event);
+		}
+		
+		private function fault(faultEvent:FaultEvent):void {
+			var errorMessage:String = StringUtil.substitute("Error in {0}: \n Fault: {1} - {2}", this, faultEvent.fault.faultString, faultEvent.fault.faultDetail);
+			trace(errorMessage);
+			Alert.show("Internal Server error cannot process the data, try reloading the application.");
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/Config.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/Config.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/Config.as	(revision 5961)
@@ -0,0 +1,320 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.browser.GroupSelectionEvent;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.Profile;
+	
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	
+	import mx.controls.Alert;
+	import mx.controls.List;
+ 
+	[Event(name="registrySpaceToggle", type="flash.events.Event")]
+	public final class Config extends EventDispatcher {
+		public static const REGISTRY_SPACE_TOGGLE_EVENT:String = "registrySpaceToggle";
+
+		public static const CLARIN_REGISTER_URL:String = "http://www.clarin.eu/user/register";
+		public static const REGISTRY_PARAM_VIEW:String = "view";
+		public static const REGISTRY_PARAM_BROWSER_VIEW:String = "browserview";
+		public static const REGISTRY_PARAM_ITEM_ID:String = "itemId";
+		public static const REGISTRY_PARAM_SPACE:String = "registrySpace";
+		public static const REGISTRY_PARAM_DEBUG:String = "debug";
+		public static const REGISTRY_PARAM_GROUP_ID:String = "groupId"
+		
+		// REGISTRY_ID, COMPONENT_PREFIX, and PROFILE_PREFIX must be the same as on the server!
+		// REGISTRY_ID isdefined in ComponentRegistry
+		// COMPONENT_PREFIX is defined in ComponentDescription
+		// PROFILE_PREFIX is defined in ProfileDescription
+		private static const REGISTRY_ID:String="clarin.eu:cr1:";
+		public static const COMPONENT_PREFIX:String=REGISTRY_ID+"c_";
+		public static const PROFILE_PREFIX:String=REGISTRY_ID+"p_";
+		
+
+		//Possible views to start with.
+		public static const VIEW_BROWSE:String = "browse";
+		public static const VIEW_EDIT:String = "edit";
+		public static const VIEW_IMPORT:String = "import";
+		public static const FLAVOUR_PROFILES:String = "profiles";
+		public static const FLAVOUR_COMPONENTS:String = "components";
+		//Possible browser views to start with
+		public static const BROWSER_PANEL_VIEW:String = "view"; 
+		public static const BROWSER_PANEL_XML:String = "xml"; 
+		public static const BROWSER_PANEL_COMMENTS:String = "comments"; 
+		//Possible space to start with.
+		public static const SPACE_PRIVATE:String = "private";
+		public static const SPACE_PUBLISHED:String = "published";
+		public static const SPACE_GROUP:String = "group";
+		
+		public static const COMPONENT_LIST_URL:String = "/rest/registry/components";
+		public static const ITEMS_URL:String= "/rest/registry/items";
+		private static const PROFILE_LIST_URL:String = "/rest/registry/profiles";
+		private static const COMPONENT_USAGE_URL:String = "/rest/registry/components/usage/";
+		private static const UPLOAD_PROFILE_SERVICE_URL:String = "/rest/registry/profiles";
+		private static const UPLOAD_COMPONENT_SERVICE_URL:String = "/rest/registry/components";
+		private static const PROFILE_INFO_URL:String = "/rest/registry/profiles/";
+		private static const COMPONENT_INFO_URL:String = "/rest/registry/components/";
+		private static const PING_SESSION_URL:String = "/rest/registry/pingSession";
+		private static const USER_SETTINGS_URL:String = "/admin/userSettings";
+		private static const COMMENTS_URL_PATH:String = "/comments/";
+		private static const ISOCAT_SERVLET:String = "/ccr";
+		private static const USER_GROUPS_MEMBERSHIP_URL:String = "/rest/registry/groups/usermembership";
+		
+		
+		
+		public static var _instance:Config = new Config();
+		
+		
+		private var _startupItemId:String; //item to be selected at startup, can be specified as a url parameter
+		private var _serviceRootUrl:String = "http://localhost:8080/ComponentRegistry";
+		//Default _serviceRootUrl value can be useful for testing. Set the proper value in your (index.)html that embeds the flash object.
+		//Like this: "FlashVars", "serviceRootUrl=http://localhost:8080/ComponentRegistry"
+
+		private var _view:String = VIEW_BROWSE;
+		private var _browserPanel:String = BROWSER_PANEL_VIEW;
+		private var _registrySpace:RegistrySpace = new RegistrySpace(SPACE_PUBLISHED, "");
+		private var _debug:Boolean = false;
+		private var _activeFlavour:String = FLAVOUR_PROFILES;
+		
+		private var componentsSrv:ComponentListService;
+		private var publicComponentsSrv:ComponentListService;
+		private var profilesSrv:ProfileListService;
+		private var publicProfilesSrv:ProfileListService;
+		private var listUserGroupsMembershipService:ListUserGroupsMembershipService;
+		private var listGroupsOfItemService:ListGroupsOfItemService;
+		
+		public function Config() {
+			if (_instance != null) {
+				throw new Error("Config can only be accessed through Config.instance");
+			}
+		}
+		
+		public function get activeFlavour():String{
+			return _activeFlavour;
+		}
+		
+		public function set activeFlavour(value:String):void{
+			_activeFlavour = value;
+		}
+		
+		public static function get instance():Config {
+			return _instance;
+		}
+		
+		
+
+		private function init(applicationParameters:Object):void {
+			var serviceRootUrl_:String = applicationParameters.serviceRootUrl;
+			if (serviceRootUrl_) {
+				_serviceRootUrl = serviceRootUrl_;
+			}
+			var itemId:String = applicationParameters.itemId;
+			if (itemId) {
+				_startupItemId = itemId;
+			}
+			var view_:String = applicationParameters.view;
+			if (view_) {
+				_view = view_;
+			}
+			var browserPanel_:String = applicationParameters.browserview;
+			if(browserPanel_){
+				_browserPanel = browserPanel_;
+			}
+			
+			var space_:String = applicationParameters.registrySpace;
+			if (!space_) {
+				space_ = SPACE_PUBLISHED;
+			};
+			
+			var groupId_:String = applicationParameters.groupId;
+			if (!groupId_) {
+				groupId_ = "";
+			};
+			
+			var debug_:int = applicationParameters.debug;
+			if(debug_) {
+				_debug = Boolean(debug_);				
+			}
+									
+			listUserGroupsMembershipService = new ListUserGroupsMembershipService();
+			listGroupsOfItemService = new ListGroupsOfItemService();
+
+			publicProfilesSrv = new ProfileListService(new RegistrySpace(SPACE_PUBLISHED, ""));
+			publicComponentsSrv = new ComponentListService(new RegistrySpace(SPACE_PUBLISHED, ""))
+			
+			registrySpace = new RegistrySpace(space_, groupId_);
+		}
+		
+		public function getListUserGroupsMembershipService():ListUserGroupsMembershipService{
+			return listUserGroupsMembershipService;
+		}
+		
+		public function getCurrentProfilesSrv():ProfileListService{
+			return profilesSrv;		
+		}
+		
+		public function getPublicProfilesSrv():ProfileListService{
+			return publicProfilesSrv;		
+		}
+		
+		public function getCurrentComponentsSrv():ComponentListService{		
+			return componentsSrv;
+		}
+		
+		public function getPublicComponentsSrv():ComponentListService{
+			return publicComponentsSrv;
+		}
+		
+		public function getListGroupsOfItemService():ListGroupsOfItemService{
+			return listGroupsOfItemService;
+		}
+		
+		public static function create(applicationParameters:Object):void {
+			_instance.init(applicationParameters);
+		}
+
+		public function get profileListUrl():String {
+			return _serviceRootUrl + PROFILE_LIST_URL;
+		}
+
+		public function get componentListUrl():String {
+			return _serviceRootUrl + COMPONENT_LIST_URL;
+		}
+		
+		public function get componentUsageUrl():String {
+			return _serviceRootUrl + COMPONENT_USAGE_URL;
+		}
+
+		public function get profileInfoUrl():String {
+			return _serviceRootUrl + PROFILE_INFO_URL;
+		}
+		
+		public function getProfileCommentsPath(id:String):String{
+			return profileInfoUrl + id + COMMENTS_URL_PATH;
+		}
+
+		public function getGroupsOfItemPath(itemId:String):String{
+			return _serviceRootUrl + ITEMS_URL+"/"+itemId+"/groups";
+		}
+
+		
+		public function getListGroupsOfUserPath():String{
+			return _serviceRootUrl + USER_GROUPS_MEMBERSHIP_URL;
+		}
+
+		public function getComponentCommentsPath(id:String):String{
+			return componentInfoUrl + id + COMMENTS_URL_PATH;
+		}
+
+		public function get componentInfoUrl():String {
+			return _serviceRootUrl + COMPONENT_INFO_URL;
+		}
+
+		public function get uploadProfileUrl():String {
+			return _serviceRootUrl + UPLOAD_PROFILE_SERVICE_URL;
+		}
+
+		public function get uploadComponentUrl():String {
+			return _serviceRootUrl + UPLOAD_COMPONENT_SERVICE_URL;
+		}
+
+		public function get isocatSearchUrl():String {
+			return _serviceRootUrl + ISOCAT_SERVLET;
+		}
+
+		public function get serviceRootUrl():String {
+			return _serviceRootUrl;
+		}
+
+		public function get pingSessionUrl():String {
+			return _serviceRootUrl + PING_SESSION_URL;
+		}
+		
+		public function get userSettingsUrl():String{
+			return _serviceRootUrl + USER_SETTINGS_URL;
+		}
+		
+		public function getTransferItemOwnershipUrl(itemId:String,groupId:String):String{
+			return _serviceRootUrl + ITEMS_URL+"/"+itemId+"/transferownership?groupId="+groupId;
+		}
+
+		public function set registrySpace(registrySpace:RegistrySpace):void {
+			_registrySpace = registrySpace;
+			
+			if(registrySpace.space == SPACE_PUBLISHED) {
+				profilesSrv = publicProfilesSrv;
+				componentsSrv = publicComponentsSrv;
+			} else {
+				profilesSrv = new ProfileListService(registrySpace);			
+				componentsSrv = new ComponentListService(registrySpace);
+			}
+			
+			// everything is ready to open new componentBrowser instance
+			dispatchEvent(new Event(REGISTRY_SPACE_TOGGLE_EVENT));
+		}
+
+		public function get startupItem():String {
+			return _startupItemId;
+		}
+
+		public function get view():String {
+			return _view;
+		}
+		
+		public function get browserPanel():String {
+			return _browserPanel;
+		}
+
+		[Bindable(event=REGISTRY_SPACE_TOGGLE_EVENT)]
+		public function get registrySpace():RegistrySpace {
+			return _registrySpace;
+		}
+		
+		public function get debug():Boolean {
+			return _debug;
+		}
+
+		public static function getBookmarkUrl(item:ItemDescription):String {
+			var uri:URI = new URI(Config.instance.serviceRootUrl);	
+			uri.setQueryValue(REGISTRY_PARAM_SPACE, Config.instance.registrySpace.space);
+			if (Config.instance.registrySpace.space == SPACE_GROUP){
+				uri.setQueryValue(REGISTRY_PARAM_GROUP_ID, Config.instance.registrySpace.groupId);				
+			}
+		    uri.setQueryValue(REGISTRY_PARAM_ITEM_ID, item.id);
+			return uri.toString();
+		}
+		
+		public static function getRssUriDescriptions(typeOfDescription:String, registrySpace:RegistrySpace):String {
+			var baseUri:String = (new URI(Config.instance.serviceRootUrl)).toString();
+			var result:String=baseUri+"/rest/registry/"+typeOfDescription+"/rss";
+			if (registrySpace.space == Config.SPACE_PRIVATE) {
+				result = result + "?registrySpace=private";
+			}
+			if (registrySpace.space == Config.SPACE_GROUP) {
+				result = result + "?registrySpace=group&groupId="+registrySpace.groupId;
+			}
+			return result;
+		}
+		
+		public static function getRssUriComments(item:ItemDescription):String {
+			var baseUri:String = (new URI(Config.instance.serviceRootUrl)).toString();
+			var typeOfDescription:String; 
+			if (item.isProfile) {typeOfDescription="profiles/";}
+			else typeOfDescription="components/";
+			var result:String=baseUri+"/rest/registry/"+typeOfDescription+item.id+"/comments/rss";			
+			return result;
+		}
+		
+		public static function getXsdLink(item:ItemDescription):String {
+			var uri:URI = new URI(item.dataUrl+"/xsd");
+			return uri.toString();
+		}
+		
+		public static  function getUriAllowedElementTypes():String{
+			var baseUri:String = (new URI(Config.instance.serviceRootUrl)).toString();
+			return (baseUri+"/rest/registry/AllowedTypes");
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/DeleteService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/DeleteService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/DeleteService.as	(revision 5961)
@@ -0,0 +1,99 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.common.Comment;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	
+	import mx.controls.Alert;
+	import mx.managers.CursorManager;
+	import mx.messaging.messages.HTTPRequestMessage;
+	import mx.rpc.events.FaultEvent;
+	import mx.rpc.events.ResultEvent;
+	import mx.rpc.http.HTTPService;
+	import mx.utils.StringUtil;
+	
+	[Event(name="itemDeleted", type="flash.events.Event")]
+	
+	public class DeleteService extends EventDispatcher {
+		public const ITEM_DELETED:String = "itemDeleted";
+
+		private var service:HTTPService;
+		private const DELETE_METHOD:Object = {"method": "delete"};
+		
+		
+		public function DeleteService() {
+			service = new HTTPService();
+			service.addEventListener(FaultEvent.FAULT, handleError);
+			service.addEventListener(ResultEvent.RESULT, handleResult);
+			service.method = HTTPRequestMessage.POST_METHOD;
+		}
+		
+		
+		public function deleteItem(item:ItemDescription):void {
+			CursorManager.setBusyCursor();
+			
+			var deleteUrl:URI = new URI(item.dataUrl);
+			
+			if (item.isProfile) {
+				sendDelete(deleteUrl);
+				return;
+			}
+			
+			var usageService:ComponentUsageService = new ComponentUsageService(item);
+			usageService.addEventListener(ComponentUsageCheckEvent.COMPONENT_IN_USE, 
+				function (event:ComponentUsageCheckEvent):void{
+					if(event.isComponentInUse){
+						onComponentInUse(event);
+					} else {
+						sendDelete(deleteUrl);
+					}
+				});
+			usageService.checkUsage(); // dispatching the event
+		}
+		
+		public function onComponentInUse(event:ComponentUsageCheckEvent):void{
+			var messageBody:String = "The component cannot be deleted because it is used by the following component(s) and/or profile(s):\n\n";
+			for each(var name:String in event.itemUsingComponent){
+				messageBody += " - " + name + "\n";
+			}
+			CursorManager.removeBusyCursor();
+			Alert.show(messageBody,"Component is used");
+		}
+		
+		public function deleteComment(comment:Comment):void {
+			CursorManager.setBusyCursor();
+			var url:URI = new URI(comment.dataUrl);		
+			sendDelete(url);
+		}
+		
+		private function sendDelete(url:URI):void {
+			service.url = url.toString();
+			service.send(DELETE_METHOD);
+		}
+		
+		private function handleResult(resultEvent:ResultEvent):void {
+			CursorManager.removeBusyCursor();
+			if (resultEvent.statusCode >= 200 && resultEvent.statusCode < 300) {
+					dispatchEvent(new Event(ITEM_DELETED));
+			} else {
+				Alert.show("Unexpected error, server returned status: " + resultEvent.statusCode + "\n Message = ");
+			}
+		}
+		
+		public function handleError(faultEvent:FaultEvent):void {
+			CursorManager.removeBusyCursor();
+			if (faultEvent.statusCode == 401) { //Apparrently depending on browser status codes and errormessages are sometimes not passed along to flash.
+				Alert.show("Item not deleted. Authentication failed. " + faultEvent.message.body);
+			} else if (faultEvent.statusCode == 403) {
+				Alert.show("Item not deleted. Deletion not allowed. " + faultEvent.message.body);
+			} else {
+				Alert.show("Item not deleted: Item could be public or in the case of a component still referenced by other components/profiles.");
+			}
+		}
+		
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ElementTypesListService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ElementTypesListService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ElementTypesListService.as	(revision 5961)
@@ -0,0 +1,31 @@
+package clarin.cmdi.componentregistry.services //trunk
+{
+    
+    import com.adobe.net.URI;
+    
+    import mx.collections.ArrayCollection;
+	
+	public class ElementTypesListService extends ComponentRegistryService
+	{ 
+		[Bindable]
+		public var allowedTypes:ArrayCollection=null;
+		
+		public static const ALLOWED_TYPES_LOADED:String = "allowed_element_types_loaded"; 
+		
+		public function ElementTypesListService()
+		{ 
+		  super(ALLOWED_TYPES_LOADED, new URI(Config.getUriAllowedElementTypes()));
+		}
+		
+		
+		override protected function handleXmlResult(resultXml:XML):void{
+			allowedTypes= new ArrayCollection();
+			var currentValue:String;
+			for each (var description:XML in resultXml.children()) {
+				currentValue=description.valueOf().toString();
+				allowedTypes.addItem({label: currentValue, data: currentValue});
+			}
+		}
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/IsocatService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/IsocatService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/IsocatService.as	(revision 5961)
@@ -0,0 +1,55 @@
+package clarin.cmdi.componentregistry.services {
+	import com.adobe.net.URI;
+	
+	import mx.managers.CursorManager;
+	import mx.rpc.http.HTTPService;
+
+	public class IsocatService extends BaseRemoteService {
+		public static const PROFILE_LOADED:String = "ProfileLoaded";
+		public static const TYPE_SIMPLE:String = "simple";
+		public static const TYPE_COMPLEX:String = "complex";
+		public static const TYPE_CONTAINER:String = "container";
+		
+		namespace dcif = "http://www.isocat.org/ns/dcif";
+
+
+		private var service:HTTPService;
+
+		[Bindable]
+		public var searchResults:XMLList;
+
+		public function IsocatService() {
+			super(PROFILE_LOADED);
+		}
+
+        /**
+         * keyword to search for
+         * type can be one of IsocatService.TYPE_SIMPLE or IsocatService.TYPE_COMPLEX or null for all types
+         **/ 
+		public function load(keyword:String, type:String):void {
+			if (keyword) {
+				CursorManager.setBusyCursor();
+				var uri:URI = new URI(Config.instance.isocatSearchUrl);
+				uri.setQueryValue("keywords", keyword);
+				if (type)
+				    uri.setQueryValue("type", type);
+				dispatchRequest(uri);
+			}
+		}
+
+		public function close():void {
+			if (service) {
+				service.cancel();
+			}
+			CursorManager.removeBusyCursor();
+		}
+
+		override protected function handleXmlResult(result:XML):void {
+			CursorManager.removeBusyCursor();
+			searchResults = result.dcif::dataCategory;
+		}
+
+
+	}
+}
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ListGroupsOfItemService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ListGroupsOfItemService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ListGroupsOfItemService.as	(revision 5961)
@@ -0,0 +1,64 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.common.Group;
+	import clarin.cmdi.componentregistry.services.remote.HttpServiceFactory;
+	import clarin.cmdi.componentregistry.services.remote.RemoteService;
+	
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	
+	import mx.collections.ArrayCollection;
+	import mx.controls.Alert;
+	import mx.rpc.AsyncToken;
+	import mx.rpc.Responder;
+	import mx.rpc.events.ResultEvent;
+	import mx.rpc.http.HTTPService;
+
+/**
+ * Client connector to component registry group service functions
+ * @author george.georgovassilis@mpi.nl
+ */	
+	[Event(name="GroupsOfItemLoaded", type="flash.events.Event")]
+	public class ListGroupsOfItemService extends BaseRemoteService {
+		public static const GROUPS_LOADED:String = "GroupsOfItemLoaded";
+		
+		[Bindable]
+		[ArrayElementType("Group")]
+		public var groups:ArrayCollection;
+		protected var postService:HTTPService;
+		
+		public function ListGroupsOfItemService() {
+			super(GROUPS_LOADED);
+			postService = new HTTPService();
+			postService.method = "POST";
+		}
+
+		public function loadGroupsForItem(itemId:String):void{
+			groups = new ArrayCollection();
+			var url:String;
+			url = Config.instance.getGroupsOfItemPath(itemId);
+			dispatchRequest(new URI(url));
+		}
+		
+		override protected function handleXmlResult(resultXml:XML):void{
+			var nodes:XMLList = resultXml.group;
+			groups = new ArrayCollection();
+			for each (var node:XML in nodes) {
+				var group:Group = new Group();
+				group.create(node);
+				groups.addItem(group);
+			}
+			groups.refresh();
+		}
+
+		
+		public function transferOwnership(itemId:String, groupId:String, callback:Function):void{
+			postService.url = Config.instance.getTransferItemOwnershipUrl(itemId, groupId);
+			var parameters:Object = new Object();
+			parameters["groupId"] = groupId;
+			var token:AsyncToken = postService.send(parameters);
+			token.addResponder(new Responder(callback, this.requestCallbackFailed));
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ListUserGroupsMembershipService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ListUserGroupsMembershipService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ListUserGroupsMembershipService.as	(revision 5961)
@@ -0,0 +1,44 @@
+package clarin.cmdi.componentregistry.services {
+	import com.adobe.net.URI;
+	
+	import mx.collections.ArrayCollection;
+	
+	import clarin.cmdi.componentregistry.common.Group;
+	import mx.controls.Alert;
+
+/**
+ * Client connector to component registry group service functions
+ * @author george.georgovassilis@mpi.nl
+ */	
+	[Event(name="GroupsLoaded", type="flash.events.Event")]
+	public class ListUserGroupsMembershipService extends BaseRemoteService {
+		public static const GROUPS_LOADED:String = "GroupsLoaded";
+		
+		[Bindable]
+		[ArrayElementType("Group")]
+		public var groups:ArrayCollection;
+		
+		public function ListUserGroupsMembershipService() {
+			super(GROUPS_LOADED);
+		}
+
+		public function loadGroupsForUser():void{			
+			groups = new ArrayCollection();
+			var url:String;
+			url = Config.instance.getListGroupsOfUserPath();
+			dispatchRequest(new URI(url));
+			
+		}
+		
+		override protected function handleXmlResult(resultXml:XML):void{
+			var nodes:XMLList = resultXml.group;
+			groups = new ArrayCollection();
+			for each (var node:XML in nodes) {
+				var group:Group = new Group();
+				group.create(node);
+				groups.addItem(group);
+			}
+			groups.refresh();
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/PingSessionService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/PingSessionService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/PingSessionService.as	(revision 5961)
@@ -0,0 +1,64 @@
+package clarin.cmdi.componentregistry.services {
+
+	import com.adobe.net.URI;
+	
+	import flash.events.TimerEvent;
+	import flash.utils.Timer;
+	
+	import mx.controls.Alert;
+	import mx.messaging.messages.HTTPRequestMessage;
+	import mx.rpc.AsyncToken;
+	import mx.rpc.Responder;
+	import mx.rpc.events.FaultEvent;
+	import mx.rpc.events.ResultEvent;
+	import mx.rpc.http.HTTPService;
+	import mx.utils.StringUtil;
+	
+	import clarin.cmdi.componentregistry.common.Credentials;
+
+
+	public class PingSessionService extends BaseRemoteService{
+
+		[Bindable]
+		public var stillActive:Boolean
+
+		public static const INSTANCE:PingSessionService = new PingSessionService();
+        private static const PING_INTERVAL:int = 1000 * 60 * 5; //5 minutes
+		private var timer:Timer = new Timer(PING_INTERVAL, 0);
+
+		/**
+		 * Use INSTANCE field
+		 */
+		function PingSessionService() {
+			super("PingOk");
+		}
+
+		public function startPinging():void {
+			timer.addEventListener(TimerEvent.TIMER, timerHandler);
+			timer.start();
+		}
+
+		public function timerHandler(event:TimerEvent):void {
+			pingSession();
+		}
+
+		private function pingSession():void {
+		    if (Credentials.instance.isLoggedIn()) {
+				dispatchRequest(new URI(Config.instance.pingSessionUrl));
+		    }
+		}
+
+		override protected function handleXmlResult(resultXml:XML):void{
+			stillActive = resultXml.@stillActive == "true";
+			if (!stillActive) {
+			    Alert.show("Your session has expired, please reload the application to refresh the session.");
+			    timer.stop(); 
+			}
+		}
+
+		override protected function requestCallbackFailed(faultEvent:FaultEvent):void {
+			timer.stop(); // We stop to bother the user with more errors. Somethings is wrong user needs probably to reload which will start the timer again.
+			super.requestCallbackFailed(faultEvent);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ProfileInfoService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ProfileInfoService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ProfileInfoService.as	(revision 5961)
@@ -0,0 +1,44 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.common.ComponentMD;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.common.Profile;
+
+	import com.adobe.net.URI;
+
+	import mx.collections.ArrayCollection;
+
+	[Event(name="ProfileLoaded", type="flash.events.Event")]
+	public class ProfileInfoService extends BaseRemoteService {
+		public static const PROFILE_LOADED:String = "ProfileLoaded";
+
+		[Bindable]
+		public var profile:Profile;
+
+		public function ProfileInfoService() {
+			super(PROFILE_LOADED);
+		}
+
+		public function load(item:ItemDescription):void {
+			profile = new Profile();
+			profile.description = item;
+			var url:URI = new URI(item.dataUrl);			
+			super.dispatchRequest(url);
+		}
+		
+		override protected function handleXmlResult(resultXml:XML):void{
+			var nodes:XMLList = resultXml.CMD_Component;
+			
+			profile.nrOfComponents = nodes.length();
+			profile.profileSource = resultXml;
+			var tempArray:Array = new Array();
+			for each (var node:XML in nodes) {
+				var component:ComponentMD = new ComponentMD();
+				component.name = node.@name;
+				component.xml = node;
+				tempArray[tempArray.length] = component;
+			}
+			this.profile.components = new ArrayCollection(tempArray);
+		}
+	}
+}
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ProfileListService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ProfileListService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/ProfileListService.as	(revision 5961)
@@ -0,0 +1,31 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.browser.BrowserColumns;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import mx.collections.ArrayCollection;
+	import com.adobe.net.URI;
+	
+	
+	public class ProfileListService extends BrowserService {
+		
+		public const PROFILES_LOADED:String = "profilesLoaded";
+		
+		public function ProfileListService(registrySpace:RegistrySpace) {
+			super(PROFILES_LOADED, new URI(Config.instance.profileListUrl), registrySpace);
+		}
+		
+		override protected function handleXmlResult(resultXml:XML):void{
+			var nodes:XMLList = resultXml.profileDescription;
+			var tempArray:ArrayCollection = new ArrayCollection();
+			for each (var node:XML in nodes) {
+				var item:ItemDescription = new ItemDescription();
+				var isPrivate:Boolean = (registrySpace.space == Config.SPACE_PRIVATE || registrySpace.space == Config.SPACE_GROUP);
+				item.createProfile(node, isPrivate);
+				tempArray.addItem(item);
+			}
+			tempArray.sort = BrowserColumns.getInitialSortForProfiles();
+			tempArray.refresh();
+			itemDescriptions = new ArrayCollection(tempArray.toArray());
+		}		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/RegistrySpace.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/RegistrySpace.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/RegistrySpace.as	(revision 5961)
@@ -0,0 +1,19 @@
+package clarin.cmdi.componentregistry.services
+{
+	public class RegistrySpace
+	{
+		[Bindable(event=REGISTRY_SPACE_TOGGLE_EVENT)]
+		public var space:String ="";
+		
+		[Bindable(event=REGISTRY_SPACE_TOGGLE_EVENT)]
+		public var groupId:String ="";
+		
+		public function RegistrySpace(space:String, groupId:String)
+		{
+			this.space=space;
+			this.groupId= groupId
+		}
+		
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/SaveItemDialog.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/SaveItemDialog.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/SaveItemDialog.as	(revision 5961)
@@ -0,0 +1,30 @@
+package clarin.cmdi.componentregistry.services {
+
+	import flash.net.URLRequest;
+	import flash.net.navigateToURL;
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import com.adobe.net.URI;
+
+	public class SaveItemDialog {
+
+
+		public function SaveItemDialog() {
+		}
+
+		public function saveAsXML(item:ItemDescription):void {
+			save(item, "xml");
+		}
+
+		public function saveAsXSD(item:ItemDescription):void {
+			save(item, "xsd");
+		}
+
+		private function save(item:ItemDescription, extension:String, urlVariable:String = null):void {
+			var req:URLRequest = new URLRequest();
+			var url:URI = new URI(item.dataUrl + "/" + extension);
+			req.url = url.toString();
+			navigateToURL(req, "_top");
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/UploadService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/UploadService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/UploadService.as	(revision 5961)
@@ -0,0 +1,264 @@
+package clarin.cmdi.componentregistry.services {
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	import clarin.cmdi.componentregistry.importer.FileLoadedEvent;
+	import clarin.cmdi.componentregistry.importer.UploadCompleteEvent;
+	
+	import com.adobe.net.URI;
+	
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.HTTPStatusEvent;
+	import flash.events.IOErrorEvent;
+	import flash.events.ProgressEvent;
+	import flash.events.SecurityErrorEvent;
+	import flash.net.FileFilter;
+	import flash.net.FileReference;
+	import flash.net.URLVariables;
+	import flash.utils.ByteArray;
+	import mx.controls.Alert;
+
+	import mx.controls.ProgressBar;
+	import mx.managers.CursorManager;
+	
+	import ru.inspirit.net.MultipartURLLoader;
+
+	[Event(name="uploadComplete", type="clarin.cmdi.componentregistry.importer.UploadCompleteEvent")]
+	[Event(name="fileLoaded", type="clarin.cmdi.componentregistry.importer.FileLoadedEvent")]
+	public class UploadService extends EventDispatcher{
+
+		/**
+		 * Tries to Update the existing data (only valid for updating in private workspace)
+		 **/
+		public static const UPDATE:int = 0;
+		/**
+		 * Tries to create new data
+		 **/
+		public static const NEW:int = 1;
+		/**
+		 * Tries to publish existing private data to public workspace
+		 **/
+		public static const PUBLISH:int = 2;
+
+		public function UploadService() {
+		}
+
+		[Bindable]
+		public var selectedFile:String = "";
+		[Bindable]
+		public var message:String = "";
+
+		private var fileRef:FileReference;
+		private var pb:ProgressBar;
+		private var ml:MultipartURLLoader;
+		private var _loadBeforeUploading:Boolean = false;
+
+		public function set loadBeforeUploading(lbu:Boolean):void {
+			_loadBeforeUploading = lbu;
+		}
+
+		public function init(progressBar:ProgressBar):void {
+			pb = progressBar;
+		}
+
+		private function createAndInitRequest():void {
+			CursorManager.setBusyCursor();
+			ml = new MultipartURLLoader();
+			ml.addEventListener(Event.COMPLETE, completeHandler);
+			ml.addEventListener(ProgressEvent.PROGRESS, progressHandler);
+			ml.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
+			ml.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
+			ml.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+		}
+
+		private function createAndInitFileReference():void {
+			fileRef = new FileReference();
+			fileRef.addEventListener(Event.SELECT, selectHandler);
+
+			fileRef.addEventListener(ProgressEvent.PROGRESS, progressHandler);
+			fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+			fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
+
+			// If loading is enabled, register handler that will dispatch loadFile event
+			if (_loadBeforeUploading) {
+				fileRef.addEventListener(Event.COMPLETE, fileLoadedHandler);
+			}
+		}
+
+		/**
+		 * submits a profile/component, data parameter can be null which implies a file was selected using selectXmlFile();
+		 * An valid uploadAction must be one of UploadEvent.UPDATE, UploadEvent.NEW or UploadEvent.PUBLISH
+		 */
+		public function upload(uploadAction:int, description:ItemDescription, data:String = null):void {
+			createAndInitRequest();
+			var uri:URI = createUri(uploadAction, description);
+			submit(description, createByteArray(data), uri);
+		}
+
+		private function createUri(uploadAction:int, desc:ItemDescription):URI {
+			
+			var uri:URI = null;
+			var uriBase:String = Config.instance.uploadComponentUrl;
+			if (desc.isProfile) {
+				uriBase = Config.instance.uploadProfileUrl;
+			}
+			var action:int = uploadAction;
+			if (!desc.id) {
+				action = NEW;
+			}
+			switch (action) {
+				case UPDATE:
+					uri = new URI(uriBase + "/" + desc.id + "/update");					
+					break;
+				case NEW:
+					uri = new URI(uriBase);
+					break;
+				case PUBLISH:
+					uri = new URI(uriBase + "/" + desc.id + "/publish");
+					//never a user param for publish 
+					break;
+				default:
+					throw new Error("Invalid upload action " + uploadAction + ", upload cancelled.");
+			}
+			return uri;
+		}
+
+		private function createByteArray(data:String):ByteArray {
+			var result:ByteArray = null;
+			if (data != null) {
+				result = new ByteArray();
+				result.writeUTFBytes(data);
+				result.position = 0;
+			}
+			return result
+		}
+
+		private function submit(description:ItemDescription, data:ByteArray, uri:URI):void {
+			message = "";
+			try {
+				if (data != null) {
+					var params:URLVariables = new URLVariables();
+					ml.addVariable("description", description.description);
+					ml.addVariable("name", description.name);
+					ml.addVariable("domainName", description.domainName);
+					ml.addVariable("group", description.groupName);
+					ml.addFile(data, description.name + ".xml", "data");
+					ml.load(uri.toString());
+				} else {
+					// Cannot sent data that is not a file with FileReference.upload so just load the data and then submit through HttpClient.
+					// FileReference also does not handle authentication tokens.
+					startUploadHandler();
+					if (fileRef.data == null) {
+						//only load if not loaded before otherwise sent the already loaded file. You can only force a reload of the file by selecting it again (it is a flash thingy).
+						fileRef.addEventListener(Event.COMPLETE, function(event:Event):void {
+								submit(description, fileRef.data, uri);
+							});
+						fileRef.load();
+					} else {
+						submit(description, fileRef.data, uri);
+					}
+				}
+			} catch (error:Error) {
+				trace("Unable to upload file. Error: " + error);
+				CursorManager.removeBusyCursor();
+				throw error;
+			}
+		}
+		
+		/**
+		 * Resets upload service, removes any remaining file reference, unsets selected file, and makes progress invisible  
+		 **/
+		public function reset():void{
+			createAndInitFileReference();
+			selectedFile = "";
+			pb.visible = false;
+		}
+
+		public function selectXmlFile(event:Event):void {
+			createAndInitFileReference();
+			var filter:FileFilter = new FileFilter("Xml Files (*.xml)", "*.xml");
+			fileRef.browse(new Array(filter));
+		}
+
+		private function selectHandler(event:Event):void {
+			selectedFile = fileRef.name;
+			message = "";
+			pb.visible = false;
+			if (_loadBeforeUploading) {
+				fileRef.load();
+			}
+		}
+
+		private function fileLoadedHandler(event:Event):void {
+			dispatchEvent(new FileLoadedEvent(fileRef));
+		}
+
+		private function completeHandler(event:Event):void {
+			uploadComplete();
+			var response:XML = new XML(ml.loader.data);
+			handleResponse(response);
+		}
+
+		private function httpStatusHandler(event:HTTPStatusEvent):void {
+			if (event.status != 200) {
+				addToMessage("Server Failed to handle registration. Unexpected error, try again later. (httpstatus code was: " + event.status + ")\n");
+			}
+			CursorManager.removeBusyCursor();
+		}
+
+		private function securityErrorHandler(event:SecurityErrorEvent):void {
+			addToMessage("Server Failed to handle registration. Unexpected error, try again later. (error: " + event.text + ")\n");
+			CursorManager.removeBusyCursor();
+		}
+
+		private function ioErrorHandler(event:IOErrorEvent):void {
+			addToMessage("Unable to load file. (error: " + event.text + ")\n");
+			CursorManager.removeBusyCursor();
+		}
+
+		private function progressHandler(event:ProgressEvent):void {
+			trace("Uploading: " + event.bytesLoaded + "/" + event.bytesTotal);
+			pb.setProgress(event.bytesLoaded, event.bytesTotal);
+		}
+
+		private function startUploadHandler():void {
+			trace("uploading start");
+			pb.label = "uploading %3%%";
+			pb.visible = true;
+			pb.includeInLayout = true;
+		}
+
+		private function handleResponse(response:XML):void {
+			if (response.@registered == true) {
+				var item:ItemDescription = new ItemDescription();
+				var isPrivate:Boolean = response.@isPrivate == true;
+				if (response.@isProfile == true) {
+					item.createProfile(response.description[0], isPrivate);
+				} else {
+					item.createComponent(response.description[0], isPrivate);
+				}
+				dispatchEvent(new UploadCompleteEvent(item));
+			} else {
+				createErrorMessage(response);
+			}
+		}
+
+		private function uploadComplete():void {
+			pb.label = "Upload complete";
+			pb.setProgress(100, 100);
+			CursorManager.removeBusyCursor();
+		}
+
+		private function createErrorMessage(response:XML):void {
+			addToMessage("Failed to register:");
+			var errors:XMLList = response.errors.error;
+			for each (var error:XML in errors) {
+				message += " - " + error.toString() + "\n";
+			}
+		}
+
+		private function addToMessage(text:String):void {
+			message += text;
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/ClientServiceFactoryImpl.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/ClientServiceFactoryImpl.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/ClientServiceFactoryImpl.as	(revision 5961)
@@ -0,0 +1,15 @@
+package clarin.cmdi.componentregistry.services.remote
+{
+	public class ClientServiceFactoryImpl extends HttpServiceFactory
+	{
+		
+		public function ClientServiceFactoryImpl()
+		{
+			HttpServiceFactory.impl = this;
+		}
+		
+		override public function createNew():RemoteService{
+			return new RemoteServiceWrapper();
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/HttpServiceFactory.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/HttpServiceFactory.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/HttpServiceFactory.as	(revision 5961)
@@ -0,0 +1,25 @@
+package clarin.cmdi.componentregistry.services.remote
+{
+/**
+ * HttpService factory returns the right implementation of a RemoteService interface, which would typically be
+ * a ClientHttpService for a flex app running in the browser and a MockHttpService for an app running in a flexunit test
+ */
+	
+	public class HttpServiceFactory
+	{
+		
+		public static var impl:HttpServiceFactory;
+		
+		public static function createRemoteService():RemoteService{
+			if (impl == null)
+				impl = new ClientServiceFactoryImpl();
+			return impl.createNew();
+		}
+		
+		public function createNew():RemoteService{
+			if (impl == null)
+				impl = new ClientServiceFactoryImpl();
+			return impl.createNew();
+		};	
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/RemoteService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/RemoteService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/RemoteService.as	(revision 5961)
@@ -0,0 +1,14 @@
+package clarin.cmdi.componentregistry.services.remote
+{
+	import com.adobe.net.URI;
+	
+	import mx.rpc.AsyncToken;
+
+	public interface RemoteService
+	{
+		function setMethod(method:String):void;
+		function setResultFormat(format:String):void;
+		function setUrl(url:URI):void;
+		function send():AsyncToken;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/RemoteServiceWrapper.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/RemoteServiceWrapper.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/remote/RemoteServiceWrapper.as	(revision 5961)
@@ -0,0 +1,35 @@
+package clarin.cmdi.componentregistry.services.remote
+{
+	import com.adobe.net.URI;
+	
+	import mx.rpc.AsyncToken;
+	import mx.rpc.http.HTTPService;
+
+	public class RemoteServiceWrapper implements RemoteService
+	{
+		protected var service:HTTPService;
+		
+		public function RemoteServiceWrapper()
+		{
+			service = new HTTPService();
+		}
+		
+		
+		public function setMethod(method:String):void{
+			service.method = method;
+		};
+		
+		public function setResultFormat(format:String):void{
+			service.resultFormat = format;
+		};
+		
+		public function setUrl(url:URI):void{
+			service.url = url.toString();
+		};
+		
+		public function send():AsyncToken{
+			return service.send();
+		};
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/com/rictus/controls/SearchBox.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/com/rictus/controls/SearchBox.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/com/rictus/controls/SearchBox.as	(revision 5961)
@@ -0,0 +1,92 @@
+/*
+	Copyright (c) 2006 Narciso Jaramillo <nj_flex@rictus.com>
+	
+	Permission is hereby granted, free of charge, to any person obtaining
+	a copy of this software and associated documentation files (the "Software"),
+	to deal in the Software without restriction, including without limitation 
+	the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+	and/or sell copies of the Software, and to permit persons to whom the 
+	Software is furnished to do so, subject to the following conditions:
+	
+	The above copyright notice and this permission notice shall be included 
+	in all copies or substantial portions of the Software.
+	
+	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
+	OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 
+	IN THE SOFTWARE.
+*/
+
+package com.rictus.controls
+{
+	import mx.containers.HBox;
+	import mx.controls.Image;
+	import mx.controls.TextInput;
+	import flash.events.Event;
+	import flash.events.FocusEvent;
+
+	[Event(name="change", type="flash.events.Event")]
+	public class SearchBox extends HBox
+	{
+		[@Embed("assets/searchIcon.png")]
+		private const searchIcon: Class;
+		
+		private var _textInput: SelfLabelingTextInput;
+		private var _label: String;
+		
+		public function SearchBox() {}
+		
+		[Bindable]
+		public function get text(): String {
+			return _textInput.text;
+		}
+		public function set text(value: String): void {
+			_textInput.text = value;
+		}
+		
+		[Bindable]
+		override public function get label(): String {
+			return _label;
+		}
+		override public function set label(value: String): void {
+			_label = value;
+			if (_textInput != null) {
+				_textInput.label = value;
+			}
+		}
+
+		override protected function createChildren(): void {
+			super.createChildren();
+			
+			setStyle("borderStyle", "solid");
+			setStyle("backgroundColor", 0xffffff);
+			setStyle("horizontalGap", 0);
+			setStyle("paddingLeft", 3);
+			setStyle("paddingRight", 3);
+			setStyle("cornerRadius", 5);
+			setStyle("verticalAlign", "middle");
+			
+			var image: Image = new Image();
+			image.source = searchIcon;
+			addChild(image);
+			
+			_textInput = new SelfLabelingTextInput();
+			_textInput.setStyle("borderStyle", "none");
+			_textInput.setStyle("focusAlpha", 0);
+			_textInput.percentWidth = 100;
+			// This is a hack around the fact that we don't have baseline alignment.
+			// Without this, the text field doesn't center properly.
+			_textInput.height = 18;
+			_textInput.addEventListener(Event.CHANGE, handleTextChange);
+			_textInput.label = _label;
+			addChild(_textInput);
+		}
+		
+		private function handleTextChange(event: Event): void {
+			callLater(dispatchEvent, [new Event(Event.CHANGE)]);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/com/rictus/controls/SelfLabelingTextInput.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/com/rictus/controls/SelfLabelingTextInput.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/com/rictus/controls/SelfLabelingTextInput.as	(revision 5961)
@@ -0,0 +1,117 @@
+/*
+	Copyright (c) 2006 Narciso Jaramillo <nj_flex@rictus.com>
+	
+	Permission is hereby granted, free of charge, to any person obtaining
+	a copy of this software and associated documentation files (the "Software"),
+	to deal in the Software without restriction, including without limitation 
+	the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+	and/or sell copies of the Software, and to permit persons to whom the 
+	Software is furnished to do so, subject to the following conditions:
+	
+	The above copyright notice and this permission notice shall be included 
+	in all copies or substantial portions of the Software.
+	
+	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
+	OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 
+	IN THE SOFTWARE.
+*/
+
+package com.rictus.controls
+{
+	import mx.controls.TextInput;
+	import flash.events.FocusEvent;
+
+	/**
+	 * A text input that displays a gray label inside itself when it's empty.  When the user clicks in,
+	 * the label disappears.  If the user exits the field and leaves it empty, the label reappears.
+	 * 
+	 * TODO: get the label color from a style instead of hard-coding it.
+	 *
+	 * @author Narciso Jaramillo <nj_flex@rictus.com>
+	 */
+	 
+	public class SelfLabelingTextInput extends TextInput
+	{
+		private var _textIsEmpty: Boolean = true;
+		private var _label: String;
+		
+		public function SelfLabelingTextInput() {}
+		
+		/**
+		 * The label to display when the text field is empty.
+		 */
+		public function get label(): String {
+			return _label;
+		}
+		
+		public function set label(value: String): void {
+			_label = value;
+			toolTip = value;
+			updateContents();
+		}
+		
+		[Bindable]
+		override public function get text(): String {
+			if (_textIsEmpty) {
+				return "";
+			}
+			else {
+				return super.text;
+			}
+		}
+		
+		override public function set text(value: String): void {
+			if (value == "") {
+				_textIsEmpty = true;
+			}
+			else {
+				_textIsEmpty = false;
+				super.text = value;
+			}
+			updateContents();
+		}
+		
+		private function updateContents(): void {
+			if (_textIsEmpty) {
+				setStyle("color", 0xaaaaaa);
+				super.text = _label;
+			}
+			else {
+				setStyle("color", 0x000000);
+			}
+		}
+
+		
+		private function handleTextChange(event: Event): void {
+			if (super.text == "") {
+				_textIsEmpty = true;
+			}
+			else {
+				_textIsEmpty = false;
+			}
+		}
+		
+		private function handleFocusIn(event: FocusEvent): void {
+			if (_textIsEmpty) {
+				super.text = "";
+				setStyle("color", 0x000000);
+			}
+		}
+		
+		private function handleFocusOut(event: FocusEvent): void {
+			updateContents();
+		}
+		
+		override public function initialize(): void {
+			super.initialize();
+			addEventListener(Event.CHANGE, handleTextChange);
+			addEventListener(FocusEvent.FOCUS_IN, handleFocusIn);
+			addEventListener(FocusEvent.FOCUS_OUT, handleFocusOut);
+			updateContents();
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/main.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/main.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/main.mxml	(revision 5961)
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
+				xmlns:common="clarin.cmdi.componentregistry.common.components.*"
+				layout="absolute"
+				preinitialize="init();"
+				applicationComplete="appComplete();"
+				backgroundColor="#DDE3EF">
+	<mx:Style source="/assets/css/main.css"/>
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.common.AboutPopup;
+			import clarin.cmdi.componentregistry.common.Credentials;
+			import clarin.cmdi.componentregistry.common.components.HelpLabelButton;
+			import clarin.cmdi.componentregistry.services.Config;
+			import clarin.cmdi.componentregistry.services.PingSessionService;
+			import clarin.cmdi.componentregistry.services.RegistrySpace;
+			import clarin.cmdi.componentregistry.services.remote.ClientServiceFactoryImpl;
+			
+			import com.flexspy.FlexSpy;
+			
+			import mx.controls.Button;
+			import mx.managers.PopUpManager;
+			
+			import org.hasseg.externalMouseWheel.ExternalMouseWheelSupport;
+			
+			
+			private var sessionPinger:PingSessionService;
+			[Bindable]
+			private var aboutMenu:ContextMenu;
+			
+			private const bigPadding:int = 10;
+			private const padding:int = 5;
+			
+			private function init():void{
+				this.contextMenu = createMenu();
+				initializeInstances();
+			}
+			
+			private function initializeInstances():void {
+				Credentials.create(Application.application.parameters);
+				Config.create(Application.application.parameters);				
+			}
+			
+			private function createMenu():ContextMenu{
+				var menu:ContextMenu = new ContextMenu();
+				var item:ContextMenuItem = new ContextMenuItem("About Clarin Component Registry");
+				item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, showAbout);
+				menu.customItems = [item];
+				menu.hideBuiltInItems();
+				return menu;
+			}
+			
+			private function showAbout(event:ContextMenuEvent):void{
+				var aboutBox:AboutPopup = new AboutPopup();
+				aboutBox.x = appPanel.width/2 - aboutBox.width/2;
+				aboutBox.y = appPanel.height/2 - aboutBox.height/2;
+				PopUpManager.addPopUp(aboutBox, event.mouseTarget);
+			}
+			
+			private function appComplete():void {
+				ExternalMouseWheelSupport.getInstance(stage);
+				sessionPinger = PingSessionService.INSTANCE
+				sessionPinger.startPinging();
+				/* if (Credentials.instance.isLoggedIn() && (Config.instance.registrySpace.space == Config.SPACE_PRIVATE || Config.instance.registrySpace.space == Config.SPACE_GROUP)) {
+					Config.instance.registrySpace= new RegistrySpace(Config.SPACE_PRIVATE, "");
+				} */
+				viewStack.loadStartup();
+				
+				if(Config.instance.debug){
+					var flexSpyButton:Button = new Button();
+					flexSpyButton.label="FlexSpy";
+					flexSpyButton.addEventListener(MouseEvent.CLICK,showFlexSpy);
+					flexSpyButton.setStyle("right", appPanel.width/2);
+					flexSpyButton.setStyle("top", padding);
+					addChild(flexSpyButton);
+				}
+			}
+			
+			private function showFlexSpy(event:Event):void{
+				FlexSpy.show();
+			}
+			
+		]]>
+	</mx:Script>
+	
+	<mx:VBox id="appPanel"
+			 top="{bigPadding}" 
+			 left="{bigPadding}"
+			 bottom="{bigPadding}" 
+			 right="{bigPadding}"
+			 >
+		
+		<mx:HBox width="100%">
+			<mx:Label text="Clarin Component Registry" fontWeight="bold"/>
+			<mx:Spacer width="100%"/>
+		    <common:HelpLabelButton id="helpLink" paddingRight="{padding}" />
+		</mx:HBox>
+		
+		<mx:VBox verticalGap="0" height="100%" width="100%" >
+			
+			<mx:HBox width="100%" id="topBar" styleName="topBar" verticalAlign="middle">
+				<mx:Label width="20%" styleName="sectionTitle" paddingLeft="{padding}" text="{viewStack.selectedChild.label}" />
+				<mx:HBox width="80%" horizontalAlign="right" paddingRight="{padding}">					
+					<mx:Label text="User: {Credentials.instance.userName}"/>
+					<common:LoginLabelButton id="login" includeInLayout="{!Credentials.instance.isLoggedIn()}" visible="{!Credentials.instance.isLoggedIn()}" />
+					<common:UserSettingsLabelButton id="userSettings" includeInLayout="{Credentials.instance.isLoggedIn()}" visible="{Credentials.instance.isLoggedIn()}"/>
+				</mx:HBox>
+			</mx:HBox>
+			
+			<common:RegistryViewStack id="viewStack"
+									  borderStyle="none"
+									  height="100%"
+									  width="100%"
+									  />
+		</mx:VBox>	
+	</mx:VBox>
+</mx:Application>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/org/hasseg/externalMouseWheel/ExternalMouseWheelSupport.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/org/hasseg/externalMouseWheel/ExternalMouseWheelSupport.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/org/hasseg/externalMouseWheel/ExternalMouseWheelSupport.as	(revision 5961)
@@ -0,0 +1,478 @@
+﻿/*
+This code is licensed under the MIT License:
+
+Copyright (c) 2007 Ali Rantakari
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+package org.hasseg.externalMouseWheel
+{
+	
+	import flash.display.DisplayObject;
+	import flash.display.DisplayObjectContainer;
+	import flash.display.InteractiveObject;
+	import flash.display.Stage;
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.MouseEvent;
+	import flash.external.ExternalInterface;
+	import flash.geom.Point;
+	
+	
+	/**
+	* Implements mouse wheel support for OS X.
+	* This is done by catching mouse wheel events in JavaScript through the
+	* ExternalInterface, finding the topmost InteractiveObject under the mouse
+	* and making it dispatch the as MouseEvents. 
+	* 
+	* @author Ali Rantakari ( http://hasseg.org/blog ) - Feel free to use, given that this notice stays intact
+	* @author Pavel fljot ( http://inreflected.com ) - a couple of changes + pure AS3-projects support (v1.5)
+	*/
+	public final class ExternalMouseWheelSupport extends EventDispatcher
+	{
+		/*
+		* Purposefully non-AsDoc'd Changelog:
+		* 
+		* ---------------------------------------------------------------------------------
+		* VERSION 1.0 (Ali Rantakari)
+		* July 2007
+		* 
+		* - Initial implementation
+		* 
+		* 
+		* ---------------------------------------------------------------------------------
+		* VERSION 1.5 (Changes by Pavel fljot, http://inreflected.com)
+		* Jan 2008
+		* 
+		* 1. initialization by getInstance(stage:Stage) method, that gets reference to the Stage;
+		* 2. getAllInteractiveObjectsOnStage() is renamed to getMouseEnabledInteractiveObjectsOnStage()
+		*    and returns only objects that are really listening to the mouse at the moment;
+		* 3. added filtration into getRegisteredObjects() method for _manuallyRegisteredObjects
+		*    (for same purposes as getMouseEnabledInteractiveObjectsOnStage() ).
+		* 
+		* 
+		* ---------------------------------------------------------------------------------
+		* VERSION 2.0 (Changes by Ali Rantakari)
+		* Apr 2008
+		* 
+		* - Some minor code cleanup (both syntax & implementation -- tried to make
+		*   the code a bit more readable and clear)
+		* - Some minor fixes & additions in comments (for the same purpose as above)
+		* - Renamed some methods to better depict what they do
+		* - Removed try/catch block from initJSConnection() (formerly initialize()) in order to
+		*   let the errors be propagated onwards instead of hiding them in the log
+		* - Made getInstance() throw an error if the aStage parameter is null
+		* - Used flash.events.MouseEvent instead of our own mouse event class
+		*   (can't remember why I did that in the first place..?)
+		* - Added support for modifier keys (ctrl (i.e. command on a Mac,) alt, shift)
+		* - Added an another method for determining the InteractiveObject under mouse
+		*   to dispatch the wheel event, courtesy of pixelbreaker.com's solution. Also
+		*   added a property for selecting which one of these methods to use
+		* - Removed option for manual registration of objects (if one wants to exclude
+		*   an object from mouse events, they should use the mouseEnabled property)
+		* - Added property "initialized"
+		* 
+		*/
+		
+		
+		/**
+		* A possible value for <code>dispatchingObjectDeterminationMethod</code>.
+		* 
+		* @see #dispatchingObjectDeterminationMethod
+		*/
+		public static const COPY_MOUSEMOVE_EVENTS:uint = 0;
+		/**
+		* A possible value for <code>dispatchingObjectDeterminationMethod</code>.
+		* 
+		* @see #dispatchingObjectDeterminationMethod
+		*/
+		public static const TRAVERSE_DISPLAY_LIST:uint = 1;
+		
+		
+		private static var _stage:Stage;		
+		
+		private var _initialized:Boolean = false;
+		
+		private var _dispatchingObjectDeterminationMethod:uint = COPY_MOUSEMOVE_EVENTS; // default
+		private var _lastMoveEventTarget:InteractiveObject = null;
+		private var _lastMoveEventLocalCoords:Point = null;
+		
+		
+		
+		
+		
+		// BEGIN: singleton pattern implementation			----------------------------------------------------------- 
+		
+		private static var _INSTANCE:ExternalMouseWheelSupport = null;
+		
+		/**
+		* @private
+		*/
+		public function ExternalMouseWheelSupport(aSingletonEnforcer:SingletonEnforcer):void
+		{
+			if (_INSTANCE != null)
+			{
+				throw new Error("You can't create more than one instance of this class because it is a singleton. Use ExternalMouseWheelSupport.instance to get a handle to it.");
+			}
+			else
+			{
+				_lastMoveEventLocalCoords = new Point(0,0);
+				dispatchingObjectDeterminationMethod = _dispatchingObjectDeterminationMethod; // call setter to attach listener if applicable
+				initJSConnection();
+			}
+		}
+		
+		/**
+		* Returns the reference to the singleton instance of this class
+		* 
+		* @param aStage		Reference to the Stage object (required!)
+		* 
+		* @return			Reference to the singleton instance of this class
+		*/
+		public static function getInstance(aStage:Stage):ExternalMouseWheelSupport
+		{
+			if (aStage == null)
+				throw new Error("aStage property can not be null");
+			else
+			{
+				_stage = aStage;
+				if (_INSTANCE == null) _INSTANCE = new ExternalMouseWheelSupport(new SingletonEnforcer());
+				return _INSTANCE;
+			}
+		}
+		
+		// --end--: singleton pattern implementation		- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		// BEGIN: private methods			----------------------------------------------------------- 
+		
+		
+		// initialize the JavaScript connection:
+		// - add ExternalInterface callback so JavaScript can send us the wheel events
+		// - call the mw_initialize() JavaScript function
+		private function initJSConnection():void
+		{
+			if (ExternalInterface.available)
+			{
+				ExternalInterface.addCallback("dispatchExternalMouseWheelEvent", externalMouseWheelEventHandler);
+				_initialized = ExternalInterface.call("extMouseWheel.initCaptureFor", ExternalInterface.objectID);
+				dispatchEvent(new Event("initializedChanged"));
+			}
+		}
+		
+		
+		// handler for the calls coming from JavaScript
+		private function externalMouseWheelEventHandler(aDelta:int, aX:Number, aY:Number, aCtrlKey:Boolean, aAltKey:Boolean, aShiftKey:Boolean, aButtonDown:Boolean):void
+		{
+			var mouseEvent:MouseEvent;
+			
+			if (_dispatchingObjectDeterminationMethod == COPY_MOUSEMOVE_EVENTS)
+			{
+				if (_lastMoveEventTarget != null)
+				{
+					mouseEvent = 
+						new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false,
+										_lastMoveEventLocalCoords.x, _lastMoveEventLocalCoords.y,
+										null, //relatedObject -- doesn't apply here
+										aCtrlKey, aAltKey, aShiftKey, aButtonDown, aDelta);
+					_lastMoveEventTarget.dispatchEvent(mouseEvent);
+				}
+			}
+			else if (_dispatchingObjectDeterminationMethod == TRAVERSE_DISPLAY_LIST)
+			{
+				var iaObjs:Array = getMouseEnabledInteractiveObjectsOnStage();
+				
+				if (iaObjs.length > 0)
+				{
+					// see which ones pass a hittest with the mouse cursor
+					var hitTestObjs:Array = iaObjs.filter(function(aItem:*, aIndex:int, aArray:Array):Boolean {
+						return (aItem.hitTestPoint(aX,aY,true));
+					});
+					
+					// create array of hittest-passing objects and their levels in the displaylist
+					var rObjs:Array = getDisplayListLevelsFor(hitTestObjs);
+					
+					// see which ones of the remaining are highest in the displaylist
+					var highestLevel:uint = 0;
+					for (var m:uint = 0; m < rObjs.length; m++)
+					{
+						if (rObjs[m].level > highestLevel) highestLevel = rObjs[m].level;
+					}
+					var onTheHighestLevel:Array = rObjs.filter(function(aItem:*, aIndex:int, aArray:Array):Boolean {
+						return (aItem.level == highestLevel);
+					});
+					
+					// pick the last one from the ones that have the highest level
+					var highestInDisplayList:Object = {object:null, level:(-10000)};
+					for (var n:uint = 0; n < onTheHighestLevel.length; n++)
+					{
+						if (onTheHighestLevel[n].level > highestInDisplayList.level) highestInDisplayList = onTheHighestLevel[n];
+					}
+					
+					// make it dispatch a MouseEvent.MOUSE_WHEEL event
+					if (highestInDisplayList.object != null)
+					{
+						if (highestInDisplayList.object.dispatchEvent)
+						{
+							//var mouseEvent:ExternalMouseWheelEvent = new ExternalMouseWheelEvent(ExternalMouseWheelEvent.MOUSE_WHEEL, aDelta, aX, aY);
+							var localCoords:Point = highestInDisplayList.object.globalToLocal(new Point(aX, aY));
+							mouseEvent = 
+								new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false,
+												localCoords.x, localCoords.y,
+												null, //relatedObject -- doesn't apply here
+												aCtrlKey, aAltKey, aShiftKey, aButtonDown, aDelta);
+							highestInDisplayList.object.dispatchEvent(mouseEvent);
+						}
+					}
+				}
+			}
+		}
+		
+		
+		
+		// save topmost InteractiveObject on stage under mouse
+		private function stageMouseMoveHandler(event:MouseEvent):void
+		{
+			_lastMoveEventTarget = InteractiveObject(event.target);
+			_lastMoveEventLocalCoords.x = event.localX;
+			_lastMoveEventLocalCoords.y = event.localY;
+		}
+		
+		
+		
+		
+		
+		
+		
+		
+		/**
+		* Returns an array of Objects, specifying the display list levels
+		* for a specified array of DisplayObjects. The return Object will
+		* be in the following format:
+		* 
+		* <code>{object:<DisplayObject>, level:<uint>}</code>
+		* 
+		* @param aObjs		An array of DisplayObjects
+		* 
+		* @return			An array of Objects, containing the
+		*					objects and their levels in the DisplayList
+		*/
+		private function getDisplayListLevelsFor(aObjs:Array):Array
+		{
+			var objs:Array = new Array();
+			
+			if (aObjs.length > 0)
+			{
+				if (aObjs[0].stage != null)
+				{
+					objs = travelDisplayList(aObjs[0].stage);
+					var currLevel:uint = 0;
+					
+					function travelDisplayList(container:DisplayObjectContainer):Array
+					{
+						var retArr:Array = new Array();
+						var child:DisplayObject;
+						for (var i:uint=0; i < container.numChildren; i++)
+						{
+							currLevel++;
+							child = container.getChildAt(i);
+							if (aObjs.indexOf(child) != (-1)) retArr.push({object:child, level:currLevel});
+							if (container.getChildAt(i) is DisplayObjectContainer)
+							{
+								var grandChildren:Array = travelDisplayList(DisplayObjectContainer(child));
+								for (var j:uint = 0; j < grandChildren.length; j++)
+									retArr.push(grandChildren[j]);
+							}
+						}
+						return retArr;
+					}
+				}
+			}
+			
+			return objs;
+		}
+		
+		
+		
+		
+		// returns all the InteractiveObjects on stage that are able to
+		// dispatch mouse events
+		private function getMouseEnabledInteractiveObjectsOnStage():Array
+		{
+			var objs:Array = new Array();
+			
+			objs = travelDisplayList(_stage);
+			
+			function travelDisplayList(container:DisplayObjectContainer):Array
+			{
+				var retArr:Array = new Array();
+				var child:DisplayObject;
+				for (var i:uint=0; i < container.numChildren; i++)
+				{
+					child = container.getChildAt(i);
+					if (child is InteractiveObject)
+					{
+						if (!child.visible)
+							continue;
+						
+						if ((child as InteractiveObject).mouseEnabled)
+							retArr.push(child);
+						
+						// fljot: get children only if they are mouse-enabled. otherwise no need to scan them
+						if (child is DisplayObjectContainer && (child as DisplayObjectContainer).mouseChildren)
+						{
+							var grandChildren:Array = travelDisplayList(DisplayObjectContainer(child));
+							for (var j:uint = 0; j < grandChildren.length; j++)
+								retArr.push(grandChildren[j]);
+						}
+					}
+				}
+				return retArr;
+			}
+			
+			return objs;
+		}
+		
+		
+		
+		// checks whether a given object is "mouse-enabled" -- i.e. if it's supposed
+		// to be able to dispatch mouse events.
+		private function objectIsMouseEnabled(aObj:InteractiveObject, aCheckMouseEnabledProperty:Boolean = true):Boolean
+		{
+			var isEnabled:Boolean = true;
+			
+			if (!aObj.visible || (aCheckMouseEnabledProperty && !aObj.mouseEnabled))
+				isEnabled = false;
+			
+			if (isEnabled && aObj.parent)
+			{
+				// fljot: need to check parents if they are visible
+				if (!(aObj.parent as DisplayObjectContainer).mouseChildren)
+					isEnabled = false;
+				else
+					isEnabled = objectIsMouseEnabled(aObj.parent, false);
+			}
+			
+			return isEnabled;
+		}
+		
+		// --end--: private methods		- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		// BEGIN: public methods			----------------------------------------------------------- 
+		
+		
+		/**
+		* Specifies the method of determining the InteractiveObject that will
+		* be called to dispatch the external mouse wheel events received from
+		* JavaScript.
+		* 
+		* <p>The possible values are:</p>
+		* <table class="innertable">
+		* <tr>	<th>Constant to use</th><th>Description</th></tr>
+		* <tr>	<td>ExternalMouseWheelSupport.COPY_MOUSEMOVE_EVENTS</td>
+		* 		<td>
+		* 		With this method, a <code>mouseMove</code> event listener will be
+		* 		added to the Stage and the object to dispatch a mouse wheel
+		* 		event when one arrives via JavaScript will be the same one
+		* 		that was the target for the last such <code>mouseMove</code>
+		* 		event.
+		* 		</td></tr>
+		* <tr>	<td>ExternalMouseWheelSupport.TRAVERSE_DISPLAY_LIST</td>
+		* 		<td>
+		* 		With this method, each time a mouse wheel event arrives via
+		* 		JavaScript the object to dispatch the event will be determined
+		* 		by traversing the display list hierarchy and finding the
+		* 		topmost matching object under the mouse cursor.
+		* 		</td></tr>
+		* </table>
+		* 
+		* @see #COPY_MOUSEMOVE_EVENTS
+		* @see #TRAVERSE_DISPLAY_LIST
+		*/
+		public function get dispatchingObjectDeterminationMethod():uint
+		{
+			return _dispatchingObjectDeterminationMethod;
+		}
+		/**
+		* @private
+		*/
+		public function set dispatchingObjectDeterminationMethod(aVal:uint):void
+		{
+			if (aVal != COPY_MOUSEMOVE_EVENTS && aVal != TRAVERSE_DISPLAY_LIST)
+				return;
+			
+			if (aVal == COPY_MOUSEMOVE_EVENTS && _stage != null)
+				_stage.addEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler, false, 0, true);
+			else if (aVal == COPY_MOUSEMOVE_EVENTS && _stage != null)
+				_stage.removeEventListener(MouseEvent.MOUSE_MOVE, stageMouseMoveHandler, false);
+			
+			_dispatchingObjectDeterminationMethod = aVal;
+		}
+		
+		
+		
+		/**
+		* Whether or not the external mouse wheel support has been
+		* successfully initialized. Note that an unsuccessful initialization
+		* might mean that the support is simply not needed (i.e. if running
+		* in Windows Flash Player in a browser other than Safari.)
+		*/
+		[Bindable(event="initializedChanged")]
+		public function get initialized():Boolean
+		{
+			return _initialized;
+		}
+		
+		
+		
+		// --end--: public methods		- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+		
+		
+	}
+	
+	
+}
+
+class SingletonEnforcer {}
+
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/ru/inspirit/net/MultipartURLLoader.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/ru/inspirit/net/MultipartURLLoader.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/ru/inspirit/net/MultipartURLLoader.as	(revision 5961)
@@ -0,0 +1,591 @@
+﻿package ru.inspirit.net
+{
+	import flash.errors.IllegalOperationError;
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.HTTPStatusEvent;
+	import flash.events.IOErrorEvent;
+	import flash.events.ProgressEvent;
+	import flash.events.SecurityErrorEvent;
+	import flash.net.URLLoader;
+	import flash.net.URLLoaderDataFormat;
+	import flash.net.URLRequest;
+	import flash.net.URLRequestHeader;
+	import flash.net.URLRequestMethod;
+	import flash.utils.ByteArray;
+	import flash.utils.Dictionary;
+	import flash.utils.Endian;
+	import flash.utils.clearInterval;
+	import flash.utils.setTimeout;
+	
+	import ru.inspirit.net.events.MultipartURLLoaderEvent;
+
+	/**
+	 * Multipart URL Loader
+	 *
+	 * Original idea by Marston Development Studio - http://marstonstudio.com/?p=36
+	 *
+	 * History
+	 * 2009.01.15 version 1.0
+	 * Initial release
+	 *
+	 * 2009.01.19 version 1.1
+	 * Added options for MIME-types (default is application/octet-stream)
+	 *
+	 * 2009.01.20 version 1.2
+	 * Added clearVariables and clearFiles methods
+	 * Small code refactoring
+	 * Public methods documentaion
+	 *
+	 * 2009.02.09 version 1.2.1
+	 * Changed 'useWeakReference' to false (thanx to zlatko)
+	 * It appears that on some servers setting 'useWeakReference' to true
+	 * completely disables this event
+	 * 
+	 * 2009.03.05 version 1.3
+	 * Added Async property. Now you can prepare data asynchronous before sending it. 
+	 * It will prevent flash player from freezing while constructing request data.
+	 * You can specify the amount of bytes to write per iteration through BLOCK_SIZE static property.
+	 * Added events for asynchronous method.
+	 * Added dataFormat property for returned server data.
+	 * Removed 'Cache-Control' from headers and added custom requestHeaders array property.
+	 * Added getter for the URLLoader class used to send data.
+	 *
+	 * @author Eugene Zatepyakin
+	 * @version 1.3
+	 * @link http://blog.inspirit.ru/
+	 */
+	public class  MultipartURLLoader extends EventDispatcher
+	{
+		public static var BLOCK_SIZE:uint = 64 * 1024;
+		
+		private var _loader:URLLoader;
+		private var _boundary:String;
+		private var _variableNames:Array;
+		private var _fileNames:Array;
+		private var _variables:Dictionary;
+		private var _files:Dictionary;
+		
+		private var _async:Boolean = false;
+		private var _path:String;
+		private var _data:ByteArray;
+		
+		private var _prepared:Boolean = false;
+		private var asyncWriteTimeoutId:Number;
+		private var asyncFilePointer:uint = 0;
+		private var totalFilesSize:uint = 0;
+		private var writtenBytes:uint = 0;
+		
+		public var requestHeaders:Array;
+
+		public function MultipartURLLoader()
+		{
+			_fileNames = new Array();
+			_files = new Dictionary();
+			_variableNames = new Array();
+			_variables = new Dictionary();
+			_loader = new URLLoader();
+			requestHeaders = new Array();
+		}
+
+		/**
+		 * Start uploading data to specified path
+		 *
+		 * @param	path	The server script path
+		 * @param	async	Set to true if you are uploading huge amount of data
+		 */
+		public function load(path:String, async:Boolean = false):void
+		{
+			if (path == null || path == '') throw new IllegalOperationError('You cant load without specifing PATH');
+			
+			_path = path;
+			_async = async;
+			
+			if (_async) {
+				if(!_prepared){
+					constructPostDataAsync();
+				} else {
+					doSend();
+				}
+			} else {
+				_data = constructPostData();
+				doSend();
+			}
+		}
+		
+		/**
+		 * Start uploading data after async prepare
+		 */
+		public function startLoad():void
+		{
+			if ( _path == null || _path == '' || _async == false ) throw new IllegalOperationError('You can use this method only if loading asynchronous.');
+			if ( !_prepared && _async ) throw new IllegalOperationError('You should prepare data before sending when using asynchronous.');
+			
+			doSend();
+		}
+		
+		/**
+		 * Prepare data before sending (only if you use asynchronous)
+		 */
+		public function prepareData():void
+		{
+			constructPostDataAsync();
+		}
+
+		/**
+		 * Stop loader action
+		 */
+		public function close():void
+		{
+			try {
+				_loader.close();
+			} catch( e:Error ) { }
+		}
+
+		/**
+		 * Add string variable to loader
+		 * If you have already added variable with the same name it will be overwritten
+		 *
+		 * @param	name	Variable name
+		 * @param	value	Variable value
+		 */
+		public function addVariable(name:String, value:Object = ''):void
+		{
+			if (_variableNames.indexOf(name) == -1) {
+				_variableNames.push(name);
+			}
+			_variables[name] = value;
+			_prepared = false;
+		}
+
+		/**
+		 * Add file part to loader
+		 * If you have already added file with the same fileName it will be overwritten
+		 *
+		 * @param	fileContent	File content encoded to ByteArray
+		 * @param	fileName	Name of the file
+		 * @param	dataField	Name of the field containg file data
+		 * @param	contentType	MIME type of the uploading file
+		 */
+		public function addFile(fileContent:ByteArray, fileName:String, dataField:String = 'Filedata', contentType:String = 'application/octet-stream'):void
+		{
+			if (_fileNames.indexOf(fileName) == -1) {
+				_fileNames.push(fileName);
+				_files[fileName] = new FilePart(fileContent, fileName, dataField, contentType);
+				totalFilesSize += fileContent.length;
+			} else {
+				var f:FilePart = _files[fileName] as FilePart;
+				totalFilesSize -= f.fileContent.length;
+				f.fileContent = fileContent;
+				f.fileName = fileName;
+				f.dataField = dataField;
+				f.contentType = contentType;
+				totalFilesSize += fileContent.length;
+			}
+			
+			_prepared = false;
+		}
+
+		/**
+		 * Remove all variable parts
+		 */
+		public function clearVariables():void
+		{
+			_variableNames = new Array();
+			_variables = new Dictionary();
+			_prepared = false;
+		}
+
+		/**
+		 * Remove all file parts
+		 */
+		public function clearFiles():void
+		{
+			for each(var name:String in _fileNames)
+			{
+				(_files[name] as FilePart).dispose();
+			}
+			_fileNames = new Array();
+			_files = new Dictionary();
+			totalFilesSize = 0;
+			_prepared = false;
+		}
+
+		/**
+		 * Dispose all class instance objects
+		 */
+		public function dispose(): void
+		{
+			clearInterval(asyncWriteTimeoutId);
+			removeListener();
+			close();
+
+			_loader = null;
+			_boundary = null;
+			_variableNames = null;
+			_variables = null;
+			_fileNames = null;
+			_files = null;
+			requestHeaders = null;
+			_data = null;
+		}
+
+		/**
+		 * Generate random boundary
+		 * @return	Random boundary
+		 */
+		public function getBoundary():String
+		{
+			if (_boundary == null) {
+				_boundary = '';
+				for (var i:int = 0; i < 0x20; i++ ) {
+					_boundary += String.fromCharCode( int( 97 + Math.random() * 25 ) );
+				}
+			}
+			return _boundary;
+		}
+		
+		public function get ASYNC():Boolean
+		{
+			return _async;
+		}
+		
+		public function get PREPARED():Boolean
+		{
+			return _prepared;
+		}
+		
+		public function get dataFormat():String
+		{
+			return _loader.dataFormat;
+		}
+		
+		public function set dataFormat(format:String):void
+		{
+			if (format != URLLoaderDataFormat.BINARY && format != URLLoaderDataFormat.TEXT && format != URLLoaderDataFormat.VARIABLES) {
+				throw new IllegalOperationError('Illegal URLLoader Data Format');
+			}
+			_loader.dataFormat = format;
+		}
+		
+		public function get loader():URLLoader
+		{
+			return _loader;
+		}
+		
+		private function doSend():void
+		{
+			var urlRequest:URLRequest = new URLRequest();
+			urlRequest.url = _path;
+			
+			/*
+			* Change patdui (MPI).
+			* Set the contenttype in the request header otherwie we get an error like:
+            *   'SecurityError: Error #2176: Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press.'
+            * See for instance: http://stackoverflow.com/questions/1270347/unexpected-flash-security-exception-when-using-urlloader for the explanation and solution.
+			*/			
+			//urlRequest.contentType = 'multipart/form-data; boundary=' + getBoundary();
+            urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + getBoundary())); 
+
+			urlRequest.method = URLRequestMethod.POST;
+			urlRequest.data = _data;
+			
+			if (requestHeaders.length && requestHeaders != null){
+				urlRequest.requestHeaders = requestHeaders.concat();
+			}
+			
+			addListener();
+			_loader.load(urlRequest);
+		}
+		
+		private function constructPostDataAsync():void
+		{
+			clearInterval(asyncWriteTimeoutId);
+
+			_data = new ByteArray();
+			_data.endian = Endian.BIG_ENDIAN;
+			
+			_data = constructVariablesPart(_data);
+			
+			asyncFilePointer = 0;
+			writtenBytes = 0;
+			_prepared = false;
+			if (_fileNames.length) {
+				nextAsyncLoop();
+			} else {
+				_data = closeDataObject(_data);
+				_prepared = true;
+				dispatchEvent( new MultipartURLLoaderEvent(MultipartURLLoaderEvent.DATA_PREPARE_COMPLETE) );
+			}
+		}
+
+		private function constructPostData():ByteArray
+		{
+			var postData:ByteArray = new ByteArray();
+			postData.endian = Endian.BIG_ENDIAN;
+
+			postData = constructVariablesPart(postData);
+			postData = constructFilesPart(postData);
+			
+			postData = closeDataObject(postData);
+			
+			return postData;
+		}
+		
+		private function closeDataObject(postData:ByteArray):ByteArray
+		{
+			postData = BOUNDARY(postData);
+			postData = DOUBLEDASH(postData);
+			return postData;
+		}
+
+		private function constructVariablesPart(postData:ByteArray):ByteArray
+		{
+			var i:uint;
+			var bytes:String;
+
+			for each(var name:String in _variableNames)
+			{
+				postData = BOUNDARY(postData);
+				postData = LINEBREAK(postData);
+				bytes = 'Content-Disposition: form-data; name="' + name + '"';
+				for ( i = 0; i < bytes.length; i++ ) {
+					postData.writeByte( bytes.charCodeAt(i) );
+				}
+				postData = LINEBREAK(postData);
+				postData = LINEBREAK(postData);
+				postData.writeUTFBytes(_variables[name]);
+				postData = LINEBREAK(postData);
+			}
+
+			return postData;
+		}
+
+		private function constructFilesPart(postData:ByteArray):ByteArray
+		{
+			var i:uint;
+			var bytes:String;
+			
+			if(_fileNames.length){
+				for each(var name:String in _fileNames)
+				{
+					postData = getFilePartHeader(postData, _files[name] as FilePart);
+					postData = getFilePartData(postData, _files[name] as FilePart);
+					postData = LINEBREAK(postData);
+				}
+				postData = closeFilePartsData(postData);
+			}
+			
+			return postData;
+		}
+		
+		private function closeFilePartsData(postData:ByteArray):ByteArray
+		{
+			var i:uint;
+			var bytes:String;
+			
+			postData = LINEBREAK(postData);
+			postData = BOUNDARY(postData);
+			postData = LINEBREAK(postData);
+			bytes = 'Content-Disposition: form-data; name="Upload"';
+			for ( i = 0; i < bytes.length; i++ ) {
+				postData.writeByte( bytes.charCodeAt(i) );
+			}
+			postData = LINEBREAK(postData);
+			postData = LINEBREAK(postData);
+			bytes = 'Submit Query';
+			for ( i = 0; i < bytes.length; i++ ) {
+				postData.writeByte( bytes.charCodeAt(i) );
+			}
+			postData = LINEBREAK(postData);
+			
+			return postData;
+		}
+		
+		private function getFilePartHeader(postData:ByteArray, part:FilePart):ByteArray
+		{
+			var i:uint;
+			var bytes:String;
+
+			postData = BOUNDARY(postData);
+			postData = LINEBREAK(postData);
+			bytes = 'Content-Disposition: form-data; name="Filename"';
+			for ( i = 0; i < bytes.length; i++ ) {
+				postData.writeByte( bytes.charCodeAt(i) );
+			}
+			postData = LINEBREAK(postData);
+			postData = LINEBREAK(postData);
+			postData.writeUTFBytes(part.fileName);
+			postData = LINEBREAK(postData);
+
+			postData = BOUNDARY(postData);
+			postData = LINEBREAK(postData);
+			bytes = 'Content-Disposition: form-data; name="' + part.dataField + '"; filename="';
+			for ( i = 0; i < bytes.length; i++ ) {
+				postData.writeByte( bytes.charCodeAt(i) );
+			}
+			postData.writeUTFBytes(part.fileName);
+			postData = QUOTATIONMARK(postData);
+			postData = LINEBREAK(postData);
+			bytes = 'Content-Type: ' + part.contentType;
+			for ( i = 0; i < bytes.length; i++ ) {
+				postData.writeByte( bytes.charCodeAt(i) );
+			}
+			postData = LINEBREAK(postData);
+			postData = LINEBREAK(postData);
+			
+			return postData;
+		}
+
+		private function getFilePartData(postData:ByteArray, part:FilePart):ByteArray
+		{
+			postData.writeBytes(part.fileContent, 0, part.fileContent.length);
+			
+			return postData;
+		}
+
+		private function onProgress( event: ProgressEvent ): void
+		{
+			dispatchEvent( event );
+		}
+
+		private function onComplete( event: Event ): void
+		{
+			removeListener();
+			dispatchEvent( event );
+		}
+
+		private function onIOError( event: IOErrorEvent ): void
+		{
+			removeListener();
+			dispatchEvent( event );
+		}
+
+		private function onSecurityError( event: SecurityErrorEvent ): void
+		{
+			removeListener();
+			dispatchEvent( event );
+		}
+
+		private function onHTTPStatus( event: HTTPStatusEvent ): void
+		{
+			dispatchEvent( event );
+		}
+
+		private function addListener(): void
+		{
+			_loader.addEventListener( Event.COMPLETE, onComplete, false, 0, false );
+			_loader.addEventListener( ProgressEvent.PROGRESS, onProgress, false, 0, false );
+			_loader.addEventListener( IOErrorEvent.IO_ERROR, onIOError, false, 0, false );
+			_loader.addEventListener( HTTPStatusEvent.HTTP_STATUS, onHTTPStatus, false, 0, false );
+			_loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError, false, 0, false );
+		}
+
+		private function removeListener(): void
+		{
+			_loader.removeEventListener( Event.COMPLETE, onComplete );
+			_loader.removeEventListener( ProgressEvent.PROGRESS, onProgress );
+			_loader.removeEventListener( IOErrorEvent.IO_ERROR, onIOError );
+			_loader.removeEventListener( HTTPStatusEvent.HTTP_STATUS, onHTTPStatus );
+			_loader.removeEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );
+		}
+
+		private function BOUNDARY(p:ByteArray):ByteArray
+		{
+			var l:int = getBoundary().length;
+			p = DOUBLEDASH(p);
+			for (var i:int = 0; i < l; i++ ) {
+				p.writeByte( _boundary.charCodeAt( i ) );
+			}
+			return p;
+		}
+
+		private function LINEBREAK(p:ByteArray):ByteArray
+		{
+			p.writeShort(0x0d0a);
+			return p;
+		}
+
+		private function QUOTATIONMARK(p:ByteArray):ByteArray
+		{
+			p.writeByte(0x22);
+			return p;
+		}
+
+		private function DOUBLEDASH(p:ByteArray):ByteArray
+		{
+			p.writeShort(0x2d2d);
+			return p;
+		}
+		
+		private function nextAsyncLoop():void
+		{
+			var fp:FilePart;
+			
+			if (asyncFilePointer < _fileNames.length) {
+				
+				fp = _files[_fileNames[asyncFilePointer]] as FilePart;
+				_data = getFilePartHeader(_data, fp);
+				
+				asyncWriteTimeoutId = setTimeout(writeChunkLoop, 10, _data, fp.fileContent, 0);
+				
+				asyncFilePointer ++;
+			} else {
+				_data = closeFilePartsData(_data);
+				_data = closeDataObject(_data);
+				
+				_prepared = true;
+				
+				dispatchEvent( new MultipartURLLoaderEvent(MultipartURLLoaderEvent.DATA_PREPARE_PROGRESS, totalFilesSize, totalFilesSize) );
+				dispatchEvent( new MultipartURLLoaderEvent(MultipartURLLoaderEvent.DATA_PREPARE_COMPLETE) );
+			}
+		}
+		
+		private function writeChunkLoop(dest:ByteArray, data:ByteArray, p:uint = 0):void
+		{
+			var len:uint = Math.min(BLOCK_SIZE, data.length - p);
+			dest.writeBytes(data, p, len);
+			
+			if (len < BLOCK_SIZE || p + len >= data.length) {
+				// Finished writing file bytearray
+				dest = LINEBREAK(dest);
+				nextAsyncLoop();
+				return;
+			}
+			
+			p += len;
+			writtenBytes += len;
+			if ( writtenBytes % BLOCK_SIZE * 2 == 0 ) {
+				dispatchEvent( new MultipartURLLoaderEvent(MultipartURLLoaderEvent.DATA_PREPARE_PROGRESS, writtenBytes, totalFilesSize) );
+			}
+			
+			asyncWriteTimeoutId = setTimeout(writeChunkLoop, 10, dest, data, p);
+		}
+
+	}
+}
+
+internal class FilePart
+{
+
+	public var fileContent:flash.utils.ByteArray;
+	public var fileName:String;
+	public var dataField:String;
+	public var contentType:String;
+
+	public function FilePart(fileContent:flash.utils.ByteArray, fileName:String, dataField:String = 'Filedata', contentType:String = 'application/octet-stream')
+	{
+		this.fileContent = fileContent;
+		this.fileName = fileName;
+		this.dataField = dataField;
+		this.contentType = contentType;
+	}
+
+	public function dispose():void
+	{
+		fileContent = null;
+		fileName = null;
+		dataField = null;
+		contentType = null;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/ru/inspirit/net/events/MultipartURLLoaderEvent.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/ru/inspirit/net/events/MultipartURLLoaderEvent.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/flex/ru/inspirit/net/events/MultipartURLLoaderEvent.as	(revision 5961)
@@ -0,0 +1,27 @@
+﻿package ru.inspirit.net.events 
+{
+	import flash.events.Event;
+	
+	/**
+	 * MultipartURLLoader Event for async data prepare tracking
+	 * @author Eugene Zatepyakin
+	 */
+	public class MultipartURLLoaderEvent extends Event
+	{
+		public static const DATA_PREPARE_PROGRESS:String = 'dataPrepareProgress';
+		public static const DATA_PREPARE_COMPLETE:String = 'dataPrepareComplete';
+		
+		public var bytesWritten:uint = 0;
+		public var bytesTotal:uint = 0;
+		
+		public function MultipartURLLoaderEvent(type:String, w:uint = 0, t:uint = 0) 
+		{
+			super(type);
+			
+			bytesTotal = t;
+			bytesWritten = w;
+		}
+		
+	}
+	
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/resources/assets/css/main.css
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/resources/assets/css/main.css	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/main/resources/assets/css/main.css	(revision 5961)
@@ -0,0 +1,75 @@
+/* CSS file */
+Application {
+    font-family: Verdana, Arial, Helv, Helvetica, sans-serif, "_sans";
+}
+
+ToggleButtonBar {
+   buttonWidth: 120;
+   horizontalGap: -1;
+}
+
+.borderStyles {
+   borderStyle: solid;
+   borderThickness: 2;
+   borderColor: #009dff;
+   cornerRadius: 8;
+}
+
+.xmlBrowser {
+   borderStyle: none;
+   borderThickness: 0;
+   backgroundColor: #DDE3EF;
+   cornerRadius: 8;
+   dropShadowEnabled: true;
+   verticalGap: 1;
+   indicatorGap: 8;
+}
+
+.xmlBrowserHeader {
+    fontWeight: bold;
+}
+
+.xmlBrowserField {
+    fontWeight: normal;
+}
+
+.xmlBrowserValueLabel {
+    fontWeight: normal;
+}
+
+.xmlEditorFieldEditField {
+    borderStyle: solid;
+    borderColor: #ffffff;
+    borderThickness: 1;
+    cornerRadius: 3;
+    fontWeight: normal;
+}
+
+.xmlTextArea {
+   borderStyle: solid;
+   backgroundColor: #DDE3EF;
+   borderThickness: 1;
+   borderColor: #DDE3EF;
+   cornerRadius: 8;
+   dropShadowEnabled: true;
+}
+
+TitleWindow {
+   borderAlpha: 1;
+}
+
+.showInfoPageLabel {
+    fontWeight: bold;
+}
+
+.topBar{
+	backgroundColor: #DDE3EF;	
+}
+
+.sectionTitle {
+    fontWeight: bold;
+    fontSize: 18px;	
+}
+
+
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/FlexUnitApplication.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/FlexUnitApplication.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/FlexUnitApplication.mxml	(revision 5961)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- This is an auto generated file and is not intended for modification. -->
+
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
+				xmlns:flexui="flexunit.flexui.*"
+				minWidth="955" minHeight="600" creationComplete="onCreationComplete()"
+				layout="absolute">
+	<mx:Script>
+		<![CDATA[
+			import clarin.cmdi.componentregistry.editor.model.CMDAttributeTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDComponentElementTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDComponentTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDSpecTest;
+			import clarin.cmdi.componentregistry.services.ComponentInfoServiceTest;
+			
+			public function currentRunTestSuite():Array
+			{
+				var testsToRun:Array = new Array();
+				testsToRun.push(clarin.cmdi.componentregistry.editor.model.CMDAttributeTest);
+				testsToRun.push(clarin.cmdi.componentregistry.editor.model.CMDComponentElementTest);
+				testsToRun.push(clarin.cmdi.componentregistry.editor.model.CMDComponentTest);
+				testsToRun.push(clarin.cmdi.componentregistry.editor.model.CMDSpecTest);
+				testsToRun.push(clarin.cmdi.componentregistry.services.ComponentInfoServiceTest);
+				return testsToRun;
+			}
+			
+			
+			private function onCreationComplete():void
+			{
+				testRunner.runWithFlexUnit4Runner(currentRunTestSuite(), "ComponentBrowserGui");
+			}
+			
+		]]>
+	</mx:Script>
+	<flexui:FlexUnitTestRunnerUI id="testRunner" portNumber="8765">
+	</flexui:FlexUnitTestRunnerUI>
+	
+</mx:Application>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/TestRunner.mxml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/TestRunner.mxml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/TestRunner.mxml	(revision 5961)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
+				xmlns="*"
+				xmlns:flexunit="flexunit.flexui.*"
+				creationComplete="onCreationComplete()">
+
+	<mx:Script>
+		<![CDATA[
+		    import clarin.cmdi.componentregistry.editor.model.CMDSpecTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDAttributeTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDComponentElementTest;
+			import clarin.cmdi.componentregistry.editor.model.CMDComponentTest;
+			import flexunit.framework.TestSuite;
+
+			// Create the test suite and run the tests
+			private function onCreationComplete():void {
+				testRunner.test = createSuite();
+				testRunner.startTest();
+			}
+
+			// Creates the test suite to run
+			private function createSuite():TestSuite {
+				var testSuite:TestSuite = new TestSuite();
+
+				testSuite.addTestSuite(CMDSpecTest);
+				testSuite.addTestSuite(CMDComponentTest);
+				testSuite.addTestSuite(CMDComponentElementTest);
+				testSuite.addTestSuite(CMDAttributeTest);
+
+				return testSuite;
+			}
+		]]>
+	</mx:Script>
+
+	<!-- FlexUnit GUI Component -->
+	<flexunit:TestRunnerBase id="testRunner"
+							 width="100%"
+							 height="100%"/>
+</mx:Application>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/CMDComponentTest.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/CMDComponentTest.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/CMDComponentTest.as	(revision 5961)
@@ -0,0 +1,24 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import flexunit.framework.TestCase;
+	import flexunit.framework.TestSuite;
+
+	public class CMDComponentTest extends TestCase {
+		public function CMDComponentTest() {
+			super();
+		}
+
+		public static function suite():TestSuite {
+			return new TestSuite(CMDComponentTest);
+		}
+
+		public function testToXml():void {
+		    var comp:CMDComponent = new CMDComponent();
+		    comp.name = "aap";
+		    var expected:XML = <CMD_Component name="aap" CardinalityMin="1" CardinalityMax="1"/>
+			assertEquals(expected.toXMLString(), comp.toXml().toXMLString());
+			
+		}
+
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDAttributeTest.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDAttributeTest.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDAttributeTest.as	(revision 5961)
@@ -0,0 +1,58 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import clarin.cmdi.componentregistry.editor.ValueSchemeItem;
+	
+	import flexunit.framework.TestCase;
+	import flexunit.framework.TestSuite;
+	
+	import mx.collections.ArrayCollection;
+
+	public class CMDAttributeTest extends TestCase {
+		public function CMDAttributeTest() {
+			super();
+		}
+
+		public static function suite():TestSuite {
+			return new TestSuite(CMDAttributeTest);
+		}
+
+		public function testToXml():void {
+			var result:CMDAttribute = new CMDAttribute();
+			result.name = "aap";
+			result.valueSchemeSimple = "string";
+			var expected:XML = <Attribute>
+					<Name>aap</Name>
+					<Type>string</Type>
+				</Attribute>;
+			assertEquals(expected.toXMLString(), result.toXml().toXMLString());
+		}
+
+		public function testToXmlValueSchemePattern():void {
+			var result:CMDAttribute = new CMDAttribute();
+			result.name = "aap";
+			result.valueSchemePattern = "[a-zA-Z]+";
+			var expected:XML = <Attribute>
+					<Name>aap</Name>
+					<ValueScheme>
+					    <pattern>[a-zA-Z]+</pattern>
+					</ValueScheme>
+				</Attribute>;
+			assertEquals(expected.toXMLString(), result.toXml().toXMLString());
+		}
+
+		public function testToXmlValueSchemeEnumeration():void {
+			var result:CMDAttribute = new CMDAttribute();
+			result.name = "aap";
+			result.valueSchemeEnumeration = new ArrayCollection();
+			result.valueSchemeEnumeration.addItem(new ValueSchemeItem("Male", "test", "test2"));
+			var expected:XML = <Attribute>
+					<Name>aap</Name>
+					<ValueScheme>
+						<enumeration>
+							<item AppInfo="test" ConceptLink="test2">Male</item>
+						</enumeration>
+					</ValueScheme>
+				</Attribute>;
+			assertEquals(expected.toXMLString(), result.toXml().toXMLString());
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDComponentElementTest.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDComponentElementTest.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDComponentElementTest.as	(revision 5961)
@@ -0,0 +1,98 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import clarin.cmdi.componentregistry.editor.ValueSchemeItem;
+
+	import flexunit.framework.TestCase;
+	import flexunit.framework.TestSuite;
+
+	import mx.collections.ArrayCollection;
+
+	public class CMDComponentElementTest extends TestCase {
+		public function CMDComponentElementTest() {
+			super();
+		}
+
+		public static function suite():TestSuite {
+			return new TestSuite(CMDComponentElementTest);
+		}
+
+		public function testToXml():void {
+			var result:CMDComponentElement = new CMDComponentElement();
+			result.name = "aap";
+			result.valueSchemeSimple = "string";
+			result.documentation = "Docu";
+			result.displayPriority = "1";
+			result.multilingual = "false";
+			var att:CMDAttribute = new CMDAttribute();
+			att.name = "test";
+			att.valueSchemeSimple = "string";
+			result.attributeList.addItem(att);
+			var expected:XML = <CMD_Element name="aap" Documentation="Docu" DisplayPriority="1" ValueScheme="string" CardinalityMin="1" CardinalityMax="1"  Multilingual="false">
+					<AttributeList>
+						<Attribute>
+							<Name>test</Name>
+							<Type>string</Type>
+						</Attribute>  
+					</AttributeList>
+				</CMD_Element>;
+			assertEquals(expected.toXMLString(), result.toXml().toXMLString());
+		}
+
+		public function testToXmlDisplayPriorityZeroMeansDoNotSetIt():void {
+			var result:CMDComponentElement = new CMDComponentElement();
+			result.name = "aap";
+			result.valueSchemeSimple = "string";
+			result.documentation = "Docu";
+			result.displayPriority = "0";
+			var att:CMDAttribute = new CMDAttribute();
+			att.name = "test";
+			att.valueSchemeSimple = "string";
+			result.attributeList.addItem(att);
+			var expected:XML = <CMD_Element name="aap" Documentation="Docu" ValueScheme="string" CardinalityMin="1" CardinalityMax="1">
+					<AttributeList>
+						<Attribute>
+							<Name>test</Name>
+							<Type>string</Type>
+						</Attribute>  
+					</AttributeList>
+				</CMD_Element>;
+			assertEquals(expected.toXMLString(), result.toXml().toXMLString());
+		}
+
+		public function testToXmlValueScheme():void {
+			var result:CMDComponentElement = new CMDComponentElement();
+			result.name = "Sex";
+			result.conceptLink = "http://www.isocat.org/datcat/DC-2560";
+			result.valueSchemeEnumeration = new ArrayCollection();
+			result.valueSchemeEnumeration.addItem(new ValueSchemeItem("Male", "", ""));
+			result.valueSchemeEnumeration.addItem(new ValueSchemeItem("Female", "", ""));
+			result.valueSchemeEnumeration.addItem(new ValueSchemeItem("Unknown", "test", "test2"));
+			var expected:XML = <CMD_Element name="Sex" ConceptLink="http://www.isocat.org/datcat/DC-2560" CardinalityMin="1" CardinalityMax="1">
+					<ValueScheme>
+						<enumeration>
+							<item AppInfo="" ConceptLink="">Male</item>
+							<item AppInfo="" ConceptLink="">Female</item>
+							<item AppInfo="test" ConceptLink="test2">Unknown</item>
+						</enumeration>
+					</ValueScheme>
+				</CMD_Element>;
+
+			assertEquals(expected.toXMLString(), result.toXml().toXMLString());
+		}
+
+		public function testToXmlValueSchemePattern():void {
+			var result:CMDComponentElement = new CMDComponentElement();
+			result.name = "Test";
+			result.cardinalityMax = "5"
+			result.valueSchemePattern = "[a-z]";
+
+			var expected:XML = <CMD_Element name="Test" CardinalityMin="1" CardinalityMax="5">
+					<ValueScheme>
+						<pattern>[a-z]</pattern>
+					</ValueScheme>
+				</CMD_Element>;
+
+			assertEquals(expected.toXMLString(), result.toXml().toXMLString());
+		}
+
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDSpecTest.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDSpecTest.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/editor/model/CMDSpecTest.as	(revision 5961)
@@ -0,0 +1,31 @@
+package clarin.cmdi.componentregistry.editor.model {
+	import flexunit.framework.TestCase;
+	import flexunit.framework.TestSuite;
+
+	public class CMDSpecTest extends TestCase {
+		public function CMDSpecTest() {
+			super();
+		}
+
+		public static function suite():TestSuite {
+			return new TestSuite(CMDSpecTest);
+		}
+
+		public function testToXml():void {
+			var comp:CMDSpec = new CMDSpec(true);
+			comp.headerName = "aap";
+			comp.headerDescription = "noot";
+			comp.headerId = "";
+			var expected:XML = <CMD_ComponentSpec isProfile="true">
+					<Header>
+						<ID></ID>
+						<Name>aap</Name>
+						<Description>noot</Description>
+					</Header>
+				</CMD_ComponentSpec>
+
+			assertEquals(expected.toXMLString(), comp.toXml().toXMLString());
+
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/ComponentInfoServiceTest.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/ComponentInfoServiceTest.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/ComponentInfoServiceTest.as	(revision 5961)
@@ -0,0 +1,51 @@
+package clarin.cmdi.componentregistry.services
+{
+	import mx.rpc.events.ResultEvent;
+	
+	import clarin.cmdi.componentregistry.common.ItemDescription;
+	
+	import flexunit.framework.TestCase;
+
+	public class ComponentInfoServiceTest extends TestCase
+	{
+		private var service:ComponentInfoService;
+		private var serviceFactory:MockServiceFactoryImpl;
+		
+		//for some reason setup doesn't get called
+		[Before]
+		public function setup():void{
+			serviceFactory = new MockServiceFactoryImpl();
+			service = new ComponentInfoService();
+		}
+		
+		public function ComponentInfoServiceTest()
+		{
+			super(); 
+		}
+		
+		public function testInvocation():void{
+			setup();
+			var item:ItemDescription = new ItemDescription();
+			service.load(item);
+			var xml:XML = <CMD_ComponentSpec isProfile="false">
+<Header>
+<ID>clarin.eu:cr1:c_1376059207640</ID>
+<Name>PublicComponent</Name>
+<Description>Description</Description>
+</Header>
+<CMD_Component CardinalityMax="1" CardinalityMin="1" name="PublicComponent">
+<CMD_Element Multilingual="false" DisplayPriority="1" CardinalityMax="1" CardinalityMin="0" ValueScheme="string" name="OneElement"></CMD_Element>
+</CMD_Component>
+</CMD_ComponentSpec>;
+
+			var result:ResultEvent = new ResultEvent("xml", false, true, xml, serviceFactory.lastService.token, null);
+			
+			serviceFactory.lastService.invokeResult(result);
+			assertNotNull(service.component);
+			assertNotNull(service.component.componentMD);
+			assertEquals("PublicComponent",service.component.componentMD.name);
+		}
+		
+		
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/MockRemoteService.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/MockRemoteService.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/MockRemoteService.as	(revision 5961)
@@ -0,0 +1,40 @@
+package clarin.cmdi.componentregistry.services
+{
+	import com.adobe.net.URI;
+	
+	import mx.rpc.AsyncToken;
+	import mx.rpc.Responder;
+	import mx.rpc.events.ResultEvent;
+	
+	import clarin.cmdi.componentregistry.services.remote.RemoteService;
+
+	public class MockRemoteService implements RemoteService
+	{
+		
+		public var token:AsyncToken;
+		
+		public function MockRemoteService()
+		{
+		}
+		
+		public function send():AsyncToken{
+		
+			token = new AsyncToken();
+			return token;
+		}
+		
+		public function setMethod(method:String):void{
+		}
+		
+		public function setUrl(url:URI):void{
+		}
+		
+		public function setResultFormat(format:String):void{
+		}
+		
+		public function invokeResult(result:ResultEvent):void{
+			var responder:Responder = token.responders[0];
+			responder.result(result);
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/MockServiceFactoryImpl.as
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/MockServiceFactoryImpl.as	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentBrowserGui/src/test/flex/clarin/cmdi/componentregistry/services/MockServiceFactoryImpl.as	(revision 5961)
@@ -0,0 +1,21 @@
+package clarin.cmdi.componentregistry.services
+{
+	import clarin.cmdi.componentregistry.services.remote.HttpServiceFactory;
+	import clarin.cmdi.componentregistry.services.remote.RemoteService;
+
+	public class MockServiceFactoryImpl extends HttpServiceFactory
+	{
+		public var lastService:MockRemoteService;
+		
+		public function MockServiceFactoryImpl()
+		{
+			HttpServiceFactory.impl = this;
+		}
+		
+		override public function createNew():RemoteService{
+			lastService = new MockRemoteService();
+			return lastService;
+		
+		}
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/commands.txt
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/commands.txt	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/commands.txt	(revision 5961)
@@ -0,0 +1,9 @@
+LOCAL:
+mvn clean package -Dmaven.test.skip=true
+
+LUX16:
+mvn clean package -Dmaven.test.skip=true -Plux16 
+
+CATALOG.CLARIN:
+mvn clean package -Dmaven.test.skip=true -Pclarin
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/nbactions.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/nbactions.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/nbactions.xml	(revision 5961)
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<actions>
+        <action>
+            <actionName>run</actionName>
+            <goals>
+                <goal>package</goal>
+            </goals>
+            <properties>
+                <netbeans.deploy>true</netbeans.deploy>
+                <skipTests>true</skipTests>
+                <netbeans.deploy.clientUrlPart></netbeans.deploy.clientUrlPart>
+            </properties>
+        </action>
+        <action>
+            <actionName>debug</actionName>
+            <goals>
+                <goal>package</goal>
+            </goals>
+            <properties>
+                <netbeans.deploy.debugmode>true</netbeans.deploy.debugmode>
+                <netbeans.deploy>true</netbeans.deploy>
+                <skipTests>true</skipTests>
+                <netbeans.deploy.clientUrlPart></netbeans.deploy.clientUrlPart>
+            </properties>
+        </action>
+        <action>
+            <actionName>profile</actionName>
+            <goals>
+                <goal>package</goal>
+            </goals>
+            <properties>
+                <netbeans.deploy>true</netbeans.deploy>
+                <netbeans.deploy.profilemode>true</netbeans.deploy.profilemode>
+                <netbeans.deploy.clientUrlPart></netbeans.deploy.clientUrlPart>
+            </properties>
+        </action>
+        <action>
+            <actionName>debug.test.single</actionName>
+            <goals>
+                <goal>test-compile</goal>
+                <goal>surefire:test</goal>
+            </goals>
+            <properties>
+                <test>${packageClassName}</test>
+                <forkMode>once</forkMode>
+                <maven.surefire.debug>-Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=${jpda.address} -Xmx512m</maven.surefire.debug>
+                <jpda.listen>true</jpda.listen>
+                
+            </properties>
+        </action>
+    </actions>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/pom.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/pom.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/pom.xml	(revision 5961)
@@ -0,0 +1,580 @@
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>clarin.cmdi</groupId>
+        <artifactId>componentRegistry.parent</artifactId>
+        <version>1.0</version>
+    </parent>
+    <groupId>clarin.cmdi</groupId>
+    <artifactId>ComponentRegistry</artifactId>
+    <packaging>${packaging}</packaging>
+    <version>${ComponentRegistry.version}</version>
+    <name>ComponentRegistry</name>
+    <description>
+        ComponentRegistry is part of the clarin metadata infrastructure (cmdi). 
+        The goal of the ComponentRegistry will be to register and make searchable Metadata Components and Profiles. 
+    </description>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <packaging>war</packaging>
+        <!-- Properties to configure ComponentRegistry override on commandline 
+        with -D or change here -->
+        <serviceRootUrl>http://localhost:8080/${project.artifactId}</serviceRootUrl>
+        <!-- Will be inserted in context.xml -->
+        <webXmlPath>src/main/webapp/WEB-INF/web-test.xml</webXmlPath>
+        <!-- non-shib web.xml -->
+        <isocatSearchUrl>http://www.isocat.org/rest/user/guest/search</isocatSearchUrl>
+        <ComponentRegistrySwfName>${project.artifactId}-${ComponentBrowserGui.version}</ComponentRegistrySwfName>
+        <flexDebug>0</flexDebug>
+        <spring-data-jpa.version>1.3.4.RELEASE</spring-data-jpa.version>
+        <spring.version>3.2.10.RELEASE</spring.version>
+        <jackson.version>1.9.13</jackson.version>
+        <jersey.version>1.17.1</jersey.version>
+        <!-- hibernate.version>4.2.4.Final</hibernate.version -->
+        <hibernate.version>3.6.10.Final</hibernate.version>
+        <spring-data-jpa.version>1.3.4.RELEASE</spring-data-jpa.version>
+        <logging.appender>FILE</logging.appender>
+        <logging.level>warn</logging.level>
+    </properties>
+
+
+    <ciManagement>
+        <system>hudson</system>
+        <url>http://lux16.mpi.nl/jenkins/job/ComponentRegistry/</url>
+    </ciManagement>
+    <scm>
+        <connection>scm:svn:http://svn.clarin.eu/ComponentRegistry/trunk/ComponentRegistry</connection>
+        <developerConnection>scm:svn:http://svn.clarin.eu/ComponentRegistry/trunk/ComponentRegistry</developerConnection>
+        <url>http://trac.clarin.eu/browser/ComponentRegistry</url>
+    </scm>
+
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-jpa</artifactId>
+            <version>${spring-data-jpa.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-entitymanager</artifactId>
+            <version>${hibernate.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.11</version>
+            <scope>test</scope>
+        </dependency>       
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.5</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>xml-resolver</groupId>
+            <artifactId>xml-resolver</artifactId>
+            <version>1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey.contribs</groupId>
+            <artifactId>jersey-multipart</artifactId>
+            <version>${jersey.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-core-asl</artifactId>
+            <version>${jackson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey</groupId>
+            <artifactId>jersey-bundle</artifactId>
+            <version>${jersey.version}</version>
+            <exclusions>
+                <!-- Jersey has dependencies with different group ids therefore maven 
+                cannot resolve the conflict and gives me both jars (two of stax and two of 
+                jaxb-impl). Excluding them manually to overcome the problem -->
+                <exclusion>
+                    <groupId>stax</groupId>
+                    <artifactId>stax-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey.jersey-test-framework</groupId>
+            <artifactId>jersey-test-framework-grizzly</artifactId>
+            <version>${jersey.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.wordnik</groupId>
+            <artifactId>swagger-jersey-jaxrs_2.10</artifactId>
+            <version>1.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.grizzly</groupId>
+            <artifactId>grizzly-servlet-webserver</artifactId>
+            <version>1.9.19</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>xmlunit</groupId>
+            <artifactId>xmlunit</artifactId>
+            <version>1.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.xml.stream</groupId>
+            <artifactId>sjsxp</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>de.mpg.mpgaai</groupId>
+            <artifactId>mpgaai-jaas</artifactId>
+            <version>1.3.2</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>de.mpg.mpgaai</groupId>
+            <artifactId>mpgaai-shhaa</artifactId>
+            <version>1.0.4</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.wicket</groupId>
+            <artifactId>wicket</artifactId>
+            <version>1.4.8</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.wicket</groupId>
+            <artifactId>wicket-extensions</artifactId>
+            <version>1.4.8</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>jsp-api</artifactId>
+            <version>2.0</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- Spring framework -->
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>${spring.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-jpa</artifactId>
+            <version>${spring-data-jpa.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-aop</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-core</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-context</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.wicket</groupId>
+            <artifactId>wicket-spring</artifactId>
+            <version>1.4.8</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.jersey.contribs</groupId>
+            <artifactId>jersey-spring</artifactId>
+            <version>${jersey.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-core</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-aop</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-context</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-web</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- Database -->
+
+        <dependency>
+            <groupId>commons-dbcp</groupId>
+            <artifactId>commons-dbcp</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency>
+            <groupId>postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>8.4-701.jdbc3</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+            <version>2.2.8</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>clarin.cmdi</groupId>
+            <artifactId>cmd-validate</artifactId>
+            <version>1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jul-to-slf4j</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>16.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20090211</version>
+        </dependency>
+    </dependencies>
+
+
+    <profiles>
+        <profile>
+            <!-- development profile that directs logging output to the console -->
+            <id>development</id>
+            <properties>
+                <logging.level>debug</logging.level>
+                <logging.appender>CONSOLE</logging.appender>
+                <serviceRootUrl>http://localhost:8080/ComponentRegistry</serviceRootUrl>
+                <!-- Will be inserted in context.xml -->
+                <shibLI>http://lux16.mpi.nl/Shibboleth.sso/Login</shibLI>
+                <!-- Shibboleth login URI for SHHAA -->
+                <shibLO>http://lux16.mpi.nl/Shibboleth.sso/Logout</shibLO>
+                <!-- Shibboleth logout URI for SHHAA -->
+                <webXmlPath>src/main/webapp/WEB-INF/web-shib.xml</webXmlPath>
+                <!-- web.xml for shibboleth authentication -->
+            </properties>
+        </profile>
+        <profile>
+            <id>lux16</id>
+            <properties>
+                <serviceRootUrl>http://lux16.mpi.nl/ds/ComponentRegistry</serviceRootUrl>
+                <!-- Will be inserted in context.xml -->
+                <shibLI>http://lux16.mpi.nl/Shibboleth.sso/Login</shibLI>
+                <!-- Shibboleth login URI for SHHAA -->
+                <shibLO>http://lux16.mpi.nl/Shibboleth.sso/Logout</shibLO>
+                <!-- Shibboleth logout URI for SHHAA -->
+                <webXmlPath>src/main/webapp/WEB-INF/web-shib.xml</webXmlPath>
+                <!-- web.xml for shibboleth authentication -->
+            </properties>
+        </profile>
+        <profile>
+            <id>clarin</id>
+            <properties>
+                <logging.level>warn</logging.level>
+                <serviceRootUrl>http://catalog.clarin.eu/ds/ComponentRegistry</serviceRootUrl>
+                <!-- Will be inserted in context.xml -->
+                <shibLI>https://catalog.clarin.eu/Shibboleth.sso/Login</shibLI>
+                <!-- Shibboleth login URI for SHHAA -->
+                <shibLO>https://catalog.clarin.eu/Shibboleth.sso/Logout</shibLO>
+                <!-- Shibboleth logout URI for SHHAA -->
+                <webXmlPath>src/main/webapp/WEB-INF/web-shib.xml</webXmlPath>
+                <!-- web.xml for shibboleth authentication -->
+            </properties>
+        </profile>
+    </profiles>
+
+    <build>
+        <filters>
+            <filter>properties/flexindex.properties</filter>
+        </filters>
+        <resources>
+            <resource>
+                <filtering>false</filtering>
+                <directory>src/generated/jaxb/components</directory>
+            </resource>
+            <resource>
+                <filtering>false</filtering>
+                <directory>src/generated/jaxb/rss</directory>
+            </resource>
+            <resource>
+                <filtering>true</filtering>
+                <directory>src/main/resources</directory>
+            </resource>
+            <resource>
+                <filtering>false</filtering>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.html</include>
+                </includes>
+            </resource>
+        </resources>
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+            </testResource>
+        </testResources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <warName>${project.artifactId}</warName>
+                    <webXml>${webXmlPath}</webXml>
+                    <webResources>
+                        <resource>
+                            <directory>src/main/webapp</directory>
+                            <filtering>true</filtering>
+                        </resource>
+                    </webResources>
+                    <archive>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.jvnet.jaxb2.maven2</groupId>
+                <artifactId>maven-jaxb2-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>jaxb-components</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <schemaDirectory>src/main/binding/components</schemaDirectory>
+                            <schemaIncludes>
+                                <include>general-component-schema.xsd</include>
+                            </schemaIncludes>
+                            <bindingDirectory>src/main/binding/components</bindingDirectory>
+                            <extension>true</extension>
+                            <generateDirectory>${basedir}/src/generated/jaxb/components</generateDirectory>
+                            <generatePackage>clarin.cmdi.componentregistry.components</generatePackage>
+                            <catalog>src/main/resources/catalog.cat</catalog>
+                            <catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>jaxb-rrs</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <schemaDirectory>src/main/binding/rss</schemaDirectory>
+                            <schemaIncludes>
+                                <include>rss-2_0.xsd</include>
+                            </schemaIncludes>
+                            <bindingDirectory>src/main/binding/rss</bindingDirectory>
+                            <extension>true</extension>
+                            <generateDirectory>${basedir}/src/generated/jaxb/rss</generateDirectory>
+                            <generatePackage>clarin.cmdi.componentregistry.rss</generatePackage>
+                            <catalog>src/main/resources/catalog.cat</catalog>
+                            <catalogResolver>org.jvnet.jaxb2.maven2.resolver.tools.ClasspathCatalogResolver</catalogResolver>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>clarin.cmdi</groupId>
+                                    <artifactId>ComponentBrowserGui</artifactId>
+                                    <version>${ComponentBrowserGui.version}</version>
+                                    <type>swf</type>
+                                    <overWrite>true</overWrite>
+                                    <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}</outputDirectory>
+                                    <destFileName>${ComponentRegistrySwfName}.swf</destFileName>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.2.2</version>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/assembly/release.xml</descriptor>
+                            </descriptors>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.13</version>
+                <configuration>
+                    <systemProperties>
+                        <property>
+                            <name>java.util.logging.config.file</name>
+                            <value>${project.build.directory}/classes/logging.properties</value>
+                        </property>
+                    </systemProperties>
+                    <additionalClasspathElements>
+                        <additionalClasspathElement>src/test/resources</additionalClasspathElement>
+                    </additionalClasspathElements>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+    <!--
+                <reporting>
+                                <plugins>
+                                                <plugin>
+                                                                <groupId>org.codehaus.mojo</groupId>
+                                                                <artifactId>findbugs-maven-plugin</artifactId>
+                                                        <version>2.5.4-SNAPSHOT</version>
+                                                                <configuration>
+                                                                        <excludeFilterFile>${basedir}/src/main/resources/findbugs-exclude.xml</excludeFilterFile>
+                                                                        <threshold>Normal</threshold>
+                                                                        <effort>Min</effort>
+                                                                </configuration>
+                                                </plugin>
+                                </plugins>
+                </reporting>
+    -->
+    <repositories>
+        <repository>
+            <id>cmdi.clarin.repository</id>
+            <name>Clarin Repository</name>
+            <url>http://catalog.clarin.eu/ds/nexus/content/groups/public/</url>
+        </repository>
+        <!--
+        <repository>
+                        <id>sonatype</id>
+                        <url>https://oss.sonatype.org/content/groups/public</url>
+        </repository>
+        -->
+    </repositories>
+</project>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/properties/flexindex.properties
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/properties/flexindex.properties	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/properties/flexindex.properties	(revision 5961)
@@ -0,0 +1,8 @@
+title=Clarin Component Registry
+version_major=10
+version_minor=0
+version_revision=0
+width=100%
+height=100%
+application=ComponentRegistry
+bgcolor=#869ca7
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/assembly/release.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/assembly/release.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/assembly/release.xml	(revision 5961)
@@ -0,0 +1,52 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+    
+    <id>mpi-deploy</id>
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    
+    <fileSets>
+        <fileSet>
+            <outputDirectory>war</outputDirectory>
+            <directory>target</directory>
+            <includes>
+                <include>*.war</include>
+            </includes>
+        </fileSet>
+
+        <fileSet>
+            <outputDirectory>jar</outputDirectory>
+            <directory>target</directory>
+            <includes>
+                <include>*.jar</include>
+            </includes>
+        </fileSet>
+
+        <fileSet>
+            <outputDirectory>scripts</outputDirectory>
+            <directory>src/main/sql</directory>
+            <includes>
+                <include>*.sql</include>
+            </includes>
+        </fileSet>
+
+        <fileSet>
+            <outputDirectory>scripts</outputDirectory>
+            <directory>src/main/script</directory>
+        </fileSet>
+
+        <fileSet>
+            <directory>${project.basedir}/..</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>UPDATE</include>
+                <include>LICENSES</include>
+                <include>README</include>
+                <include>CHANGES</include>
+                <include>INSTALL</include>
+            </includes>
+        </fileSet>
+    </fileSets>              
+</assembly>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/components/bindings.xjb
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/components/bindings.xjb	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/components/bindings.xjb	(revision 5961)
@@ -0,0 +1,13 @@
+<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
+          xmlns:xs="http://www.w3.org/2001/XMLSchema"
+          version="2.0"> 
+          <!-- TODO Patrick component schema location here needs to be better handled. Not hardcoded for instance. -->
+   <bindings schemaLocation="general-component-schema.xsd"
+     node="/xs:schema/xs:complexType[@name='CMD_Element_type']/xs:sequence/xs:element[@name='ValueScheme']">
+      <property name="ValueScheme" />
+   </bindings>
+   <bindings schemaLocation="general-component-schema.xsd"
+     node="/xs:schema/xs:attributeGroup[@name='clarin_element_attributes']/xs:attribute[@name='ValueScheme']">
+      <property name="ValueSchemeAttribute" />
+   </bindings>
+</bindings>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/rss/bindings.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/rss/bindings.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/rss/bindings.xml	(revision 5961)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jxb:bindings version="1.0"
+              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
+              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+              xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix"
+              xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
+    http://jaxb2-commons.dev.java.net/namespace-prefix http://java.net/projects/jaxb2-commons/sources/svn/content/namespace-prefix/trunk/src/main/resources/prefix-namespace-schema.xsd">
+    
+    <jxb:bindings schemaLocation="http://dataconnector.eea.europa.eu/wise/bwqd/atom.xsd">
+        <jxb:schemaBindings>
+            <jxb:package name="clarin.cmdi.componentregistry.rss" />
+        </jxb:schemaBindings>
+        <jxb:bindings>
+            <namespace:prefix name="atom" />
+        </jxb:bindings>
+    </jxb:bindings>
+    <jxb:bindings schemaLocation="http://dublincore.org/schemas/xmls/simpledc20021212.xsd">
+        <jxb:schemaBindings>
+            <jxb:package name="clarin.cmdi.componentregistry.rss" />
+        </jxb:schemaBindings>
+        <jxb:bindings>
+            <namespace:prefix name="dc" />
+        </jxb:bindings>
+    </jxb:bindings>
+</jxb:bindings>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/rss/rss-2_0.xsd
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/rss/rss-2_0.xsd	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/binding/rss/rss-2_0.xsd	(revision 5961)
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    XML Schema for RSS v2.0
+    Copyright (C) 2003-2008  Jorgen Thelin
+
+Microsoft Public License (Ms-PL)
+
+This license governs use of the accompanying software. 
+If you use the software, you accept this license. 
+If you do not accept the license, do not use the software.
+
+1. Definitions
+
+The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
+
+    A "contribution" is the original software, or any additions or changes to the software.
+
+    A "contributor" is any person that distributes its contribution under this license.
+
+    "Licensed patents" are a contributor's patent claims that read directly on its contribution.
+
+2. Grant of Rights
+
+    (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
+
+    (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
+
+3. Conditions and Limitations
+
+    (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
+
+    (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
+
+    (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
+
+    (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
+
+    (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. 
+
+-->
+<xs:schema 
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    elementFormDefault="unqualified" 
+    version="2.0.2.16">
+  
+    <xs:annotation>
+        <xs:documentation>XML Schema for RSS v2.0 feed files.</xs:documentation>
+        <xs:documentation>Project home: http://www.codeplex.com/rss2schema/ </xs:documentation>
+        <xs:documentation>Based on the RSS 2.0 specification document at http://cyber.law.harvard.edu/rss/rss.html </xs:documentation>
+        <xs:documentation>Author: Jorgen Thelin</xs:documentation>
+        <xs:documentation>Revision: 16</xs:documentation>
+        <xs:documentation>Date: 01-Nov-2008</xs:documentation>
+        <xs:documentation>Feedback to: http://www.codeplex.com/rss2schema/WorkItem/List.aspx </xs:documentation>
+    </xs:annotation>
+  
+  
+    
+    <xs:element name="rss">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="channel" type="RssChannel"/>
+                <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+            </xs:sequence>
+            <xs:attribute name="version" type="xs:double" use="required" fixed="2.0"/>
+            <xs:anyAttribute namespace="##any"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:complexType name="RssItem">
+        <xs:annotation>
+            <xs:documentation>An item may represent a "story" -- much like a story in a newspaper or magazine; if so its description is a synopsis of the story, and the link points to the full story. An item may also be complete in itself, if so, the description contains the text (entity-encoded HTML is allowed), and the link and title may be omitted.</xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="title" type="xs:string" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The title of the item.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="link" type="xs:anyURI" minOccurs="0"> 
+            </xs:element> 
+            <xs:element name="description" type="xs:string" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The item synopsis.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="category" type="Category" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Includes the item in one or more categories. </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="comments" type="xs:anyURI" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>URL of a page for comments relating to the item.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="enclosure" type="Enclosure" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Describes a media object that is attached to the item.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="guid" type="Guid" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>guid or permalink URL for this entry</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="pubDate" type="Rfc822FormatDate" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Indicates when the item was published.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation>Extensibility element.</xs:documentation>
+                </xs:annotation>
+            </xs:any>
+        </xs:sequence>
+        <xs:anyAttribute namespace="##any"/>
+    </xs:complexType>
+    <xs:complexType name="RssChannel">
+        <xs:sequence>
+            <xs:element name="title" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The name of the channel. It's how people refer to your service. If you have an HTML website that contains the same information as your RSS file, the title of your channel should be the same as the title of your website.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            
+            <xs:element name="link" type="xs:anyURI">
+                <xs:annotation>
+                    <xs:documentation>The URL to the HTML website corresponding to the channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            
+            <xs:element name="description" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Phrase or sentence describing the channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            
+            <xs:element name="language" type="xs:language" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The language the channel is written in. This allows aggregators to group all Italian language sites, for example, on a single page. A list of allowable values for this element, as provided by Netscape, is here. You may also use values defined by the W3C.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="copyright" type="xs:string" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Copyright notice for content in the channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="managingEditor" type="EmailAddress" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Email address for person responsible for editorial content.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="webMaster" type="EmailAddress" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Email address for person responsible for technical issues relating to channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="pubDate" type="Rfc822FormatDate" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The publication date for the content in the channel. All date-times in RSS conform to the Date and Time Specification of RFC 822, with the exception that the year may be expressed with two characters or four characters (four preferred).</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="lastBuildDate" type="Rfc822FormatDate" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The last time the content of the channel changed.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="category" type="Category" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Specify one or more categories that the channel belongs to.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="generator" type="xs:string" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>A string indicating the program used to generate the channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="docs" type="xs:anyURI" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>A URL that points to the documentation for the format used in the RSS file. It's probably a pointer to this page. It's for people who might stumble across an RSS file on a Web server 25 years from now and wonder what it is.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="cloud" type="Cloud" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Allows processes to register with a cloud to be notified of updates to the channel, implementing a lightweight publish-subscribe protocol for RSS feeds.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="ttl" type="xs:nonNegativeInteger" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>ttl stands for time to live. It's a number of minutes that indicates how long a channel can be cached before refreshing from the source.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="image" type="Image" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Specifies a GIF, JPEG or PNG image that can be displayed with the channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="rating" type="xs:string" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The PICS rating for the channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="textInput" type="TextInput" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Specifies a text input box that can be displayed with the channel.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="skipHours" type="SkipHoursList" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>A hint for aggregators telling them which hours they can skip.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="skipDays" type="SkipDaysList" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>A hint for aggregators telling them which days they can skip.</xs:documentation>
+                </xs:annotation>
+            </xs:element>  
+            <xs:element name="item" type="RssItem" minOccurs="1" maxOccurs="unbounded">
+                <!-- 
+                  HACK: According to the RSS 2.0 spec, it should strictly be possible to have zero item elements, 
+                        but this makes the schema non-deterministic with regard to extensibility elements
+                        so for the moment we undid bug-fix 10231 and set minOccurs=1 to work around this problem. 
+                -->
+            </xs:element>
+        </xs:sequence>
+        <xs:anyAttribute namespace="##any"/>
+    </xs:complexType>
+    <xs:simpleType name="SkipHour">
+        <xs:annotation>
+            <xs:documentation>A time in GMT when aggregators should not request the channel data. The hour beginning at midnight is hour zero.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:nonNegativeInteger">
+            <xs:minInclusive value="0"/>
+            <xs:maxInclusive value="23"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:complexType name="SkipHoursList">
+        <xs:sequence>
+            <xs:element name="hour" type="SkipHour" minOccurs="0" maxOccurs="24"/>
+        </xs:sequence>
+    </xs:complexType>
+    <xs:simpleType name="SkipDay">
+        <xs:annotation>
+            <xs:documentation>A day when aggregators should not request the channel data.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="Monday"/>
+            <xs:enumeration value="Tuesday"/>
+            <xs:enumeration value="Wednesday"/>
+            <xs:enumeration value="Thursday"/>
+            <xs:enumeration value="Friday"/>
+            <xs:enumeration value="Saturday"/>
+            <xs:enumeration value="Sunday"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:complexType name="SkipDaysList">
+        <xs:sequence>
+            <xs:element name="day" type="SkipDay" minOccurs="0" maxOccurs="7">
+                <xs:annotation>
+                    <xs:documentation>A time in GMT, when aggregators should not request the channel data. The hour beginning at midnight is hour zero.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+    <xs:complexType name="Category">
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="domain" type="xs:string" use="optional"/>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+    <xs:complexType name="Image">
+        <xs:all>
+            <xs:element name="url" type="xs:anyURI">
+                <xs:annotation>
+                    <xs:documentation>The URL of the image file.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="title" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Describes the image, it's used in the ALT attribute of the HTML &lt;img&gt; tag when the channel is rendered in HTML.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="link" type="xs:anyURI">
+                <xs:annotation>
+                    <xs:documentation>The URL of the site, when the channel is rendered, the image is a link to the site. (Note, in practice the image &lt;title&gt; and &lt;link&gt; should have the same value as the channel's &lt;title&gt; and &lt;link&gt;. </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="width" type="ImageWidth" default="88" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The width of the image in pixels.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="height" type="ImageHeight" default="31" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>The height of the image in pixels.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="description" type="xs:string" minOccurs="0">
+                <xs:annotation>
+                    <xs:documentation>Text that is included in the TITLE attribute of the link formed around the image in the HTML rendering.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:all>
+    </xs:complexType>
+    <xs:simpleType name="ImageHeight">
+        <xs:annotation>
+            <xs:documentation>The height of the image in pixels.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:positiveInteger">
+            <xs:maxInclusive value="400"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="ImageWidth">
+        <xs:annotation>
+            <xs:documentation>The width of the image in pixels.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:positiveInteger">
+            <xs:maxInclusive value="144"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:complexType name="Cloud">
+        <xs:annotation>
+            <xs:documentation>Specifies a web service that supports the rssCloud interface which can be implemented in HTTP-POST, XML-RPC or SOAP 1.1. Its purpose is to allow processes to register with a cloud to be notified of updates to the channel, implementing a lightweight publish-subscribe protocol for RSS feeds.</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="domain" type="xs:string" use="required"/>
+        <xs:attribute name="port" type="xs:positiveInteger" use="required"/>
+        <xs:attribute name="path" type="xs:string" use="required"/>
+        <xs:attribute name="registerProcedure" type="xs:string" use="required"/>
+        <xs:attribute name="protocol" type="CloudProtocol" use="required"/>
+    </xs:complexType>
+    <xs:simpleType name="CloudProtocol">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="xml-rpc"/>
+            <xs:enumeration value="http-post"/>
+            <xs:enumeration value="soap"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:complexType name="TextInput">
+        <xs:annotation>
+            <xs:documentation>The purpose of this element is something of a mystery! You can use it to specify a search engine box. Or to allow a reader to provide feedback. Most aggregators ignore it.</xs:documentation>
+        </xs:annotation>
+        <xs:all>
+            <xs:element name="title" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The label of the Submit button in the text input area.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="description" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Explains the text input area.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="name" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The name of the text object in the text input area.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="link" type="xs:anyURI">
+                <xs:annotation>
+                    <xs:documentation>The URL of the CGI script that processes text input requests.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:all>
+    </xs:complexType>
+    <xs:simpleType name="EmailAddress">
+        <xs:annotation>
+            <xs:documentation>Using the regexp definiton of E-Mail Address by Lucadean from the .NET RegExp Pattern Repository at http://www.3leaf.com/default/NetRegExpRepository.aspx </xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern
+                value="([a-zA-Z0-9_\-])([a-zA-Z0-9_\-\.]*)@(\[((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}|((([a-zA-Z0-9\-]+)\.)+))([a-zA-Z]{2,}|(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\])"
+      />
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="Rfc822FormatDate">
+        <xs:annotation>
+            <xs:documentation>A date-time displayed in RFC-822 format.</xs:documentation>
+            <xs:documentation>Using the regexp definiton of rfc-822 date by Sam Ruby at http://www.intertwingly.net/blog/1360.html </xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:pattern
+                value="(((Mon)|(Tue)|(Wed)|(Thu)|(Fri)|(Sat)|(Sun)), *)?\d\d? +((Jan)|(Feb)|(Mar)|(Apr)|(May)|(Jun)|(Jul)|(Aug)|(Sep)|(Oct)|(Nov)|(Dec)) +\d\d(\d\d)? +\d\d:\d\d(:\d\d)? +(([+\-]?\d\d\d\d)|(UT)|(GMT)|(EST)|(EDT)|(CST)|(CDT)|(MST)|(MDT)|(PST)|(PDT)|\w)"
+      />
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:complexType name="Source">
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="url" type="xs:anyURI"/>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+    <xs:complexType name="Enclosure">
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="url" type="xs:anyURI" use="required">
+                    <xs:annotation>
+                        <xs:documentation>URL where the enclosure is located</xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="length" type="xs:nonNegativeInteger" use="required">
+                    <xs:annotation>
+                        <xs:documentation>Size in bytes</xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="type" type="xs:string" use="required">
+                    <xs:annotation>
+                        <xs:documentation>MIME media-type of the enclosure</xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+    <xs:complexType name="Guid">
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="isPermaLink" type="xs:boolean" use="optional" default="true"/>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <!--
+    TODO:
+    - Need to add regexp pattern for MIME media-type value of tEnclosure/type
+    - Need to add regexp pattern for checking contents of guid is a URL when isPermaLink=true"
+    - Need to add some form of constraint to check on an item that one, or other, or both of title and description are present.
+      However, I'm not sure it is possible to represent these constraints in XML Schema language alone.
+    - Need some way to enforce cardinality constraints preventing repeated elements in channels or items
+    - Unfortunately the bug-fix for issue 10231 made this schema non-deterministic with respect to extensibitity elements.
+      We can't tell whether an extension element in tRssChannel is within the choice or after the item elements.
+      Need to reconsider the solution to bug-fix 10231.
+    -->
+
+    <!--
+    Change Log:
+    Date        Revision  Description
+    31-Mar-2003   1       Initial version released for comment
+    31-Mar-2003   2       Changes based on feedback from Gudge:
+                          - Remove targetNamespace="" and use elemenfFormDefault="unqualified" instead
+                          - Use namespace="##other" on <any>'s to create a more deterministic data model.
+                          - Added missing xs:documentation inside xs:annotation at the schema level.
+                          - Use xs:language for ISO Language Codes in <language> element.
+                          - Change guid to a single declaration.  This loses some of the checking of the 
+                            URL when the contents of the guid is a permaLink, so we will need to add 
+                            that back in with a regexp pattern.
+    14-Apr-2003   3       Changes to solve some element ordering problems.
+                          - Use xs:all in place of xs:sequence to support flexible ordering of elements.
+                            Although the ordering constraints for elements is not clear from the 
+                            original specification, the custom and practice seems to be that 
+                            element ordering is freeform.
+                          - Use elemenfFormDefault="qualified" for explicit intent.
+    15-Apr-2003   4       Changes to solve some element ordering problems.
+                          - Use xs:choice in place of xs:all as previous usage of <all> was invalid.
+                            This creates the problem that unsufficient constraints can be applied 
+                            by the schema - for example, it can't prevent two title elements for an item.
+                          - Use elemenfFormDefault="unqualified" for to get the correct behavious 
+                            when importing and combining schemas.
+    15-Apr-2003   5       Putting the extensibility element inside the repeating choice solves 
+                            all problems with element ordering.
+    15-Apr-2003   6       - skipHours and skipDays should contain a nested list of values, 
+                            not just a single value.
+                          - Added version attribute to schema definition.
+                          - Corrected type of the cloud element
+    25-Apr-2003   7       - Add regexp for RFC-822 date suggested by Sam Ruby
+                          - I had to leave the base type of the tRfc822FormatDate type 
+                            as xs:string due to the problems with using 
+                            a pattern with xs:dateTime described at
+                            http://www.thearchitect.co.uk/weblog/archives/2003/04/000142.html
+    19-Jun-2003   8       - Fixed a bug the Oxygen XML Editor spotted in the regexp for RFC-822 dates
+    23-Jun-2003   9       - Added legal boilerplate license text for LGPL.
+                          - Minor formatting changes.
+    24-Jun-2003  10       - Missing types for item/title and item/description - Spotted by Andreas Schwotzer.
+    01-Jan-2008  11       - Copy made available under the Microsoft Public License (MS-PL).
+    25-May-2008  12       - Bug fix 10231 from Ken Gruven - channel can contain zero or more items.
+    06-Sep-2008  13       - Fixed tab-space whitespace issues. Now always use spaces. 
+                          - Undid the fix for bug-fix 10231 since it made the schema non-deterministic 
+                            with respect to extensibility eleemnts in tRssChannel - need to reconsider the fix.
+    08-Sep-2008  14       - Removed 't' prefixes from type names to improve class names 
+                            that get code-generated from the schema. 
+    22-Sep-2008  15       - Move type def for rss element in-line for improved compativility with Java 1.6 tools.
+    01-Nov-2008  16       - Added the missing rating element from the spec to RssChannel.
+    -->
+
+</xs:schema>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/AllowedAttributetypesXML.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/AllowedAttributetypesXML.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/AllowedAttributetypesXML.java	(revision 5961)
@@ -0,0 +1,31 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.components.AllowedAttributetypesType;
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ *
+ * @author olhsha
+ */
+@XmlRootElement(name = "CMDElement_Types")
+public class AllowedAttributetypesXML {
+    
+    @XmlElement(name="elementType")
+    List<String> _elementTypes;
+
+    public AllowedAttributetypesXML() {
+        AllowedAttributetypesType[] elementTypes = AllowedAttributetypesType.values();
+        _elementTypes = new ArrayList<String>(); 
+        
+        for (AllowedAttributetypesType at : elementTypes) {
+            _elementTypes.add(at.value());
+        };
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/AuthenticationRequiredException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/AuthenticationRequiredException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/AuthenticationRequiredException.java	(revision 5961)
@@ -0,0 +1,18 @@
+package clarin.cmdi.componentregistry;
+
+public class AuthenticationRequiredException extends Exception {
+
+    public AuthenticationRequiredException(String message) {
+        super(message);
+    }
+
+    public AuthenticationRequiredException(String message, Throwable t) {
+        super(message, t);
+    }
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/CMDComponentSpecExpander.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/CMDComponentSpecExpander.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/CMDComponentSpecExpander.java	(revision 5961)
@@ -0,0 +1,133 @@
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import com.google.common.collect.Lists;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public abstract class CMDComponentSpecExpander {
+
+    private final static Logger LOG = LoggerFactory.getLogger(CMDComponentSpecExpander.class);
+    protected final ComponentRegistry registry;
+
+    public CMDComponentSpecExpander(ComponentRegistry registry) {
+        this.registry = registry;
+    }
+
+    /**
+     *
+     * @param cmdComponents a *mutable* list of components
+     * @param id
+     * @throws ComponentRegistryException
+     */
+    public void expandNestedComponent(List<CMDComponentType> cmdComponents, String id) throws ComponentRegistryException {
+        expandNestedComponent(cmdComponents, new HashSet<String>(Collections.singleton(id)));
+    }
+
+    private void expandNestedComponent(List<CMDComponentType> cmdComponents, Collection<String> path) throws ComponentRegistryException {
+        List<CMDComponentType> expanded = new ArrayList<CMDComponentType>();
+        for (CMDComponentType cmdComponentType : cmdComponents) {
+            String componentId = cmdComponentType.getComponentId();
+            if (componentId != null) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("[Level {}] Expanding {}", path.size(), componentId);
+                }
+                if (path.contains(componentId)) {
+                    throw new ComponentRegistryException("Detected recursion in component specification: " + path.toString() + " already contains " + componentId);
+                } else {
+                    Collection<String> newPath = new HashSet<String>(path);
+                    newPath.add(componentId);
+                    // Use uncached components and profiles, because we expand and thus change them this change should not be in the cache.
+                    CMDComponentSpec spec = getUncachedComponent(componentId);
+                    if (spec != null) {
+                        CMDComponentType nested = spec.getCMDComponent();
+                        expandNestedComponent(nested.getCMDComponent(), newPath);
+                        overwriteAttributes(cmdComponentType, nested);
+                        expanded.add(nested);
+                    } else {
+                        // Spec could not be resolved
+                        LOG.warn("Could not resolve referenced component with id " + componentId);
+                        // Add spec itself, without futher expanding
+                        expanded.add(cmdComponentType);
+                    }
+                }
+            } else {
+                // No id = embedded component
+                expandNestedComponent(cmdComponentType.getCMDComponent(), path);
+                expanded.add(cmdComponentType);//no attributes overwritten
+            }
+        }
+        cmdComponents.clear();
+        cmdComponents.addAll(expanded);
+    }
+
+    /**
+     * Copying the cardinality specified in the referenceDeclaration over the
+     * values in the actual component.
+     */
+    private void overwriteAttributes(CMDComponentType referenceDeclaration, CMDComponentType nested) {
+        if (!referenceDeclaration.getCardinalityMax().isEmpty()) {
+            List<String> cardinalityMax = nested.getCardinalityMax();
+            cardinalityMax.clear();
+            cardinalityMax.addAll(referenceDeclaration.getCardinalityMax());
+        }
+        if (!referenceDeclaration.getCardinalityMin().isEmpty()) {
+            List<String> cardinalityMin = nested.getCardinalityMin();
+            cardinalityMin.clear();
+            cardinalityMin.addAll(referenceDeclaration.getCardinalityMin());
+        }
+        nested.setComponentId(referenceDeclaration.getComponentId()); // Setting componentId for better xsd generation.
+    }
+
+    protected CMDComponentSpec expandComponent(String componentId) throws ComponentRegistryException {
+        // Use uncached components and profiles, because we expand and thus change them this change should not be in the cache.
+        CMDComponentSpec result = getUncachedComponent(componentId);//registry.getUncachedComponent(componentId);
+        CMDComponentType cmdComponentType = result.getCMDComponent();
+        expandNestedComponent(cmdComponentType.getCMDComponent(), componentId);
+        return result;
+    }
+
+    protected CMDComponentSpec expandProfile(String profileId) throws ComponentRegistryException {
+        // Use uncached components and profiles, because we expand and thus change them this change should not be in the cache.
+        CMDComponentSpec profileSpec = getUncachedProfile(profileId);
+        expandProfileSpec(profileSpec, profileId);
+        return profileSpec;
+    }
+
+    private void expandProfileSpec(CMDComponentSpec profileSpec, String profileId) throws ComponentRegistryException {
+        // make a temporary list of the root component (singleton)
+        final CMDComponentType rootComponent = profileSpec.getCMDComponent();
+        final ArrayList<CMDComponentType> rootComponentList = Lists.newArrayList(rootComponent);
+        // expand 'all' components
+        expandNestedComponent(rootComponentList, profileId);
+        // put the expanded root back in the profile spec
+        profileSpec.setCMDComponent(rootComponentList.get(0));
+    }
+
+//    protected CMDComponentSpec expandComment(String commentId) throws ComponentRegistryException {
+//        CMDComponentSpec result = getUncachedComment(commentId);
+//        List<CMDComponentType> cmdComponents = result.getCMDComponent();
+//        expandNestedComponent(cmdComponents);
+//        return result;
+//    }
+    /**
+     * Get uncached component from "this" registry and possibly from public
+     * registry. Note: "this" registry can be a user registry.
+     *
+     * @param componentId
+     */
+    protected abstract CMDComponentSpec getUncachedComponent(String componentId) throws ComponentRegistryException;
+
+    protected abstract CMDComponentSpec getUncachedProfile(String profileId) throws ComponentRegistryException;
+//    protected abstract CMDComponentSpec getUncachedComment(String commentId) throws ComponentRegistryException;
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistry.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistry.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistry.java	(revision 5961)
@@ -0,0 +1,255 @@
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.Principal;
+import java.util.List;
+
+/**
+ * @author twagoo@mpi.nl
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public interface ComponentRegistry {
+
+    // Attention! REGISTRY_ID here and the client's Config.REGISTRY_ID must be the same 
+    // If you change REGISTRY_ID here, then change the client's  Config.REGISTRY_ID
+    public static final String REGISTRY_ID = "clarin.eu:cr1:";
+    public static final String PUBLIC_NAME = "Public Registry";
+
+    public Owner getRegistryOwner();
+
+    public void setRegistryOwner(Owner registryOwner);
+
+    public RegistrySpace getRegistrySpace();
+
+    public void setRegistrySpace(RegistrySpace registrySpace);
+
+    public Number getGroupId();
+
+    public void setGroupId(Number groupId);
+
+    public String getGroupName(Number groupId) throws ItemNotFoundException;
+
+    public Number getBaseDescriptionOwnerId(String cmdId);
+
+    public List<Number> getItemGroups(String cmdId);
+
+    /**
+     * @return List of component descriptions ordered by name ascending
+     * @throws ComponentRegistryException
+     */
+    List<ComponentDescription> getComponentDescriptions() throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    ComponentDescription getComponentDescriptionAccessControlled(String id) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    ComponentDescription getComponentDescription(String id) throws ComponentRegistryException, ItemNotFoundException;
+    /**
+     *
+     * @return List of profile descriptions ordered by name ascending
+     * @throws ComponentRegistryException
+     */
+    List<ProfileDescription> getProfileDescriptions() throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    /**
+     *
+     * @return List of profile descriptions ordered by name ascending, only the
+     * ones marked for showing in metadata editor
+     * @throws ComponentRegistryException
+     */
+    List<ProfileDescription> getProfileDescriptionsForMetadaEditor() throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    /**
+     * @param groupId
+     * @return List of profile descriptions ordered by name ascending, only the
+     * ones marked for showing in metadata editor
+     * @throws ComponentRegistryException
+     */
+    List<ProfileDescription> getProfileDescriptionsForMetadaEditor(Number groupId) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    ProfileDescription getProfileDescriptionAccessControlled(String id) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    ProfileDescription getProfileDescription(String id) throws ComponentRegistryException, ItemNotFoundException;
+    
+    CMDComponentSpec getMDProfileAccessControled(String id) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    CMDComponentSpec getMDComponentAccessControlled(String id) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    CMDComponentSpec getMDComponent(String id) throws ComponentRegistryException;
+
+    /**
+     *
+     * @return -1 if profile could not be registered
+     */
+    int register(BaseDescription desc, CMDComponentSpec spec);
+
+    /**
+     *
+     * @param comment
+     * @return -1 if comment could not be registered
+     */
+    int registerComment(Comment comment, String userId) throws ComponentRegistryException, ItemNotFoundException, UserUnauthorizedException, AuthenticationRequiredException;
+
+    /**
+     *
+     * @return -1 if component could not be updated
+     */
+    int update(BaseDescription description, CMDComponentSpec spec, boolean forceUpdate) throws UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    /**
+     *
+     * @return -1 if component could not be published. Published means move from
+     * current (private) workspace to public workspace.
+     */
+    int publish(BaseDescription desc, CMDComponentSpec spec, Principal principal) throws UserUnauthorizedException,  AuthenticationRequiredException, ItemNotFoundException;
+
+    void getMDProfileAsXml(String profileId, OutputStream output) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    void getMDProfileAsXsd(String profileId, OutputStream outputStream) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    void getMDComponentAsXml(String componentId, OutputStream output) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    void getMDComponentAsXsd(String componentId, OutputStream outputStream) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException;
+
+    /**
+     *
+     * @param profileIds
+     * @throws IOException
+     * @throws UserUnauthorizedException thrown when principal does not match
+     * creator of profile
+     * @throws DeleteFailedException
+     */
+    void deleteMDProfile(String profileId) throws IOException, UserUnauthorizedException, AuthenticationRequiredException, ComponentRegistryException, DeleteFailedException, ItemNotFoundException;
+
+    /**
+     *
+     * @param componentId
+     * @param principal
+     * @param forceDelete ignores the fact that the component is still in use by
+     * other components and just deletes.
+     * @throws IOException
+     * @throws UserUnauthorizedException thrown when principal does not match
+     * creator of component
+     * @throws DeleteFailedException
+     */
+    void deleteMDComponent(String componentId, boolean forceDelete) throws IOException, ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException,
+            DeleteFailedException, ItemNotFoundException;
+
+    /**
+     *
+     * @param componentId
+     * @return List of ComponentDescriptions of Components that use the given
+     * Component.
+     */
+    List<ComponentDescription> getUsageInComponents(String componentId) throws ComponentRegistryException;
+
+    /**
+     *
+     * @param componentId
+     * @return List of ProfileDescriptions of Profiles that use the given
+     * Component.
+     */
+    List<ProfileDescription> getUsageInProfiles(String componentId) throws ComponentRegistryException;
+
+    /**
+     * @return {@link ComponentRegistry.PUBLIC_NAME} or name of the user's
+     * workspace
+     */
+    String getName();
+
+    /**
+     *
+     * @return List of profile descriptions ordered by name ascending
+     */
+    List<ProfileDescription> getDeletedProfileDescriptions() throws ComponentRegistryException;
+
+    /**
+     *
+     * @return List of component descriptions ordered by name ascending
+     */
+    List<ComponentDescription> getDeletedComponentDescriptions() throws ComponentRegistryException;
+
+    /**
+     *
+     * @param profileId
+     * @return List of comments fro a specific profile
+     * @throws ComponentRegistryException
+     */
+    List<Comment> getCommentsInProfile(String profileId) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    /**
+     *
+     * @param profileId Id of profile to retrieve comment from
+     * @param commentId Id of comment to retrieve
+     * @return a specific comment from a profile
+     * @throws ComponentRegistryException
+     */
+    Comment getSpecifiedCommentInProfile(String profileId, String commentId) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    /**
+     *
+     * @param componentId
+     * @return List of comments from a specific component
+     * @throws ComponentRegistryException
+     */
+    List<Comment> getCommentsInComponent(String componentId) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    /**
+     *
+     * @param componentId Id of component to retrieve comment from
+     * @param commentId Id of comment to retrieve
+     * @return a specific comment from a component
+     * @throws ComponentRegistryException
+     */
+    Comment getSpecifiedCommentInComponent(String componentId, String commentId) throws ComponentRegistryException, UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+    /**
+     *
+     * @param commentId Id of comment to delete
+     * @param principal User principal
+     * @throws IOException
+     * @throws ComponentRegistryException When comment cannot be successfully
+     * retrieved from registry
+     * @throws UserUnauthorizedException
+     * @throws DeleteFailedException
+     */
+    public void deleteComment(String commentId) throws IOException, UserUnauthorizedException, AuthenticationRequiredException,
+            DeleteFailedException, ItemNotFoundException;
+
+    /**
+     *
+     * @return a component specification expander for this registry
+     */
+    public CMDComponentSpecExpander getExpander();
+
+    /**
+     * Get a list of ids ({@link BaseDescription#getId()}) of all non-deleted
+     * profiles
+     *
+     * @param containedId filter on profiles that contain a reference to this id in their XML content (can be null for no filtering)
+     * @return
+     */
+    List<String> getAllNonDeletedProfileIds(String containedId);
+
+    /**
+     * Get a list of ids ({@link BaseDescription#getId()}) of all non-deleted
+     * components
+     *
+     * @param containedId filter on components that contain a reference to this id in their XML content (can be null for no filtering)
+     * @return
+     */
+    List<String> getAllNonDeletedComponentIds(String containedId);
+
+    Boolean isItemPublic(String id) throws ItemNotFoundException;
+
+    Number makeGroupMember(String principalName, String groupName) throws UserUnauthorizedException, ItemNotFoundException;
+    
+    boolean canCurrentUserAccessDescription(String cmdId) throws ItemNotFoundException, AuthenticationRequiredException;
+
+    //long removeGroupMember(String principalName, String groupName) throws  UserUnauthorizedException, ItemNotFoundException;
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryException.java	(revision 5961)
@@ -0,0 +1,16 @@
+package clarin.cmdi.componentregistry;
+
+public class ComponentRegistryException extends Exception {
+
+    public ComponentRegistryException(String message) {
+	super(message);
+    }
+
+    public ComponentRegistryException(String message, Throwable t) {
+	super(message, t);
+    }
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryFactory.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryFactory.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryFactory.java	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import java.security.Principal;
+import java.util.List;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public interface ComponentRegistryFactory {
+
+    public static final String ANONYMOUS_USER = "anonymous"; //Default shibboleth fallback.
+
+    List<ComponentRegistry> getAllUserRegistries();
+
+    /**
+     * Gets the specified registry
+     *
+     * @param status status of the registry
+     * @param owner owner of the registry. Passing null will assume the authenticated user as a {@link OwnerUser}
+     * @param credentials credentials that authenticate user, can be left null if requested registry has a public status
+     * @return
+     */
+    ComponentRegistry getComponentRegistry(RegistrySpace space, Owner owner, UserCredentials credentials, Number groupId) throws UserUnauthorizedException;
+
+    ComponentRegistry getPublicRegistry();
+    
+    ComponentRegistry getOtherUserComponentRegistry(Principal adminPrincipal, Owner owner);
+    
+    ComponentRegistry getBaseRegistry(UserCredentials credentials);
+
+    RegistryUser getOrCreateUser(UserCredentials credentials);
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryResourceResolver.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryResourceResolver.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentRegistryResourceResolver.java	(revision 5961)
@@ -0,0 +1,52 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.URIResolver;
+import org.apache.xml.resolver.tools.CatalogResolver;
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSResourceResolver;
+import org.xml.sax.InputSource;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class ComponentRegistryResourceResolver implements LSResourceResolver, URIResolver {
+
+    private CatalogResolver catRes = new CatalogResolver();
+
+    @Override
+    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
+	InputSource resolveEntity = catRes.resolveEntity(publicId, systemId);
+	resolveEntity.setEncoding("UTF-8");
+	DOMImplementationLS domImplementation;
+	try {
+	    domImplementation = (DOMImplementationLS) DOMImplementationRegistry.newInstance().getDOMImplementation("LS");
+	} catch (ClassCastException e) {
+	    throw new RuntimeException(e);
+	} catch (ClassNotFoundException e) {
+	    throw new RuntimeException(e);
+	} catch (InstantiationException e) {
+	    throw new RuntimeException(e);
+	} catch (IllegalAccessException e) {
+	    throw new RuntimeException(e);
+	}
+	LSInput lsInput = domImplementation.createLSInput();
+	lsInput.setEncoding("UTF-8");
+	    lsInput.setByteStream(resolveEntity.getByteStream());
+	lsInput.setCharacterStream(resolveEntity.getCharacterStream());
+	return lsInput;
+    }
+
+    @Override
+    public Source resolve(String href, String base) throws TransformerException {
+	return catRes.resolve(href, base);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentStatus.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentStatus.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ComponentStatus.java	(revision 5961)
@@ -0,0 +1,16 @@
+package clarin.cmdi.componentregistry;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public enum ComponentStatus {
+
+   
+    DEVELOPMENT,
+   
+    PRIDUCTION,
+    
+    DEPRECATED;
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/Configuration.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/Configuration.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/Configuration.java	(revision 5961)
@@ -0,0 +1,129 @@
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class Configuration {
+
+    private final static Logger LOG = LoggerFactory.getLogger(Configuration.class);
+    //NOTE: Default values, can be overwritten in applicationContext.xml
+    private String generalComponentSchema = "https://infra.clarin.eu/cmd/general-component-schema.xsd";
+    private String component2SchemaXsl = "https://infra.clarin.eu/cmd/xslt/comp2schema-v2/comp2schema.xsl";//"http://www.clarin.eu/cmd/comp2schema.xsl";
+    private String ccrRestUrl = "https://openskos.meertens.knaw.nl/ccr/api/";
+    private Collection<String> adminUsers = new HashSet<String>();
+    private List<String> displayNameShibbolethKeys = new ArrayList<String>();
+
+    {//Default values
+        displayNameShibbolethKeys.add("displayName");
+        displayNameShibbolethKeys.add("commonName");
+    }
+    private final Map<String, String> schemaLocations = new HashMap<String, String>();
+
+    {//Default values
+        schemaLocations.put(CMDComponentSpec.class.getName(),
+                "http://www.clarin.eu/cmd/ http://infra.clarin.eu/cmd/general-component-schema.xsd");
+    }
+    private final static Configuration INSTANCE = new Configuration();
+
+    private Configuration() {
+    }
+
+    public static Configuration getInstance() {
+        return INSTANCE;
+    }
+
+    public String getComponent2SchemaXsl() {
+        return component2SchemaXsl;
+    }
+
+    public List<String> getDisplayNameShibbolethKeys() {
+        return displayNameShibbolethKeys;
+    }
+
+    public String getGeneralComponentSchema() {
+        return generalComponentSchema;
+    }
+
+    public String getCcrRestUrl() {
+        return ccrRestUrl;
+    }
+
+    public String getSchemaLocation(String key) {
+        return schemaLocations.get(key);
+    }
+
+    public boolean isAdminUser(Principal principal) {
+        if (principal != null) {
+            return principal.getName().trim().length() > 0 // user name must be set (in case an empty entry is in admin users list)
+                    && adminUsers.contains(principal.getName());
+        }
+        return false;
+    }
+
+    public boolean isAdminUser(String name) {
+        if (name != null) {
+            return name.trim().length() > 0 // user name must be set (in case an empty entry is in admin users list)
+                    && adminUsers.contains(name);
+        }
+        return false;
+    }
+
+    public void setAdminUsers(Collection<String> adminUsers) {
+        LOG.debug("Setting adminUsers to {}", Arrays.toString(adminUsers.toArray()));
+        this.adminUsers = adminUsers;
+    }
+
+    /**
+     *
+     * @param adminUsers Whitespace-separated list of admin users
+     */
+    public void setAdminUsersList(String adminUsersList) {
+        String[] adminUsersArray = adminUsersList.trim().split("\\s+");
+        if (LOG.isDebugEnabled()) {
+            LOG.info("Setting adminUsersList to {}", Arrays.toString(adminUsersArray));
+        }
+        setAdminUsers(Arrays.asList(adminUsersArray));
+    }
+
+    public void setComponent2SchemaXsl(String component2SchemaXsl) {
+        LOG.info("Setting component2SchemaXsl to {}", component2SchemaXsl);
+        this.component2SchemaXsl = component2SchemaXsl;
+    }
+
+    public void setComponentSpecSchemaLocation(String componentSpecSchemaLocation) {
+        LOG.info("Setting componentSpecSchemaLocation to {}", componentSpecSchemaLocation);
+        schemaLocations.put(CMDComponentSpec.class.getName(), componentSpecSchemaLocation);
+    }
+
+    public void setDisplayNameShibbolethKeys(List<String> displayNameShibbolethKeys) {
+        LOG.info("Setting displayNameShibbolethKeys to {}", displayNameShibbolethKeys);
+        this.displayNameShibbolethKeys = displayNameShibbolethKeys;
+    }
+
+    public void setGeneralComponentSchema(String generalComponentSchema) {
+        LOG.info("Setting generalComponentSchema to {}", generalComponentSchema);
+        this.generalComponentSchema = generalComponentSchema;
+    }
+
+    public void setCcrRestUrl(String ccrRestUrl) {
+        LOG.info("Setting ccrRestUrl to {}", ccrRestUrl);
+        this.ccrRestUrl = ccrRestUrl;
+    }
+
+    public String[] getAdminUsersArray() {
+        return adminUsers.toArray(new String[0]);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/DatesHelper.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/DatesHelper.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/DatesHelper.java	(revision 5961)
@@ -0,0 +1,152 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.rest.NewAction;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+
+/**
+ * 
+ * @author olhsha
+ */
+public class DatesHelper {
+
+    /**
+     * 
+     * @param dateString
+     *            the value of dateString
+     */
+    public static Date parseWorks(String dateString) {
+	try {
+	    return ComponentUtils.getDate(dateString);
+	} catch (ParseException pe) {
+	    return null;
+	}
+    }
+
+    /**
+     * 
+     * @param date1
+     *            the value of date1
+     * @param date2
+     *            the value of date2
+     * @return -1 if d1 is younger than d2, 1 if d1 is older then d2
+     */
+    public static int compareDateStrings(String date1, String date2) {
+	final Date d1 = parseWorks(date1);
+	final Date d2 = parseWorks(date2);
+	if (d1 == null) {
+	    if (d2 == null) {
+		return 0;
+	    } else {
+		return 1;
+	    }
+	} else {
+	    if (d2 == null) {
+		return -1;
+	    } else {
+		return d2.compareTo(d1);
+	    }
+	}
+    }
+
+    private static SimpleDateFormat getRFC822DATEFORMAT() {
+	SimpleDateFormat RFC822DATEFORMAT = new SimpleDateFormat(
+		"EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z");
+	return RFC822DATEFORMAT;
+    }
+
+    /**
+     * 
+     * @param dateString
+     *            the value of dateString
+     */
+    public static String getRFCDateTime(String dateString) {
+	final Date date = parseWorks(dateString);
+	if (date == null) {
+	    return dateString;
+	} else {
+	    SimpleDateFormat RFC822DATEFORMAT = getRFC822DATEFORMAT();
+	    return RFC822DATEFORMAT.format(date);
+	}
+    }
+
+    /**
+     * 
+     * @param dateString
+     *            the value of dateString
+     */
+    public static String getRFCDateTime(Date date) {
+	if (date == null)
+	    return null;
+	String s = DateFormatUtils.format(date,
+		DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern());
+	return getRFCDateTime(s);
+    }
+
+    public static Date parseRFCDateTime(String dateTime) {
+	SimpleDateFormat RFC822DATEFORMAT = getRFC822DATEFORMAT();
+	Date date;
+	try {
+	    date = RFC822DATEFORMAT.parse(dateTime);
+	    return date;
+	} catch (ParseException e) {
+	    return null;
+	}
+    }
+
+    public static String isoFormat(Date d) {
+	return createNewDate(d.getTime());
+    }
+
+    public static String createNewDate() {
+	return createNewDate(new Date().getTime());
+    }
+
+    public static Date parseIso(String s) {
+	SimpleDateFormat sdf = new SimpleDateFormat(
+		DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern());
+	try {
+	    return sdf.parse(s);
+	} catch (ParseException e) {
+	    return null;
+	}
+    }
+
+    public static String createNewDate(long time) {
+	SimpleDateFormat sdf = new SimpleDateFormat(
+		DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern());
+	return sdf.format(new Date(time));
+    }
+
+    public static String formatXmlDateTime(Date date) {
+	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZZ");
+	sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+	String s = sdf.format(date);
+	s = s.substring(0, s.length() - 2) + ":" + s.substring(s.length() - 2);
+	return s;
+    }
+
+    public static Date parseXmlDateTime(String date) {
+	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ssZZ");
+	sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+	try {
+	    //strip timezone colom
+	    date = date.replaceAll("(.*?T.*?[+-])(\\d\\d):(\\d\\d)", "$1$2$3");
+	    return sdf.parse(date);
+	} catch (ParseException e) {
+	    return null;
+	}
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/DeleteFailedException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/DeleteFailedException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/DeleteFailedException.java	(revision 5961)
@@ -0,0 +1,18 @@
+package clarin.cmdi.componentregistry;
+
+public class DeleteFailedException extends ComponentRegistryException {
+
+    public DeleteFailedException(String message) {
+        super(message);
+    }
+
+    public DeleteFailedException(String message, Throwable t) {
+        super(message, t);
+    }
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/IdSequence.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/IdSequence.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/IdSequence.java	(revision 5961)
@@ -0,0 +1,9 @@
+package clarin.cmdi.componentregistry;
+
+public final class IdSequence {
+    static long current = System.currentTimeMillis();
+
+    static public synchronized long get() {
+        return current++;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ItemNotFoundException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ItemNotFoundException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/ItemNotFoundException.java	(revision 5961)
@@ -0,0 +1,17 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+/**
+ *
+ * @author olhsha
+ */
+public class ItemNotFoundException  extends Exception {
+
+    public ItemNotFoundException(String message) {
+	super(message);
+    }
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/MDMarshaller.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/MDMarshaller.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/MDMarshaller.java	(revision 5961)
@@ -0,0 +1,147 @@
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+public class MDMarshaller implements Serializable {
+
+    private final static Logger LOG = LoggerFactory.getLogger(MDMarshaller.class);
+    /**
+     * I define W3C_XML_SCHEMA_NS_URI here cannot get it from
+     *
+     * @see XMLConstants there is a conflict between stax-api and java5.
+     */
+    private static final String W3C_XML_SCHEMA_NS_URI = "http://www.w3.org/2001/XMLSchema";
+    private Schema generalComponentSchema;
+    private final Templates componentToSchemaTemplates;
+    private final ComponentRegistryResourceResolver resourceResolver;
+
+    public MDMarshaller() throws TransformerException {
+	resourceResolver = new ComponentRegistryResourceResolver();
+	final TransformerFactory transformerFactory = TransformerFactory.newInstance(net.sf.saxon.TransformerFactoryImpl.class.getName(), null);
+	transformerFactory.setURIResolver(resourceResolver);
+	componentToSchemaTemplates = transformerFactory.newTemplates(resourceResolver.resolve(Configuration.getInstance().getComponent2SchemaXsl(), null));
+    }
+
+    /**
+     *
+     * @param docClass
+     * @param inputStream
+     * @param schema to validate against, can be null for no validation.
+     * @return
+     * @throws JAXBException
+     */
+    public <T> T unmarshal(Class<T> docClass, InputStream inputStream, Schema schema) throws JAXBException {
+	String packageName = docClass.getPackage().getName();
+	JAXBContext jc = JAXBContext.newInstance(packageName);
+	Unmarshaller u = jc.createUnmarshaller();
+
+	if (schema != null) {
+	    u.setSchema(schema);
+	}
+	Object unmarshal = u.unmarshal(inputStream);
+	T doc = (T) unmarshal;
+	return doc;
+    }
+
+    /**
+     * Will wrap the Outputstream in a OutputStreamWriter with encoding set to UTF-8. This to make sure profiles are stored correctly.
+     */
+    public <T> void marshal(T marshallableObject, OutputStream out) throws JAXBException, UnsupportedEncodingException {
+	String packageName = marshallableObject.getClass().getPackage().getName();
+	JAXBContext jc = JAXBContext.newInstance(packageName);
+
+	Marshaller m = jc.createMarshaller();
+	m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
+	String schemaLocation = Configuration.getInstance().getSchemaLocation(marshallableObject.getClass().getName());
+	if (schemaLocation != null) {
+	    m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocation);
+	}
+	Writer writer = new OutputStreamWriter(out, "UTF-8");
+	m.marshal(marshallableObject, writer);
+    }
+
+    public synchronized Schema getCMDComponentSchema() {
+	if (generalComponentSchema == null) {
+	    try {
+		SchemaFactory schemaFactory = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
+		schemaFactory.setResourceResolver(new ComponentRegistryResourceResolver());
+		generalComponentSchema = schemaFactory.newSchema(new URL(Configuration.getInstance().getGeneralComponentSchema()));
+	    } catch (MalformedURLException e) {
+		LOG.error("Cannot instantiate schema", e);
+	    } catch (SAXException e) {
+		LOG.error("Cannot instantiate schema", e);
+	    }
+	}
+	return generalComponentSchema;
+    }
+
+    public void generateXsd(CMDComponentSpec spec, OutputStream outputStream) {
+	try {
+	    Transformer transformer = componentToSchemaTemplates.newTransformer();
+	    ByteArrayOutputStream out = new ByteArrayOutputStream();
+	    marshal(spec, out);
+	    ByteArrayInputStream input = new ByteArrayInputStream(out.toByteArray());
+	    transformer.transform(new StreamSource(input), new StreamResult(outputStream));
+	} catch (TransformerConfigurationException e) {
+	    LOG.error("Cannot create Transformer", e);
+	} catch (TransformerException e) {
+	    LOG.error("Cannot transform xml file: " + getSpecId(spec), e);
+	} catch (UnsupportedEncodingException e) {
+	    LOG.error("Error in encoding: ", e);
+	} catch (JAXBException e) {
+	    LOG.error("Cannot marshall spec: " + getSpecId(spec), e);
+	}
+    }
+
+    private String getSpecId(CMDComponentSpec spec) {
+	String result = "";
+	if (spec != null && spec.getHeader() != null) {
+	    result = spec.getHeader().getID();
+	}
+	return result;
+    }
+
+    /**
+     * @param marshallableObject
+     * @return the xml representation of the marshallableObject
+     * @throws jaxb exceptions are wrapped in RuntimeExceptions
+     */
+    public <T> String marshalToString(T marshallableObject) {
+	ByteArrayOutputStream out = new ByteArrayOutputStream();
+	try {
+	    marshal(marshallableObject, out);
+	    return out.toString("UTF-8");
+	} catch (UnsupportedEncodingException e) {
+	    throw new RuntimeException(e);
+	} catch (JAXBException e) {
+	    throw new RuntimeException(e);
+	}
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/NullIdException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/NullIdException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/NullIdException.java	(revision 5961)
@@ -0,0 +1,17 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+/**
+ *
+ * @author olhsha
+ */
+public class NullIdException extends Exception{
+    
+    public NullIdException(String message){
+        super(message);
+    }
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/Owner.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/Owner.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/Owner.java	(revision 5961)
@@ -0,0 +1,14 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public interface Owner {
+
+    Number getId();
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/OwnerUser.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/OwnerUser.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/OwnerUser.java	(revision 5961)
@@ -0,0 +1,41 @@
+package clarin.cmdi.componentregistry;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class OwnerUser implements Owner {
+
+    private final Number id;
+
+    public OwnerUser(Number id) {
+	this.id = id;
+    }
+
+    @Override
+    public Number getId() {
+	return id;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+	if (obj == null) {
+	    return false;
+	}
+	if (getClass() != obj.getClass()) {
+	    return false;
+	}
+	final OwnerUser other = (OwnerUser) obj;
+	if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
+	    return false;
+	}
+	return true;
+    }
+
+    @Override
+    public int hashCode() {
+	int hash = 7;
+	hash = 53 * hash + (this.id != null ? this.id.hashCode() : 0);
+	return hash;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/RegistrySpace.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/RegistrySpace.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/RegistrySpace.java	(revision 5961)
@@ -0,0 +1,21 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+/**
+ *
+ * @author olhsha
+ */
+public enum RegistrySpace {    
+     
+    PRIVATE,    
+    
+    PUBLISHED,
+   
+    GROUP,
+    
+    REVIEW;
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/UserCredentials.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/UserCredentials.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/UserCredentials.java	(revision 5961)
@@ -0,0 +1,74 @@
+package clarin.cmdi.componentregistry;
+
+import java.security.Principal;
+import java.util.List;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+import de.mpg.aai.shhaa.model.AuthAttribute;
+import de.mpg.aai.shhaa.model.AuthAttributes;
+import de.mpg.aai.shhaa.model.AuthPrincipal;
+
+/**
+ * Wrapper class to hold the userPrincipal and a displayName
+ * 
+ */
+public class UserCredentials {
+
+    private final Principal userPrincipal;
+
+    public UserCredentials(Principal userPrincipal) {
+        this.userPrincipal = userPrincipal;
+    }
+
+    public Principal getPrincipal() {
+        return userPrincipal;
+    }
+
+    public String getPrincipalName() {
+        return userPrincipal.getName();
+    }
+
+    public String getPrincipalNameMD5Hex() {
+        return getPrincipalNameMD5Hex(userPrincipal.getName());
+    }
+
+    public static String getPrincipalNameMD5Hex(String name){
+	return DigestUtils.md5Hex(name);
+    }
+
+    public String getDisplayName() {
+        String result = null;
+        if (userPrincipal instanceof AuthPrincipal) {
+            List<String> displayNamesAttributes = Configuration.getInstance().getDisplayNameShibbolethKeys();
+            AuthPrincipal authPrincipal = (AuthPrincipal) userPrincipal;
+            for (String key : displayNamesAttributes) {
+                result = getValue(authPrincipal, key);
+                if (result != null) {
+                    break;
+                }
+            }
+        }
+        if (result == null) {
+            result = getPrincipalName();
+        }
+        return result;
+    }
+
+    private String getValue(AuthPrincipal authPrincipal, String key) {
+        String result = null;
+        AuthAttributes attributes = authPrincipal.getAttribues();
+        if (attributes != null) {
+            AuthAttribute<String> authAttribute = (AuthAttribute<String>) attributes.get(key);
+            if (authAttribute != null) {
+                result = authAttribute.getValue();
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public String toString() {
+	return getPrincipal().toString();
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/UserUnauthorizedException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/UserUnauthorizedException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/UserUnauthorizedException.java	(revision 5961)
@@ -0,0 +1,18 @@
+package clarin.cmdi.componentregistry;
+
+public class UserUnauthorizedException extends Exception {
+
+    public UserUnauthorizedException(String message) {
+        super(message);
+    }
+
+    public UserUnauthorizedException(String message, Throwable t) {
+        super(message, t);
+    }
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AccessDeniedPage.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AccessDeniedPage.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AccessDeniedPage.html	(revision 5961)
@@ -0,0 +1,13 @@
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd">
+<head>
+<title>CMDI ComponentRegistry access denied</title>
+<link rel="stylesheet" type="text/css" href="css/adminstyle.css"/>
+</head>
+<body>
+Access denied you (<b wicket:id="userName">userName</b>) are not a registered admin user. 
+<br />
+<br />
+If you want to become an administrator please sent a request to cmdi@clarin.eu.
+</body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AccessDeniedPage.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AccessDeniedPage.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AccessDeniedPage.java	(revision 5961)
@@ -0,0 +1,38 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import java.security.Principal;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
+
+public class AccessDeniedPage extends WebPage {
+
+    private static final long serialVersionUID = 1L;
+
+    public AccessDeniedPage() {
+        Principal userPrincipal = getWebRequestCycle().getWebRequest().getHttpServletRequest().getUserPrincipal();
+        String userName = "not logged in";
+        if (userPrincipal != null && userPrincipal.getName() != null) {
+            userName = userPrincipal.getName();
+        }
+        add(new Label("userName", userName));
+    }
+
+    @Override
+    protected void configureResponse() {
+        super.configureResponse();
+        getWebRequestCycle().getWebResponse().getHttpServletResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
+    }
+
+    @Override
+    public boolean isVersioned() {
+        return false;
+    }
+
+    @Override
+    public boolean isErrorPage() {
+        return true;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminApp.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminApp.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminApp.java	(revision 5961)
@@ -0,0 +1,23 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
+
+public class AdminApp extends WebApplication {
+
+    @Override
+    protected void init() {
+        super.init();
+        getDebugSettings().setAjaxDebugModeEnabled(false);
+        addComponentInstantiationListener(new SpringComponentInjector(this));
+	
+	mountBookmarkablePage("userSettings", UserSettingsPage.class);
+    }
+
+    @Override
+    public Class<? extends Page> getHomePage() {
+        return AdminHomePage.class;
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminHomePage.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminHomePage.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminHomePage.html	(revision 5961)
@@ -0,0 +1,38 @@
+<html
+    xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd">
+    <head>
+        <title>CMDI ComponentRegistry Admin Page</title>
+        <link rel="stylesheet" type="text/css" href="css/adminstyle.css"/>
+    </head>
+    <body>
+        <span wicket:id="message"></span>
+
+        <div class="links">
+            <span wicket:id="linksMessage"></span>
+            <a wicket:id="groups">Manage groups</a>
+            <a wicket:id="massMigrate">MassMigrate</a>
+            <a wicket:id="log">View Log</a>
+            <a wicket:id="statistics">View Statistics</a>
+        </div>
+        <div class="container">
+            <div class="treeView">
+                <a wicket:id="expandAll">[expand all]</a>
+                <a wicket:id="collapseAll">[collapse all]</a>
+                <span wicket:id="tree">tree</span>
+            </div>
+            <div class="infoView">
+                <div id="feedbackPanel">
+                    <span wicket:id="feedback"></span>
+                </div>
+                <form wicket:id="form">
+                    <button wicket:id="delete" title="Press delete button to delete this item">delete</button>
+                    <button wicket:id="undelete" title="Press undelete button to put this item back in the registry">undelete</button>
+                    <input type="checkbox" wicket:id="forceUpdate" />forceUpdate
+                    <button wicket:id="submit">submit edit changes</button>
+                    <textarea  class="descriptionTextArea" wicket:id="description" >text</textarea>
+                    <textarea  class="contentTextArea" wicket:id="content" >text</textarea>
+                </form>
+            </div>
+        </div>
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminHomePage.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminHomePage.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminHomePage.java	(revision 5961)
@@ -0,0 +1,308 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import java.security.Principal;
+import java.util.List;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeModel;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.markup.html.tree.BaseTree;
+import org.apache.wicket.markup.html.tree.ITreeState;
+import org.apache.wicket.markup.html.tree.LinkTree;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.impl.database.AdminRegistry;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+
+@SuppressWarnings("serial")
+public class AdminHomePage extends SecureAdminWebPage {
+
+    private static final long serialVersionUID = 1L;
+    private final static Logger LOG = LoggerFactory.getLogger(AdminHomePage.class);
+    private final CMDItemInfo info;
+    private LinkTree tree;
+    private transient AdminRegistry adminRegistry = new AdminRegistry();
+    @SpringBean(name = "componentRegistryFactory")
+    private ComponentRegistryFactory componentRegistryFactory;
+    @SpringBean
+    private ComponentDao componentDao;
+    @SpringBean
+    private MDMarshaller marshaller;
+
+    public AdminHomePage(final PageParameters parameters) throws ComponentRegistryException, ItemNotFoundException {
+        super(parameters);
+        adminRegistry.setComponentRegistryFactory(componentRegistryFactory);
+        adminRegistry.setComponentDao(componentDao);
+        adminRegistry.setMarshaller(marshaller);
+        info = new CMDItemInfo(marshaller);
+        addLinks();
+        final FeedbackPanel feedback = new FeedbackPanel("feedback");
+        feedback.setOutputMarkupId(true);
+        add(feedback);
+        Form form = new ItemEditForm("form");
+        add(form);
+
+        Button deleteButton = new AjaxFallbackButton("delete", form) {
+            @Override
+            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+                CMDItemInfo info = (CMDItemInfo) form.getModelObject();
+                info("deleting:" + info.getName());
+                Principal userPrincipal = getWebRequest().getHttpServletRequest().getUserPrincipal();
+                try {
+                    adminRegistry.delete(info, userPrincipal);
+                    info("Item deleted.");
+                    reloadTreeModel(info);
+                } catch (Exception e) {
+                    LOG.error("Admin: ", e);
+                    error("Cannot delete: " + info.getName() + "\n error=" + e);
+                }
+                if (target != null) {
+                    target.addComponent(form);
+                    target.addComponent(tree);
+                    target.addComponent(feedback);
+                }
+            }
+
+            @Override
+            public boolean isEnabled() {
+                return info.isDeletable();
+
+            }
+        ;
+        };
+	form.add(deleteButton);
+
+        Button undeleteButton = new AjaxFallbackButton("undelete", form) {
+            @Override
+            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+                CMDItemInfo info = (CMDItemInfo) form.getModelObject();
+                info("undeleting:" + info.getName());
+                try {
+                    adminRegistry.undelete(info);
+                    info("Item put back.");
+                    reloadTreeModel(info);
+                } catch (Exception e) {
+                    LOG.error("Admin: ", e);
+                    error("Cannot undelete: " + info.getName() + "\n error=" + e);
+                }
+                if (target != null) {
+                    target.addComponent(form);
+                    target.addComponent(tree);
+                    target.addComponent(feedback);
+                }
+            }
+
+            @Override
+            public boolean isEnabled() {
+                return info.isUndeletable();
+            }
+        };
+        form.add(undeleteButton);
+
+        CheckBox forceUpdateCheck = new CheckBox("forceUpdate");
+        form.add(forceUpdateCheck);
+
+        Button submitButton = new AjaxFallbackButton("submit", form) {
+            @Override
+            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+                CMDItemInfo info = (CMDItemInfo) form.getModelObject();
+                Principal userPrincipal = getWebRequest().getHttpServletRequest().getUserPrincipal();
+                info("submitting:" + info.getName() + " id=(" + info.getDataNode().getDescription().getId() + ")");
+                try {
+                    adminRegistry.submitFile(info, userPrincipal);
+                    info("submitting done.");
+                    reloadTreeModel(info);
+                } catch (Exception e) {
+                    LOG.error("Admin: ", e);
+                    error("Cannot submit: " + info.getName() + "\n error=" + e);
+                }
+                if (target != null) {
+                    target.addComponent(form);
+                    target.addComponent(tree);
+                    target.addComponent(feedback);
+                }
+            }
+
+            @Override
+            public boolean isEnabled() {
+                return info.isEditable();
+            }
+        };
+        form.add(submitButton);
+
+
+
+
+        try {
+            tree = createTree("tree", form, createDBTreeModel());
+            add(tree);
+            add(new Link("expandAll") {
+                @Override
+                public void onClick() {
+                    tree.getTreeState().expandAll();
+                }
+            });
+
+            add(new Link("collapseAll") {
+                @Override
+                public void onClick() {
+                    tree.getTreeState().collapseAll();
+                }
+            });
+
+        } catch (UserUnauthorizedException e) {            
+            LOG.error("Admin: ", e);
+            error("Cannot create tree: error = " + e);
+        }
+        
+    }
+
+    private void reloadTreeModel(CMDItemInfo info) throws UserUnauthorizedException, ItemNotFoundException {
+        try {
+            tree.setModelObject(createDBTreeModel());
+        } catch (ComponentRegistryException e) {
+            LOG.error("Admin: ", e);
+            error("Cannot reload tree: " + info.getName() + "\n error=" + e);
+        }
+    }
+
+    @Override
+    protected void addLinks() {
+        add(new Label("linksMessage", "Browse the data below or choose on of the following options:"));
+        add(new Link("massMigrate") {
+            @Override
+            public void onClick() {
+                setResponsePage(MassMigratePage.class);
+            }
+        });
+        add(new Link("groups") {
+
+            @Override
+            public void onClick() {
+                setResponsePage(Groups.class);
+            }
+        });
+        add(new Link("log") {
+            @Override
+            public void onClick() {
+                setResponsePage(ViewLogPage.class);
+            }
+        });
+        add(new Link("statistics") {
+            @Override
+            public void onClick() {
+                setResponsePage(StatisticsPage.class);
+            }
+        });
+    }
+
+    private LinkTree createTree(String id, final Form form, TreeModel treeModel) {
+        final LinkTree adminTree = new LinkTree(id, treeModel) {
+            @Override
+            protected void onNodeLinkClicked(Object node, BaseTree tree, AjaxRequestTarget target) {
+                super.onNodeLinkClicked(node, tree, target);
+                ITreeState treeState = tree.getTreeState();
+                if (treeState.isNodeExpanded(node)) {
+                    treeState.collapseNode(node);
+                } else {
+                    treeState.expandNode(node);
+                }
+                DisplayDataNode dn = (DisplayDataNode) ((DefaultMutableTreeNode) node).getUserObject();
+                info.setDataNode(dn);
+                BaseDescription desc = dn.getDescription();
+                if (desc != null) {
+                    String content = componentDao.getContent(dn.isDeleted(), desc.getId());
+                    info.setContent(content);
+                }
+                if (target != null) {
+                    target.addComponent(form);
+                }
+            }
+        };
+        return adminTree;
+    }
+
+    private class ItemEditForm extends Form<CMDItemInfo> {
+
+        public ItemEditForm(String name) {
+            super(name);
+            CompoundPropertyModel model = new CompoundPropertyModel(info);
+            setModel(model);
+
+            TextArea descriptionArea = new TextArea("description");
+            descriptionArea.setOutputMarkupId(true);
+            add(descriptionArea);
+            TextArea contentArea = new TextArea("content");
+            contentArea.setOutputMarkupId(true);
+            add(contentArea);
+        }
+    }
+
+    private TreeModel createDBTreeModel() throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(new DisplayDataNode("ComponentRegistry", false));
+        DefaultMutableTreeNode publicNode = new DefaultMutableTreeNode(new DisplayDataNode("Public", false));
+        rootNode.add(publicNode);
+        ComponentRegistry publicRegistry = componentRegistryFactory.getPublicRegistry();
+        add(publicNode, publicRegistry);
+        List<ComponentRegistry> userRegistries = componentRegistryFactory.getAllUserRegistries();
+        for (ComponentRegistry registry : userRegistries) {
+            DefaultMutableTreeNode userNode = new DefaultMutableTreeNode(new DisplayDataNode(registry.getName(), false));
+            rootNode.add(userNode);
+            add(userNode, registry);
+        }
+        TreeModel model = new DefaultTreeModel(rootNode);
+        return model;
+    }
+
+    private void add(DefaultMutableTreeNode parent, ComponentRegistry registry) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+        DefaultMutableTreeNode componentsNode = new DefaultMutableTreeNode(new DisplayDataNode("Components", false));
+        parent.add(componentsNode);
+        add(componentsNode, registry.getComponentDescriptions(), false, registry.getRegistrySpace());
+
+        DefaultMutableTreeNode profilesNode = new DefaultMutableTreeNode(new DisplayDataNode("Profiles", false));
+        parent.add(profilesNode);
+        add(profilesNode, registry.getProfileDescriptions(), false, registry.getRegistrySpace());
+
+        DefaultMutableTreeNode deletedCompNode = new DefaultMutableTreeNode(new DisplayDataNode("Deleted Components", true));
+        parent.add(deletedCompNode);
+
+        List<ComponentDescription> deletedComponentDescriptions = registry.getDeletedComponentDescriptions();
+        add(deletedCompNode, deletedComponentDescriptions, true, registry.getRegistrySpace());
+
+        DefaultMutableTreeNode deletedProfNode = new DefaultMutableTreeNode(new DisplayDataNode("Deleted Profiles", true));
+        parent.add(deletedProfNode);
+        List<ProfileDescription> deletedProfileDescriptions = registry.getDeletedProfileDescriptions();
+        add(deletedProfNode, deletedProfileDescriptions, true, registry.getRegistrySpace());
+    }
+
+    private void add(DefaultMutableTreeNode parent, List<? extends BaseDescription> descs, boolean isDeleted, RegistrySpace space) {
+        for (BaseDescription desc : descs) {
+            DefaultMutableTreeNode child = new DefaultMutableTreeNode(new DisplayDataNode(desc.getName(), isDeleted, desc, space));
+            parent.add(child);
+        }
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/CMDItemInfo.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/CMDItemInfo.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/CMDItemInfo.java	(revision 5961)
@@ -0,0 +1,121 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import java.io.Serializable;
+
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+
+public class CMDItemInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private final MDMarshaller marshaller;
+    private String description;
+    private String content;
+    private String name;
+    private boolean forceUpdate = false;
+
+    private DisplayDataNode displayNode;
+
+    private boolean deletable = false;
+    private boolean undeletable = false;
+
+    private boolean editable = false;
+
+    public CMDItemInfo(MDMarshaller marshaller) {
+	this.marshaller = marshaller;
+    }
+    
+    public void setDescription(String descriptionText) {
+        this.description = descriptionText;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        if (displayNode != null) {
+            name = displayNode.toString();
+        }
+        return name;
+    }
+
+    public DisplayDataNode getDataNode() {
+        return displayNode;
+    }
+
+    public void setDataNode(DisplayDataNode dataNode) {
+        this.displayNode = dataNode;
+        setUndeletable(false);
+        setDeletable(false);
+        setEditable(false);
+        setDescription("");
+        setContent("");
+        if (dataNode != null) {
+            BaseDescription desc = dataNode.getDescription();
+            if (desc != null) {
+                String contentDescr = marshaller.marshalToString(desc);
+                setDescription(contentDescr);
+                setEditable(true);
+                if (dataNode.isDeleted()) {
+                    setUndeletable(true);
+                } else {
+                    setDeletable(true);
+                } 
+            }
+        }
+
+    }
+
+    public void setDeletable(boolean deletable) {
+        this.deletable = deletable;
+    }
+
+    public boolean isDeletable() {
+        return deletable;
+    }
+
+    public void setUndeletable(boolean undeletable) {
+        this.undeletable = undeletable;
+    }
+
+    public boolean isUndeletable() {
+        return undeletable;
+    }
+
+    public boolean isEditable() {
+        return editable;
+    }
+
+    public void setEditable(boolean editable) {
+        this.editable = editable;
+    }
+
+    
+    public RegistrySpace getSpace() {
+	return displayNode.getSpace();
+    }
+	
+    public void setForceUpdate(boolean forceUpdate) {
+        this.forceUpdate = forceUpdate;
+    }
+
+    public boolean isForceUpdate() {
+        return forceUpdate;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/DisplayDataNode.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/DisplayDataNode.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/DisplayDataNode.java	(revision 5961)
@@ -0,0 +1,50 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import clarin.cmdi.componentregistry.ComponentStatus;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import java.io.Serializable;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+
+public class DisplayDataNode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    private final String name;
+    private final boolean isDeleted;
+    private BaseDescription desc;
+    private final RegistrySpace space;
+
+    public DisplayDataNode(String name, boolean isDeleted) {
+	// TODO: what is sensible default status?
+	this(name, isDeleted, null, RegistrySpace.PRIVATE);
+    }
+
+    public DisplayDataNode(String name, boolean isDeleted, BaseDescription desc, RegistrySpace space) {
+	this.name = name;
+	this.isDeleted = isDeleted;
+	this.desc = desc;
+	this.space = space;
+    }
+
+    /**
+     * Can be null for non leaves.
+     *
+     * @return
+     */
+    public BaseDescription getDescription() {
+	return desc;
+    }
+
+    public boolean isDeleted() {
+	return isDeleted;
+    }
+
+    @Override
+    public String toString() {
+	return name;
+    }
+
+    public RegistrySpace getSpace() {
+	return space;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/DisplayNode.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/DisplayNode.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/DisplayNode.java	(revision 5961)
@@ -0,0 +1,17 @@
+package clarin.cmdi.componentregistry.frontend;
+
+public interface DisplayNode {
+
+    public String getContent();
+
+    public boolean hasContent();
+
+    public boolean isDeleted();
+
+    public boolean isEditable();
+
+    public boolean isUserNode();
+
+    public String getId();
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/Groups.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/Groups.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/Groups.html	(revision 5961)
@@ -0,0 +1,64 @@
+<html
+    xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd">
+    <head>
+        <title>CMDI ComponentRegistry Group Management</title>
+        <link rel="stylesheet" type="text/css" href="css/adminstyle.css"/>
+    </head>
+    <body>
+        <span wicket:id="message"></span>
+        <div class="links">
+            <a wicket:id="home">AdminHome</a>
+        </div>
+
+        <hr />
+
+        <h2>New group</h2>
+        <form wicket:id="groupForm">
+            <div wicket:id="feedback"></div>            
+            Group name: <input type="text" wicket:id="name" /> <br />
+            Owner name: <input type="text" wicket:id="owner" /> <br />
+            <input type="submit" value="Create group" />
+        </form>
+
+        <hr />
+
+        <h2>Groups</h2>
+        <form wicket:id="groups">
+            <select wicket:id="group">
+                <option>Group 1</option>
+            </select>
+            <input type="submit" value="Select" />
+        </form>
+
+
+        <div wicket:id="group" style="border: 1px dashed; padding-left: 2em;">
+            <h3>Group <span wicket:id="name">[name]</span></h3>
+
+            <h4>Add member</h4>
+            <form wicket:id="newMember">
+                <div wicket:id="feedback"></div>            
+                Principal name: 
+                <select wicket:id="principal">
+                    <option>user</option>
+                </select>
+                <input type="submit" value="Add member" />
+            </form>
+
+            <h4>Members</h4>
+            <ul>
+                <li wicket:id="members">
+                    <span wicket:id="name">[name]</span>
+                </li>
+            </ul>
+            
+            <hr />
+            
+            <h4>Items in group</h4>
+            <ul>
+                <li wicket:id="items">
+                    <a wicket:id="link"><span wicket:id="id">[name]</span></a>
+                </li>
+            </ul>
+        </div>
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/Groups.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/Groups.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/Groups.java	(revision 5961)
@@ -0,0 +1,248 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.impl.database.GroupService;
+import clarin.cmdi.componentregistry.impl.database.ValidationException;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
+import java.util.Collections;
+import java.util.List;
+import org.apache.wicket.Component;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.link.ExternalLink;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class Groups extends SecureAdminWebPage {
+
+    private final static Logger logger = LoggerFactory.getLogger(Groups.class);
+
+    @SpringBean
+    private GroupService groupService;
+    @SpringBean
+    private UserDao userDao;
+    private final IModel<Long> selectedGroup = new Model<Long>(null);
+
+    public Groups(PageParameters parameters) {
+        super(parameters);
+        addLinks();
+
+        add(createGroupForm("groupForm"));
+        add(createGroupList("groups"));
+        add(createGroupInfo("group"));
+    }
+
+    private Component createGroupForm(String id) {
+        final IModel<String> nameModel = new Model<String>("");
+        final IModel<String> ownerModel = new Model<String>("");
+
+        final Form form = new Form(id) {
+
+            @Override
+            protected void onSubmit() {
+                try {
+                    final long groupId = groupService.createNewGroup(nameModel.getObject(), ownerModel.getObject());
+                    info("Group with id " + groupId + " has been created");
+                } catch (ValidationException ex) {
+                    error(ex.getMessage());
+                }
+            }
+
+        };
+        form.add(new FeedbackPanel("feedback"));
+        form.add(new TextField("name", nameModel).setRequired(true));
+        form.add(new TextField("owner", ownerModel).setRequired(true));
+        return form;
+    }
+
+    private Component createGroupList(String id) {
+        final IModel<String> groupModel = new Model<String>(null);
+        final Form form = new Form(id) {
+
+            @Override
+            protected void onSubmit() {
+                final String groupName = groupModel.getObject();
+                if (groupName != null) {
+                    try {
+                        final Long groupId = (Long) groupService.getGroupIdByName(groupName);
+                        selectedGroup.setObject(groupId);
+                    } catch (ItemNotFoundException ex) {
+                        logger.warn("Could", ex);
+                        selectedGroup.setObject(null);
+                    }
+                }
+            }
+
+        };
+
+        // model for group options
+        final IModel<List<String>> groupsModel = new AbstractReadOnlyModel<List<String>>() {
+
+            @Override
+            public List<String> getObject() {
+                return groupService.listGroupNames();
+            }
+        };
+
+        // group selector
+        final DropDownChoice<String> groupChoice = new DropDownChoice<String>("group", groupModel, groupsModel);
+        groupChoice.setRequired(true);
+        form.add(groupChoice);
+
+        return form;
+    }
+
+    private Component createGroupInfo(String id) {
+        final WebMarkupContainer container = new WebMarkupContainer(id) {
+
+            @Override
+            public boolean isVisible() {
+                return selectedGroup.getObject() != null;
+            }
+
+        };
+
+        container.add(new Label("name", new AbstractReadOnlyModel<String>() {
+
+            @Override
+            public String getObject() {
+                try {
+                    return groupService.getGroupNameById(selectedGroup.getObject());
+                } catch (ItemNotFoundException ex) {
+                    return "NOT FOUND";
+                }
+            }
+        }));
+        container.add(createNewMemberForm("newMember"));
+        container.add(createGroupMembersView("members"));
+        container.add(createItemsView("items"));
+
+        return container;
+    }
+
+    private Form createNewMemberForm(String id) {
+        final IModel<RegistryUser> principalModel = new Model<RegistryUser>(null);
+        final Form memberForm = new Form(id) {
+
+            @Override
+            protected void onSubmit() {
+                try {
+                    final String groupName = groupService.getGroupNameById(selectedGroup.getObject());
+                    groupService.makeMember(principalModel.getObject().getPrincipalName(), groupName);
+                    info("User " + principalModel.getObject() + " added to group");
+                } catch (ItemNotFoundException ex) {
+                    error(ex);
+                }
+            }
+
+        };
+        memberForm.add(new FeedbackPanel("feedback"));
+
+        final IModel<List<RegistryUser>> usersModel = new AbstractReadOnlyModel<List<RegistryUser>>() {
+
+            @Override
+            public List<RegistryUser> getObject() {
+                // return all users sorted by their tostring value (ignoring case)
+                return new Ordering<Object>() {
+
+                    @Override
+                    public int compare(Object t, Object t1) {
+                        return t.toString().compareToIgnoreCase(t1.toString());
+                    }
+
+                }.sortedCopy(userDao.getAllUsers());
+            }
+        };
+
+        final DropDownChoice<RegistryUser> usersChoice = new DropDownChoice<RegistryUser>("principal", principalModel, usersModel);
+        usersChoice.setRequired(true);
+        memberForm.add(usersChoice);
+        return memberForm;
+    }
+
+    private ListView createGroupMembersView(String id) {
+        final IModel<List> membersModel = new AbstractReadOnlyModel<List>() {
+
+            @Override
+            public List getObject() {
+                final Long groupId = selectedGroup.getObject();
+                if (groupId == null) {
+                    return Collections.emptyList();
+                } else {
+                    return groupService.getUsersInGroup(groupId);
+                }
+            }
+        };
+        final ListView membersView = new ListView(id, membersModel) {
+
+            @Override
+            protected void populateItem(ListItem li) {
+                final RegistryUser user = (RegistryUser) li.getModelObject();
+                li.add(new Label("name", user.getName()));
+//                li.add(new Link("remove") {
+//
+//                    @Override
+//                    public void onClick() {
+//                        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+//                    }
+//                });
+            }
+        };
+        return membersView;
+    }
+
+    private ListView createItemsView(String id) {
+        final IModel<List> itemsModel = new AbstractReadOnlyModel<List>() {
+
+            @Override
+            public List getObject() {
+                final Long groupId = selectedGroup.getObject();
+                return Lists.newArrayList(Iterables.concat(
+                        groupService.getComponentIdsInGroup(groupId),
+                        groupService.getProfileIdsInGroup(groupId)));
+            }
+        };
+        final ListView itemsView = new ListView(id, itemsModel) {
+
+            @Override
+            protected void populateItem(ListItem li) {
+                final String id = (String) li.getModelObject();
+                final ExternalLink link = new ExternalLink("link", new AbstractReadOnlyModel<String>() {
+
+                    @Override
+                    public String getObject() {
+                        if (ComponentUtils.isProfileId(id)) {
+                            return "../rest/registry/profiles/" + id;
+                        } else {
+                            return "../rest/registry/components/" + id;
+                        }
+                    }
+                });
+                link.add(new Label("id", li.getModel()));
+                li.add(link);
+            }
+        };
+        return itemsView;
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/MassMigratePage.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/MassMigratePage.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/MassMigratePage.html	(revision 5961)
@@ -0,0 +1,22 @@
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd">
+<head>
+<title>CMDI ComponentRegistry MassMigrate Page</title>
+<link rel="stylesheet" type="text/css" href="css/adminstyle.css"/>
+</head>
+<body>
+<span wicket:id="message"></span>
+<div class="links">
+    <span wicket:id="linksMessage"></span>
+    <a wicket:id="home">AdminHome</a>
+</div>
+
+<span wicket:id="migrate1Label"></span>
+<a wicket:id="migrate1">Migrate</a>
+
+<div id="feedbackPanel">
+    <span wicket:id="feedback"></span>
+</div>  
+
+</body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/MassMigratePage.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/MassMigratePage.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/MassMigratePage.java	(revision 5961)
@@ -0,0 +1,72 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import java.io.Serializable;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
+import org.apache.wicket.feedback.FeedbackMessage;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.basic.MultiLineLabel;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Page that starts up somekind of migration on the underlying data in the
+ * registry. Migrations are usually one off things so do not blindly migrate but
+ * take a little time to know what you are doing. Backing up the data before a
+ * migrate is probably a good idea as well.
+ *
+ */
+@SuppressWarnings("serial")
+public class MassMigratePage extends SecureAdminWebPage {
+
+    private final static Logger LOG = LoggerFactory.getLogger(MassMigratePage.class);
+    private FeedbackPanel feedback;
+//    @SpringBean
+//    private ComponentDescriptionDaoImpl componentDescriptionDao;
+//    @SpringBean
+//    private ProfileDescriptionDaoImpl profileDescriptionDao;
+//    @SpringBean
+//    private UserDaoImpl userDao;
+
+    public MassMigratePage(final PageParameters pageParameters) {
+        super(pageParameters);
+        addLinks();
+        add(new Label("linksMessage", "Do some mass migration or go to:"));
+        feedback = new FeedbackPanel("feedback") {
+
+            @Override
+            protected Component newMessageDisplayComponent(String id, FeedbackMessage message) {
+                Serializable serializable = message.getMessage();
+                MultiLineLabel label = new MultiLineLabel(id, (serializable == null) ? "" : serializable.toString());
+                label.setEscapeModelStrings(getEscapeModelStrings());
+                return label;
+            }
+        };
+        feedback.setOutputMarkupPlaceholderTag(true);
+        add(feedback);
+        addMigrationOptions();
+    }
+
+    private void addMigrationOptions() {
+        add(new Label("migrate1Label", "No migration implemented at the moment..."));
+        add(new IndicatingAjaxLink("migrate1") {
+
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+                if (target != null) {
+                    target.addComponent(feedback);
+                }
+                startMigration();
+            }
+        });
+    }
+
+    private void startMigration() {
+        info("Nothing to migrate...");
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/SecureAdminWebPage.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/SecureAdminWebPage.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/SecureAdminWebPage.java	(revision 5961)
@@ -0,0 +1,37 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import java.security.Principal;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.MultiLineLabel;
+
+import clarin.cmdi.componentregistry.Configuration;
+import org.apache.wicket.markup.html.link.Link;
+
+public abstract class SecureAdminWebPage extends WebPage {
+
+    public SecureAdminWebPage(final PageParameters parameters) {
+        super(parameters);
+        Principal userPrincipal = getUserPrincipal();
+        if (!Configuration.getInstance().isAdminUser(userPrincipal)) {
+            setResponsePage(new AccessDeniedPage());
+        }
+        add(new MultiLineLabel("message", "Component Registry Admin Page.\nYou are logged in as: " + userPrincipal.getName() + ".\n"));
+    }
+
+    protected final Principal getUserPrincipal() {
+	return getWebRequestCycle().getWebRequest().getHttpServletRequest().getUserPrincipal();
+    }
+
+    @SuppressWarnings(value = "serial")
+    protected void addLinks() {
+        add(new Link("home") {
+            @Override
+            public void onClick() {
+                setResponsePage(AdminHomePage.class);
+            }
+        });
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/StatisticsPage.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/StatisticsPage.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/StatisticsPage.html	(revision 5961)
@@ -0,0 +1,51 @@
+<html
+    xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd">
+    <head>
+        <title>CMDI ComponentRegistry Statistics Page</title>
+        <link rel="stylesheet" type="text/css" href="css/adminstyle.css"/>
+    </head>
+    <body>
+        <span wicket:id="message"></span>
+        <div class="links">
+            <a wicket:id="home">AdminHome</a>
+        </div>
+        <br><br><br>
+        <span wicket:id="profilenumbermessage"></span>
+        <table cellspacing="5" class="dataview">
+            <tr>
+                <th align="left">Profile ID</th>
+                <th align="left">Profile name</th>
+<!--                <th align="left">Number of components</th>-->
+                <th align="left">Number of nested components</th>
+                <th align="left">Number of nested elements</th>
+                <th align="left">Number of nested conceptlinks</th>
+            </tr>
+            <tr wicket:id="repeating">
+                <td><span wicket:id="ID">[ID]</span> </td>
+                <td><span wicket:id="profname">[Name]</span> </td>
+<!--                <td><span wicket:id="nrrootcomp">[Number of components]</span> </td>-->
+                <td><span wicket:id="nrcomp">[Number of nested components]</span> </td>
+                <td><span wicket:id="nrprofelem">[Number of nested elements]</span> </td>
+                <td><span wicket:id="nrproflinks">[Number of nested links]</span> </td>
+            </tr>
+        </table>
+        <br><br><br>
+        <span wicket:id="componentnumbermessage"></span>
+        <table cellspacing="5" class="dataview">
+            <tr>
+                <th align="left">Component ID</th>
+                <th align="left">Component name</th>
+                <th align="left">Number of nested components</th>
+                <th align="left">Number of nested elements</th>
+                <th align="left">Number of nested conceptlinks</th>
+            </tr>
+            <tr wicket:id="repeatingcomp">
+                <td><span wicket:id="ID">[ID]</span> </td>
+                <td><span wicket:id="compname">[Name]</span> </td>
+                <td><span wicket:id="nrcomp">[Number of components]</span> </td>
+                <td><span wicket:id="nrelem">[Number of elements]</span> </td>
+                <td><span wicket:id="nrcomplinks">[Number of nested links]</span> </td>
+            </tr>
+        </table>
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/StatisticsPage.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/StatisticsPage.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/StatisticsPage.java	(revision 5961)
@@ -0,0 +1,117 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import clarin.cmdi.componentregistry.components.CMDElementType;
+import clarin.cmdi.componentregistry.impl.database.CMDComponentSpecExpanderDbImpl;
+import clarin.cmdi.componentregistry.impl.database.ComponentRegistryDbImpl;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ *
+ * @author paucas
+ */
+public class StatisticsPage extends SecureAdminWebPage {
+
+    private static final long serialVersionUID = 1L;
+    @SpringBean(name = "componentRegistryFactory")
+    private ComponentRegistryFactory componentRegistryFactory;
+
+    private static class Statistics {
+        private int componentnumber = 0;
+        private int elementcounter = 0;
+        private int conceptlinkcounter = 0;
+    }
+
+    public StatisticsPage(final PageParameters pageParameters) throws IOException, ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+        super(pageParameters);
+        ComponentRegistry registry = componentRegistryFactory.getComponentRegistry(RegistrySpace.PUBLISHED, null, null, null);
+        addLinks();
+        displayStatistics(registry);
+    }
+
+    private void displayStatistics(ComponentRegistry registry) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+        List<ProfileDescription> profileList = registry.getProfileDescriptions();
+        RepeatingView repeating = new RepeatingView("repeating");
+        add(repeating);
+        add(new Label("profilenumbermessage", "Current number of profiles in the component registry: " + profileList.size()));
+        for (ProfileDescription pd : profileList) {
+            displayProfileStatistics(pd, repeating, registry);
+        }
+        List<ComponentDescription> componentList = registry.getComponentDescriptions();
+        RepeatingView repeatingcomp = new RepeatingView("repeatingcomp");
+        add(repeatingcomp);
+        add(new Label("componentnumbermessage", "Current number of components in the component registry: " + componentList.size()));
+        for (ComponentDescription cd : componentList) {
+            displayComponentStatistics(cd, repeatingcomp, registry);
+        }
+    }
+
+    private void displayProfileStatistics(ProfileDescription pd, RepeatingView repeatingview, ComponentRegistry registry) throws ComponentRegistryException {
+        WebMarkupContainer item = new WebMarkupContainer(repeatingview.newChildId());
+        repeatingview.add(item);
+        item.add(new Label("ID", pd.getId()));
+        item.add(new Label("profname", pd.getName()));
+        CMDComponentSpec profile = CMDComponentSpecExpanderDbImpl.expandProfile(pd.getId(), (ComponentRegistryDbImpl) registry);
+        Statistics stats = new Statistics();
+        componentCounter(profile, stats);
+        item.add(new Label("nrcomp", "" + stats.componentnumber));
+        item.add(new Label("nrprofelem", "" + stats.elementcounter));
+        item.add(new Label("nrproflinks", "" + stats.conceptlinkcounter));
+    }
+
+    private void displayComponentStatistics(ComponentDescription cd, RepeatingView repeatingview,  ComponentRegistry registry) throws ComponentRegistryException {
+        WebMarkupContainer item = new WebMarkupContainer(repeatingview.newChildId());
+        repeatingview.add(item);
+        item.add(new Label("ID", cd.getId()));
+        item.add(new Label("compname", cd.getName()));
+        CMDComponentSpec compspec = CMDComponentSpecExpanderDbImpl.expandComponent(cd.getId(), (ComponentRegistryDbImpl) registry);
+        Statistics stats = new Statistics();
+        componentCounter(compspec, stats);
+        item.add(new Label("nrcomp", "" + stats.componentnumber));
+        item.add(new Label("nrelem", "" + stats.elementcounter));
+        item.add(new Label("nrcomplinks", "" + stats.conceptlinkcounter));
+    }
+
+    private void componentCounter(CMDComponentSpec components, Statistics stats) {
+        componentCounter(Collections.singleton(components.getCMDComponent()), stats);
+    }
+    
+    private void componentCounter(Collection<CMDComponentType> components, Statistics stats) {
+        if (components != null) {
+            for (CMDComponentType component : components) {
+                stats.componentnumber++;
+                List<CMDElementType> elementlist = component.getCMDElement();
+                if (elementlist != null) {
+                    stats.elementcounter += elementlist.size();
+                    for (CMDElementType elem : elementlist) {
+                        if (elem.getConceptLink() != null) {
+                            stats.conceptlinkcounter++;
+                        }
+                    }
+                }
+                componentCounter(component.getCMDComponent(), stats);
+            }
+        }
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/SubmitFailedException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/SubmitFailedException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/SubmitFailedException.java	(revision 5961)
@@ -0,0 +1,21 @@
+package clarin.cmdi.componentregistry.frontend;
+
+public class SubmitFailedException extends Exception {
+
+    public SubmitFailedException(String message) {
+        super(message);
+    }
+
+    public SubmitFailedException(Throwable cause) {
+        super(cause);
+    }
+    public SubmitFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1L;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/UserSettingsPage.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/UserSettingsPage.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/UserSettingsPage.html	(revision 5961)
@@ -0,0 +1,27 @@
+<html
+    xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd">
+    <head>
+        <title>CMDI ComponentRegistry Admin Page</title>
+        <link rel="stylesheet" type="text/css" href="css/adminstyle.css"/>
+    </head>
+    <body>
+	<h1>
+	    User settings for <span wicket:id="userName">userName</span>
+	</h1>
+	<div wicket:id="feedback">[Feedback Panel]</div>
+        <form wicket:id="settingsForm">
+	    <p>
+		<label>User display name:</label>
+		<input wicket:id="displayName"/>
+	    </p>
+	    <p>
+		<input type="submit" value="Submit"/>
+	    </p>
+	</form>
+	<hr />
+	<p>
+		<a href="#" onClick="window.close();">Back to Component Registry</a>
+	</p>
+	
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/UserSettingsPage.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/UserSettingsPage.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/UserSettingsPage.java	(revision 5961)
@@ -0,0 +1,84 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry.frontend;
+
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.UserCredentials;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+
+import java.security.Principal;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.protocol.http.WebRequestCycle;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.springframework.beans.BeanUtils;
+import org.springframework.dao.DataAccessException;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class UserSettingsPage extends WebPage {
+
+    @SpringBean
+    private UserDao userDao;
+    @SpringBean(name = "componentRegistryFactory")
+    private ComponentRegistryFactory componentRegistryFactory;
+    private RegistryUser registryUser;
+
+    public UserSettingsPage(PageParameters parameters) {
+	super(parameters);
+
+	Principal userPrincipal = ((WebRequestCycle) (RequestCycle.get())).getWebRequest().getHttpServletRequest().getUserPrincipal();
+	registryUser = componentRegistryFactory.getOrCreateUser(new UserCredentials(userPrincipal));
+
+	add(new Label("userName", registryUser.getPrincipalName()));
+
+	add(new FeedbackPanel("feedback"));
+	add(new SettingsForm("settingsForm"));
+    }
+
+    private class SettingsForm extends Form {
+
+	public SettingsForm(String id) {
+	    super(id);
+
+	    final TextField displayNameField = new RequiredTextField<String>("displayName", new IModel<String>() {
+
+		@Override
+		public String getObject() {
+		    return registryUser.getName();
+		}
+
+		@Override
+		public void setObject(String newName) {
+		    registryUser.setName(newName);
+		    try {
+			RegistryUser u = userDao.findOne(registryUser.getId().longValue());
+			u.setName(newName);
+			userDao.saveAndFlush(u);
+			info("User info has been updated");
+		    } catch (DataAccessException daEx) {
+			error("Database error: " + daEx.getMessage());
+		    }
+		}
+
+		@Override
+		public void detach() {
+		}
+	    });
+	    add(displayNameField);
+	}
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/ViewLogPage.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/ViewLogPage.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/ViewLogPage.html	(revision 5961)
@@ -0,0 +1,18 @@
+<html
+    xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd">
+    <head>
+        <title>CMDI ComponentRegistry View Log Page</title>
+        <link rel="stylesheet" type="text/css" href="css/adminstyle.css"/>
+    </head>
+    <body>
+        <span wicket:id="message"></span>
+        <div class="links">
+            <a wicket:id="home">AdminHome</a>
+        </div>
+	<p>
+	    <span wicket:id="logLabel">Showing final X bytes (or less) of total N in componentregistry.log:</span><br />
+	    [<a wicket:id="logDownloadLink">Download entire log file</a>]
+	</p>
+        <textarea cols="150" rows="50"  wicket:id="logText" >log text</textarea>
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/ViewLogPage.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/ViewLogPage.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/ViewLogPage.java	(revision 5961)
@@ -0,0 +1,103 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.text.NumberFormat;
+import org.apache.log4j.FileAppender;
+import org.apache.log4j.Logger;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.link.DownloadLink;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.Model;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author paucas
+ */
+public class ViewLogPage extends SecureAdminWebPage {
+
+    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ViewLogPage.class);
+
+    public ViewLogPage(final PageParameters pageParameters) {
+        super(pageParameters);
+        addLinks();
+        addLogFileContent();
+    }
+
+    private void addLogFileContent() {
+        final int tailSize = 1000000; // Megabyte
+
+        final NumberFormat numberFormat = NumberFormat.getIntegerInstance();
+        numberFormat.setGroupingUsed(true);
+
+        final File logFile = getLogFile();
+        if (logFile == null) {
+            addErrorValues("Log file not found");
+        } else {
+            try {
+                RandomAccessFile raLogFile = null;
+                try {
+                    raLogFile = geFileTail(logFile, tailSize);
+                    final String content = getLogFileContent(raLogFile);
+
+                    add(new Label("logLabel", String.format("Showing final %s bytes (or less) of total %s in %s:", numberFormat.format(tailSize), numberFormat.format(raLogFile.length()), logFile)));
+                    add(new TextArea("logText", new Model(content)));
+
+                    add(new DownloadLink("logDownloadLink", logFile));
+                } catch (IOException ioEx) {
+                    addErrorValues(ioEx.getMessage());
+                    throw (ioEx);
+                } finally {
+                    if (raLogFile != null) {
+                        raLogFile.close();
+                    }
+                }
+            } catch (IOException ioEx) {
+                logger.error("Error in reading log file", ioEx);
+            }
+        }
+    }
+
+    private void addErrorValues(String message) {
+        add(new Label("logLabel", "Could not read from log file. See error message below."));
+        add(new TextArea("logText", new Model(message)));
+        add(new DownloadLink("logDownloadLink", new File("")).setEnabled(false));
+    }
+
+    private String getLogFileContent(final RandomAccessFile randomAccessFile) throws IOException {
+        String currentLine;
+        StringBuilder contentBuilder = new StringBuilder();
+        while ((currentLine = randomAccessFile.readLine()) != null) {
+            contentBuilder.append(currentLine).append("\n");
+        }
+        String content = contentBuilder.toString();
+        return content;
+    }
+
+    private RandomAccessFile geFileTail(File logFile, int tailLength) throws IOException, FileNotFoundException {
+        // Skip to tail of file
+        final RandomAccessFile raLogFile = new RandomAccessFile(logFile, "r");
+        final long startPosition = raLogFile.length() - tailLength;
+        if (startPosition > 0) {
+            raLogFile.seek(startPosition);
+            // Read until end of line so we don't end up halfway some random line
+            raLogFile.readLine();
+        }
+        return raLogFile;
+    }
+
+    private File getLogFile() {
+        // Get file from appender
+        final FileAppender appender = (FileAppender) Logger.getRootLogger().getAppender("FILE");
+        if (appender != null) {
+            return new File(appender.getFile());
+        }
+        return null;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/ComponentRegistryImplBase.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/ComponentRegistryImplBase.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/ComponentRegistryImplBase.java	(revision 5961)
@@ -0,0 +1,95 @@
+package clarin.cmdi.componentregistry.impl;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.JAXBException;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec.Header;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public abstract class ComponentRegistryImplBase implements ComponentRegistry {
+
+    private final static Logger LOG = LoggerFactory.getLogger(ComponentRegistryImplBase.class);
+
+    protected abstract MDMarshaller getMarshaller();
+
+    /**
+     *
+     * @return List of profile descriptions ordered by name ascending, only the
+     * ones marked for showing in metadata editor
+     * @throws ComponentRegistryException
+     */
+    @Override
+    public List<ProfileDescription> getProfileDescriptionsForMetadaEditor() throws ComponentRegistryException {
+        // TODO: Below can also be done by accepting and passing a parameter in the ProfileDescriptionDaoImpl, should have *much* better performance
+
+        // Get all profile descriptions
+        List<String> descriptionsCollectionIds = getAllNonDeletedProfileIds(null);
+        // Filter out ones that do should not be shown for metadata editor
+        ArrayList<ProfileDescription> descriptions = new ArrayList<ProfileDescription>();
+        for (String id : descriptionsCollectionIds) {
+            try {
+                ProfileDescription profile = getProfileDescriptionAccessControlled(id);
+                if (profile.isShowInEditor()) {
+                    descriptions.add(profile);
+                }
+            } catch (AuthenticationRequiredException e) {
+            } catch (UserUnauthorizedException e) {
+            } catch (ItemNotFoundException e) {
+            }
+
+        }
+        // Return filtered list
+        return descriptions;
+    }
+
+    /* HELPER METHODS */
+    protected static String stripRegistryId(String id) {
+        return StringUtils.removeStart(id, ComponentRegistry.REGISTRY_ID);
+    }
+
+    protected static void enrichSpecHeader(CMDComponentSpec spec, BaseDescription description) {
+        Header header = spec.getHeader();
+        header.setID(description.getId());
+        if (StringUtils.isEmpty(header.getName())) {
+            header.setName(description.getName());
+        }
+        if (StringUtils.isEmpty(header.getDescription())) {
+            header.setDescription(description.getDescription());
+        }
+    }
+
+    protected void writeXsd(CMDComponentSpec expandedSpec, OutputStream outputStream) {
+        getMarshaller().generateXsd(expandedSpec, outputStream);
+    }
+
+    protected void writeXml(CMDComponentSpec spec, OutputStream outputStream) {
+        try {
+            getMarshaller().marshal(spec, outputStream);
+        } catch (UnsupportedEncodingException e) {
+            LOG.error("Error in encoding: ", e);
+        } catch (JAXBException e) {
+            LOG.error("Cannot marshall spec: " + spec, e);
+        }
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/ComponentUtils.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/ComponentUtils.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/ComponentUtils.java	(revision 5961)
@@ -0,0 +1,143 @@
+package clarin.cmdi.componentregistry.impl;
+
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.springframework.beans.BeanUtils;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+
+/**
+ * Utilities for working with {@link BaseDescription}s
+ *
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class ComponentUtils {
+
+    public static boolean isProfileId(String componentId) {
+        return ("" + componentId).startsWith(ProfileDescription.PROFILE_PREFIX);
+    }
+
+    public static boolean isComponentId(String componentId) {
+        return ("" + componentId)
+                .startsWith(ComponentDescription.COMPONENT_PREFIX);
+    }
+
+    public static void copyPropertiesFrom(BaseDescription from, BaseDescription to) {
+        BeanUtils.copyProperties(from, to);
+    }
+
+    public static Date getDate(String registrationDate) throws ParseException {
+        return DateUtils.parseDate(registrationDate,
+                new String[]{DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT
+                    .getPattern()});
+    }
+
+    public static String createPublicHref(String href) {
+        String result = href;
+        if (href != null) {
+            int index = href.indexOf("?");
+            if (index != -1) { // strip off query params the rest should be the
+                // public href.
+                result = href.substring(0, index);
+            }
+        }
+        return result;
+    }
+    /**
+     * Compares two descriptions by the their value as returned by      {@link BaseDescription#getName()
+     * }
+     */
+    public static final Comparator<? super BaseDescription> COMPARE_ON_NAME = new Comparator<BaseDescription>() {
+        @Override
+        public int compare(BaseDescription o1, BaseDescription o2) {
+            int result = 0;
+            if (o1.getName() != null && o2.getName() != null) {
+                result = o1.getName().compareToIgnoreCase(o2.getName());
+            }
+            if (o1.getId() != null && result == 0) {
+                result = o1.getId().compareTo(o2.getId());
+            }
+            return result;
+        }
+    };
+    
+    
+     public static final Comparator<? super Date> COMPARE_ON_DATE = new Comparator<Date>() {
+        /**
+         * @returns 1 if o11 is older than o2, returns -1 if o1 is younger than
+         * o2
+         */
+        @Override
+        public int compare(Date o1, Date o2) {
+            // we need to sort not in standard ascending orde, but in descending, from higher (later date on the top) to the smaller (older date on the bottm)
+            return (- o1.compareTo(o2));
+        }
+    };
+
+    public static ProfileDescription toProfile(BaseDescription baseDescription) throws ComponentRegistryException {
+        if (baseDescription == null) {
+            return null;
+        }
+        if (baseDescription.getId().startsWith(ProfileDescription.PROFILE_PREFIX)) {
+            ProfileDescription copy = new ProfileDescription();
+            BeanUtils.copyProperties(baseDescription, copy);
+            return copy;
+        } else {
+            throw new ComponentRegistryException("The item is not a profile.");
+        }
+    }
+
+    public static ComponentDescription toComponent(BaseDescription baseDescription) throws ComponentRegistryException {
+        if (baseDescription == null) {
+            return null;
+        }
+        if (baseDescription.getId().startsWith(ComponentDescription.COMPONENT_PREFIX)) {
+            ComponentDescription copy = new ComponentDescription();
+            BeanUtils.copyProperties(baseDescription, copy);
+            return copy;
+        } else {
+            throw new ComponentRegistryException("The item is not a component");
+        }
+    }
+
+    public static List<ProfileDescription> toProfiles(
+            List<BaseDescription> baseDescription) {
+        if (baseDescription == null) {
+            return null;
+        }
+        List<ProfileDescription> list = new ArrayList<ProfileDescription>();
+        for (BaseDescription c : baseDescription) {
+            try {
+                list.add(toProfile(c));
+            } catch (ComponentRegistryException e) {
+            }
+        }
+        return list;
+    }
+
+    public static List<ComponentDescription> toComponents(
+            List<BaseDescription> baseDescription) {
+        if (baseDescription == null) {
+            return null;
+        }
+        List<ComponentDescription> list = new ArrayList<ComponentDescription>();
+        for (BaseDescription c : baseDescription) {
+            try {
+                list.add(toComponent(c));
+            } catch (ComponentRegistryException e) {
+            }
+        }
+        return list;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/AdminRegistry.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/AdminRegistry.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/AdminRegistry.java	(revision 5961)
@@ -0,0 +1,159 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import java.io.IOException;
+import java.security.Principal;
+
+import javax.xml.bind.JAXBException;
+
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.DataAccessException;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.DeleteFailedException;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.UserCredentials;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.frontend.CMDItemInfo;
+import clarin.cmdi.componentregistry.frontend.SubmitFailedException;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+
+/**
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+public class AdminRegistry {
+
+    private final static Logger LOG = LoggerFactory
+	    .getLogger(AdminRegistry.class);
+    private ComponentRegistryFactory componentRegistryFactory;
+    private ComponentDao componentDao;
+    private MDMarshaller marshaller;
+
+    public void setComponentRegistryFactory(
+	    ComponentRegistryFactory componentRegistryFactory) {
+	this.componentRegistryFactory = componentRegistryFactory;
+    }
+
+    public void setComponentDao(ComponentDao componentDao) {
+	this.componentDao = componentDao;
+    }
+
+    public void setMarshaller(MDMarshaller marshaller) {
+	this.marshaller = marshaller;
+    }
+
+    public void submitFile(CMDItemInfo info, Principal userPrincipal)
+	    throws SubmitFailedException, UserUnauthorizedException {
+        if (userPrincipal == null) {
+            LOG.info("Null user principal, nothings is submitted.");
+            return;
+        }
+        
+	try {
+	    BaseDescription originalDescription = info.getDataNode()
+		    .getDescription();
+	    BaseDescription description = null;
+	    CMDComponentSpec spec = null;
+	    if (originalDescription.isProfile()) {
+		description = marshaller.unmarshal(ProfileDescription.class,
+			IOUtils.toInputStream(info.getDescription(), "UTF-8"),
+			null);
+	    } else {
+		description = marshaller.unmarshal(ComponentDescription.class,
+			IOUtils.toInputStream(info.getDescription(), "UTF-8"),
+			null);
+	    }
+	    spec = marshaller.unmarshal(CMDComponentSpec.class,
+		    IOUtils.toInputStream(info.getContent(), "UTF-8"), null);
+	    checkId(originalDescription.getId(), description.getId());
+            ComponentRegistry cr = this.getRegistry(new UserCredentials(userPrincipal));
+	    int result = cr.update(description, spec, info.isForceUpdate());
+	    if (result < 0) {
+		throw new SubmitFailedException(
+			"Problem occured while registering, please check the tomcat logs for errors.");
+	    }
+	} catch (JAXBException e) {
+	    throw new SubmitFailedException(e);
+	} catch (IOException e) {
+	    throw new SubmitFailedException(e);
+	} catch (ItemNotFoundException e) {
+	    throw new SubmitFailedException(e);
+	} catch(AuthenticationRequiredException e) {
+            throw new SubmitFailedException(e);
+        }
+    }
+
+    private void checkId(String id, String id2) throws SubmitFailedException {
+	if (id == null || id2 == null || !id.equals(id2)) {
+	    throw new SubmitFailedException(
+		    "Id's do not match up, you cannot edit id's: id1=" + id
+			    + ", id2=" + id2);
+	}
+    }
+
+    public void undelete(CMDItemInfo info) throws SubmitFailedException {
+	BaseDescription desc = info.getDataNode().getDescription();
+	try {
+	    componentDao.setDeleted(desc, false);
+	} catch (DataAccessException e) {
+	    throw new SubmitFailedException("Undelete failed", e);
+	}
+    }
+
+    public void delete(CMDItemInfo info, Principal userPrincipal)
+	    throws SubmitFailedException {
+	String id = info.getName();
+	BaseDescription desc = info.getDataNode().getDescription();
+	try {
+	    this.deleteFromRegistry(userPrincipal, desc, info);
+	    LOG.info("Deleted item: " + id);
+	} catch (IOException e) {
+	    throw new SubmitFailedException(e);
+	} catch (UserUnauthorizedException e) {
+	    throw new SubmitFailedException(e);
+	} catch (DeleteFailedException e) {
+	    throw new SubmitFailedException(e);
+	} catch (ComponentRegistryException e) {
+	    throw new SubmitFailedException(e);
+	} catch (ItemNotFoundException e) {
+	    throw new SubmitFailedException(e);
+	} catch(AuthenticationRequiredException e){
+            throw new SubmitFailedException(e);
+        }
+
+    }
+
+    private void deleteFromRegistry(Principal userPrincipal,
+	    BaseDescription desc, CMDItemInfo info) throws IOException,
+	    UserUnauthorizedException, ComponentRegistryException, ItemNotFoundException, AuthenticationRequiredException {
+        
+        if (userPrincipal == null) {
+           LOG.info("Bnull user principal, nothing is deleted"); 
+           return;
+        }
+        
+	ComponentRegistry registry = this.getRegistry(new UserCredentials(userPrincipal));
+	LOG.info("Deleting item: " + desc);
+	if (desc.isProfile()) {
+	    registry.deleteMDProfile(desc.getId());
+	} else {
+	    registry.deleteMDComponent(desc.getId(), info.isForceUpdate());
+	}
+    }
+
+    private ComponentRegistry getRegistry(UserCredentials credentials) throws UserUnauthorizedException{
+        return componentRegistryFactory.getBaseRegistry(credentials);
+        }
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/CMDComponentSpecCache.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/CMDComponentSpecCache.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/CMDComponentSpecCache.java	(revision 5961)
@@ -0,0 +1,82 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import org.apache.commons.collections.map.LRUMap;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class CMDComponentSpecCache implements Map<String, CMDComponentSpec> {
+
+    private Map<String, CMDComponentSpec> specCacheMap;
+
+    public CMDComponentSpecCache() {
+	specCacheMap = Collections.synchronizedMap(new LRUMap(100));
+    }
+
+    @Override
+    public int size() {
+	return specCacheMap.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+	return specCacheMap.isEmpty();
+    }
+
+    @Override
+    public boolean containsKey(Object key) {
+	return specCacheMap.containsKey(key);
+    }
+
+    @Override
+    public boolean containsValue(Object value) {
+	return specCacheMap.containsKey(value);
+    }
+
+    @Override
+    public CMDComponentSpec get(Object key) {
+	return specCacheMap.get(key);
+    }
+
+    @Override
+    public CMDComponentSpec put(String key, CMDComponentSpec value) {
+	return specCacheMap.put(key, value);
+    }
+
+    @Override
+    public CMDComponentSpec remove(Object key) {
+	return specCacheMap.remove(key);
+    }
+
+    @Override
+    public void putAll(Map<? extends String, ? extends CMDComponentSpec> m) {
+	throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void clear() {
+	throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Set<String> keySet() {
+	throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Collection<CMDComponentSpec> values() {
+	throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Set<Entry<String, CMDComponentSpec>> entrySet() {
+	throw new UnsupportedOperationException("Not supported yet.");
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/CMDComponentSpecExpanderDbImpl.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/CMDComponentSpecExpanderDbImpl.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/CMDComponentSpecExpanderDbImpl.java	(revision 5961)
@@ -0,0 +1,39 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.CMDComponentSpecExpander;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class CMDComponentSpecExpanderDbImpl extends CMDComponentSpecExpander {
+
+    private ComponentRegistryDbImpl dbImplRegistry;
+    
+    public CMDComponentSpecExpanderDbImpl(ComponentRegistryDbImpl registry) {
+        super(registry);
+        dbImplRegistry = registry;
+    }
+
+    public static CMDComponentSpec expandComponent(String componentId, ComponentRegistryDbImpl registry) throws ComponentRegistryException {
+        CMDComponentSpecExpanderDbImpl expander = new CMDComponentSpecExpanderDbImpl(registry);
+        return expander.expandComponent(componentId);
+    }
+
+    public static CMDComponentSpec expandProfile(String profileId, ComponentRegistryDbImpl registry) throws ComponentRegistryException {
+        CMDComponentSpecExpanderDbImpl expander = new CMDComponentSpecExpanderDbImpl(registry);
+        return expander.expandProfile(profileId);
+    }
+
+    @Override
+    protected CMDComponentSpec getUncachedComponent(String componentId) throws ComponentRegistryException {
+        return dbImplRegistry.getUncachedMDComponent(componentId);
+    }
+
+    @Override
+    protected CMDComponentSpec getUncachedProfile(String profileId) throws ComponentRegistryException {
+        return dbImplRegistry.getUncachedMDProfile(profileId);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryBeanFactory.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryBeanFactory.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryBeanFactory.java	(revision 5961)
@@ -0,0 +1,12 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+/**
+ * Interface for a simple service factory (with ComponentRegistry implementation
+ * being the service), required for injecting the dao's into the
+ * component registry instances.
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public interface ComponentRegistryBeanFactory {
+
+    public ComponentRegistryDbImpl getNewComponentRegistry();
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryDbImpl.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryDbImpl.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryDbImpl.java	(revision 5961)
@@ -0,0 +1,1028 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.CMDComponentSpecExpander;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.Configuration;
+import clarin.cmdi.componentregistry.DeleteFailedException;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.Owner;
+import clarin.cmdi.componentregistry.OwnerUser;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import clarin.cmdi.componentregistry.impl.ComponentRegistryImplBase;
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.persistence.jpa.CommentsDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.transform.TransformerException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.dao.DataAccessException;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Implementation of ComponentRegistry that uses Database Acces Objects for
+ * accessing the registry (ergo: a database implementation)
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+@Transactional
+public class ComponentRegistryDbImpl extends ComponentRegistryImplBase implements ComponentRegistry {
+
+    private final static Logger LOG = LoggerFactory.getLogger(ComponentRegistryDbImpl.class);
+    private Owner registryOwner;
+    private RegistrySpace registrySpace;
+    private Number groupId;
+    @Autowired
+    private Configuration configuration;
+    @Autowired
+    @Qualifier("componentsCache")
+    private CMDComponentSpecCache componentsCache;
+    @Autowired
+    @Qualifier("profilesCache")
+    private CMDComponentSpecCache profilesCache;
+    // DAO's
+    @Autowired
+    private ComponentDao componentDao;
+    @Autowired
+    private UserDao userDao;
+    @Autowired
+    private CommentsDao commentsDao;
+    @Autowired
+    private MDMarshaller marshaller;
+    @Autowired
+    private GroupService groupService;
+
+    // 
+    /**
+     * Default constructor, to use this as a (spring) bean. The public registry
+     * by default. Use setRegistryStatus(), setRegistryOwner(), setGroupId() to
+     * make it another kind of registry.
+     *
+     *
+     */
+    public ComponentRegistryDbImpl() throws TransformerException {
+        this.registrySpace = RegistrySpace.PUBLISHED;
+    }
+
+    @Override
+    public Owner getRegistryOwner() {
+        return this.registryOwner;
+    }
+
+    @Override
+    public void setRegistryOwner(Owner registryOwner) {
+        this.registryOwner = registryOwner;
+    }
+
+    @Override
+    public RegistrySpace getRegistrySpace() {
+        return this.registrySpace;
+    }
+
+    @Override
+    public void setRegistrySpace(RegistrySpace registrySpace) {
+        this.registrySpace = registrySpace;
+    }
+
+    @Override
+    public Number getGroupId() {
+        return this.groupId;
+    }
+
+    @Override
+    public void setGroupId(Number groupId) {
+        this.groupId = groupId;
+    }
+
+    @Override
+    public String getGroupName(Number groupId) throws ItemNotFoundException {
+        return groupService.getGroupNameById(groupId.longValue());
+    }
+
+    @Override
+    public Number getBaseDescriptionOwnerId(String cmdId) {
+        BaseDescription bd = componentDao.getByCmdId(cmdId);
+        return bd.getDbUserId();
+    }
+
+    @Override
+    public List<Number> getItemGroups(String cmdId) {
+        List<Group> groups = groupService.getGroupsTheItemIsAMemberOf(cmdId);
+        List<Number> result = new ArrayList<Number>();
+        if (groups != null) {
+            for (Group group : groups) {
+                result.add(group.getId());
+            }
+        }
+        return result;
+    }
+
+    /**
+     * @return The user id, or null if there is no owner or it is not a user.
+     */
+    private Number getUserId() {
+        if (registryOwner instanceof OwnerUser) {
+            return registryOwner.getId();
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public Number makeGroupMember(String principalName, String groupName) throws UserUnauthorizedException, ItemNotFoundException {
+        RegistryUser regOwner = userDao.getPrincipalNameById(registryOwner.getId());
+        if (groupService.isUserOwnerOfGroup(groupName, regOwner.getPrincipalName())
+                || configuration.isAdminUser(regOwner.getPrincipalName())) {
+            return groupService.makeMember(principalName, groupName);
+        } else {
+            throw new UserUnauthorizedException("The registry owner is not the admin or not the owner of the group and cannot add users to the group");
+        }
+    }
+
+//    @Override
+//    public long removeGroupMember(String principalName, String groupName) throws  UserUnauthorizedException, ItemNotFoundException{
+//        RegistryUser regOwner = userDao.getPrincipalNameById(registryOwner.getId());
+//        if  (groupService.isUserOwnerOfGroup(groupName, regOwner.getPrincipalName()) || 
+//                configuration.isAdminUser(regOwner.getPrincipalName())) {
+//        return groupService.removeMember(principalName, groupName);
+//        } else {
+//            throw new UserUnauthorizedException("The registry owner is not the admin or not the owner of the group and cannot add users to the group");
+//        }
+//    }
+    @Override
+    public List<ProfileDescription> getProfileDescriptions() throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+        try {
+            switch (registrySpace) {
+                case PRIVATE:
+                    if (registryOwner == null) {
+                        throw new ComponentRegistryException("Private workspace without owner!");
+                    }
+                    return ComponentUtils.toProfiles(componentDao.getPrivateBaseDescriptions(registryOwner.getId(), ProfileDescription.PROFILE_PREFIX));
+                case GROUP:
+                    return this.getProfileDescriptionsInGroup(groupId);
+                case PUBLISHED:
+                    return ComponentUtils.toProfiles(componentDao.getPublicBaseDescriptions(ProfileDescription.PROFILE_PREFIX));
+                default:
+                    throw new ComponentRegistryException("Unsupported status type" + registrySpace);
+            }
+        } catch (DataAccessException ex) {
+            throw new ComponentRegistryException("Database access error while trying to get profile descriptions", ex);
+        }
+    }
+
+    @Override
+    public Boolean isItemPublic(String id) throws ItemNotFoundException {
+        BaseDescription desc = componentDao.getByCmdId(id);
+        if (desc == null) {
+            String idS = (id == null) ? "null" : id;
+            throw new ItemNotFoundException("The component with the id " + idS + "is not found in the database.");
+        }
+        return desc.isPublic();
+    }
+
+    @Override
+    public ProfileDescription getProfileDescriptionAccessControlled(String id) throws ItemNotFoundException, UserUnauthorizedException, ComponentRegistryException, AuthenticationRequiredException {
+        boolean hasAccess = this.canCurrentUserAccessDescription(id);
+        if (hasAccess) {
+            try {
+                return ComponentUtils.toProfile(componentDao.getByCmdId(id));
+            } catch (DataAccessException ex) {
+                throw new ComponentRegistryException("Database access error while trying to get profile description", ex);
+            }
+        } else {
+            throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given profile");
+        }
+    }
+
+    @Override
+    public ProfileDescription getProfileDescription(String id) throws ComponentRegistryException, ItemNotFoundException {
+        try {
+            final BaseDescription descr = componentDao.getByCmdId(id);
+            if (descr == null) {
+                throw new ItemNotFoundException("Profile not found:" + id);
+            } else {
+                return ComponentUtils.toProfile(descr);
+            }
+        } catch (DataAccessException ex) {
+            throw new ComponentRegistryException("Database access error while trying to get profile description", ex);
+        }
+
+    }
+
+    @Override
+    public List<ComponentDescription> getComponentDescriptions() throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+        try {
+            switch (registrySpace) {
+                case PRIVATE:
+                    if (registryOwner == null) {
+                        throw new ComponentRegistryException("Private workspace without owner!");
+                    }
+                    return ComponentUtils.toComponents(componentDao.getPrivateBaseDescriptions(registryOwner.getId(), ComponentDescription.COMPONENT_PREFIX));
+                case GROUP:
+                    return this.getComponentDescriptionsInGroup(groupId);
+                case PUBLISHED:
+                    return ComponentUtils.toComponents(componentDao.getPublicBaseDescriptions(ComponentDescription.COMPONENT_PREFIX));
+                default:
+                    throw new ComponentRegistryException("Unsupported status type" + registrySpace);
+            }
+        } catch (DataAccessException ex) {
+            throw new ComponentRegistryException("Database access error while trying to get profile descriptions", ex);
+        }
+    }
+
+    @Override
+    public ComponentDescription getComponentDescriptionAccessControlled(String id) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        boolean hasAccess = this.canCurrentUserAccessDescription(id);
+        if (hasAccess) {
+            try {
+                return ComponentUtils.toComponent(componentDao.getByCmdId(id));
+            } catch (DataAccessException ex) {
+                throw new ComponentRegistryException("Database access error while trying to get component description", ex);
+            }
+        } else {
+            throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given component");
+        }
+    }
+
+    @Override
+    public ComponentDescription getComponentDescription(String id) throws ComponentRegistryException, ItemNotFoundException {
+        try {
+            final BaseDescription descr = componentDao.getByCmdId(id);
+            if (descr == null) {
+                throw new ItemNotFoundException("Component not found: " + id);
+            } else {
+                return ComponentUtils.toComponent(descr);
+            }
+        } catch (DataAccessException ex) {
+            throw new ComponentRegistryException("Database access error while trying to get component description", ex);
+        }
+
+    }
+
+    @Override
+    public List<Comment> getCommentsInProfile(String profileId) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        try {
+            if (this.canCurrentUserAccessDescription(profileId)) {
+                final List<Comment> commentsFromProfile = commentsDao.getCommentsFromItem(profileId);
+                this.setCanDeleteInComments(commentsFromProfile);
+                return commentsFromProfile;
+            } else {
+                throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given profile");
+            }
+        } catch (DataAccessException ex) {
+            throw new ComponentRegistryException(
+                    "Database access error while trying to get list of comments from profile", ex);
+        }
+    }
+
+    @Override
+    public Comment getSpecifiedCommentInProfile(String profileId, String commentId)
+            throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        if (this.canCurrentUserAccessDescription(profileId)) {
+            try {
+                Comment comment = commentsDao.findOne(Long.parseLong(commentId));
+                if (comment != null && profileId.equals(comment.getComponentId())) {
+                    this.setCanDeleteInComments(Collections.singleton(comment));
+                    return comment;
+                } else {
+                    throw new ItemNotFoundException("Comment " + commentId + " for the profile " + profileId + " is not found.");
+                }
+            } catch (DataAccessException ex) {
+                throw new ComponentRegistryException("Database access error while trying to get comment from profile", ex);
+            }
+        } else {
+            throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given profile");
+        }
+    }
+
+    @Override
+    public List<Comment> getCommentsInComponent(String componentId)
+            throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        if (this.canCurrentUserAccessDescription(componentId)) {
+            try {
+                final List<Comment> commentsFromComponent = commentsDao.getCommentsFromItem(componentId);
+                this.setCanDeleteInComments(commentsFromComponent);
+                return commentsFromComponent;
+
+            } catch (DataAccessException ex) {
+                throw new ComponentRegistryException(
+                        "Database access error while trying to get list of comments from component", ex);
+            }
+        } else {
+            throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given component");
+        }
+    }
+
+    @Override
+    public Comment getSpecifiedCommentInComponent(String componentId, String commentId)
+            throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        if (this.canCurrentUserAccessDescription(componentId)) {
+            try {
+                Comment comment = commentsDao.findOne(Long.parseLong(commentId));
+                if (comment != null && componentId.equals(comment.getComponentId().toString())) {
+                    this.setCanDeleteInComments(Collections.singleton(comment));
+                    return comment;
+                } else {
+                    throw new ItemNotFoundException("Comment " + commentId + " for the component " + componentId + " is not found.");
+                }
+            } catch (DataAccessException ex) {
+                throw new ComponentRegistryException("Database access error while trying to get comment from component", ex);
+            }
+        } else {
+            throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given component");
+        }
+    }
+
+    /**
+     * Sets the {@link Comment#setCanDelete(boolean) canDelete} property on all
+     * comments in the provided collection for the perspective of the specified
+     * principal. Comment owners (determined by {@link Comment#getUserId() })
+     * and admins can delete, others cannot.
+     *
+     * @param comments comments to configure
+     * @param principal user to configure for
+     * @see Comment#isCanDelete()
+     */
+    private void setCanDeleteInComments(Collection<Comment> comments) {
+        if (registryOwner != null) {
+            final RegistryUser user = userDao.getPrincipalNameById(registryOwner.getId());
+            if (user != null) {
+                final boolean isAdmin = configuration.isAdminUser(user.getPrincipalName());
+                for (Comment comment : comments) {
+                    comment.setCanDelete(isAdmin || comment.getUserId() == registryOwner.getId().longValue());
+                }
+            }
+        }
+    }
+
+    @Override
+    public CMDComponentSpec getMDProfileAccessControled(String id) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        if (this.canCurrentUserAccessDescription(id)) {
+            return this.getMDProfile(id);
+        } else {
+            throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given profile or the profile is not found.");
+        }
+    }
+
+    private CMDComponentSpec getMDProfile(String id) throws ComponentRegistryException {
+        if (id.startsWith(ProfileDescription.PROFILE_PREFIX)) {
+            CMDComponentSpec result = profilesCache.get(id);
+            if (result == null && !profilesCache.containsKey(id)) {
+                result = this.getUncachedMDProfile(id);
+                profilesCache.put(id, result);
+            }
+            return result;
+        } else {
+            throw new ComponentRegistryException("the id " + id + " is not a profile id.");
+        }
+    }
+
+    public CMDComponentSpec getUncachedMDProfile(String id) throws ComponentRegistryException {
+        try {
+            return this.getUncachedMDComponent(id, componentDao);
+        } catch (DataAccessException ex) {
+            throw new ComponentRegistryException("Database access error while trying to get profile", ex);
+        }
+    }
+
+    @Override
+    public CMDComponentSpec getMDComponentAccessControlled(String id) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        if (this.canCurrentUserAccessDescription(id)) {
+            return this.getMDComponent(id);
+        } else {
+            throw new UserUnauthorizedException("The logged-in user (aka registry owner) does not have access the the given component or the component is not found.");
+        }
+    }
+
+    @Override
+    public CMDComponentSpec getMDComponent(String id) throws ComponentRegistryException {
+        if (id.startsWith(ComponentDescription.COMPONENT_PREFIX)) {
+            CMDComponentSpec result = componentsCache.get(id);
+            if (result == null && !componentsCache.containsKey(id)) {
+                result = getUncachedMDComponent(id);
+                componentsCache.put(id, result);
+            }
+            return result;
+        } else {
+            throw new ComponentRegistryException("The id " + id + " is not a component id");
+        }
+    }
+
+    public CMDComponentSpec getUncachedMDComponent(String id) throws ComponentRegistryException {
+        try {
+            return this.getUncachedMDComponent(id, componentDao);
+        } catch (DataAccessException ex) {
+            throw new ComponentRegistryException("Database access error while trying to get component", ex);
+        }
+    }
+
+    @Override
+    public int register(BaseDescription description, CMDComponentSpec spec) {
+        enrichSpecHeader(spec, description);
+        try {
+            String xml = componentSpecToString(spec);
+            // Convert principal name to user record id
+            Number uid = convertUserInDescription(description);
+            componentDao.insertDescription(description, xml, description.isPublic(), uid);
+            invalidateCache(description);
+            return 0;
+        } catch (DataAccessException ex) {
+            LOG.error("Database error while registering component", ex);
+            return -1;
+        } catch (JAXBException ex) {
+            LOG.error("Error while registering component", ex);
+            return -2;
+        } catch (UnsupportedEncodingException ex) {
+            LOG.error("Error while registering component", ex);
+            return -3;
+        }
+    }
+
+    @Override
+    public int registerComment(Comment comment, String principalName) throws ComponentRegistryException, ItemNotFoundException, UserUnauthorizedException, AuthenticationRequiredException {
+        try {
+            if (comment.getComponentId() != null) {
+                if (this.canCurrentUserAccessDescription(comment.getComponentId())) {
+                    // Convert principal name to user record id
+                    Number uid = convertUserIdInComment(comment, principalName);
+                    // Set date to current date
+                    comment.setCommentDate(new Date());
+                    comment.setUserId(uid.longValue());
+                    commentsDao.saveAndFlush(comment);
+
+                } else {
+                    throw new UserUnauthorizedException("The logged-in user cannot access the component/profile with id " + comment.getComponentId());
+                }
+            } else {
+                throw new ComponentRegistryException("The component/profile id for this comment is null.");
+            }
+            return 0;
+        } catch (DataAccessException ex) {
+            LOG.error("Database error while registering component", ex);
+            return -1;
+        }
+    }
+
+    /**
+     * Calling service sets user id to principle. Our task is to convert this to
+     * an id for later reference. If none is set and this is a user's workspace,
+     * set from that user's id.
+     *
+     * It also sets the name in the description according to the display name in
+     * the database.
+     *
+     * @param description Description containing principle name as userId
+     * @return Id (from database)
+     * @throws DataAccessException
+     */
+    private Number convertUserInDescription(BaseDescription description) throws DataAccessException {
+        Number uid = null;
+        String name = null;
+        if (description.getUserId() != null) {
+            RegistryUser user = userDao.getByPrincipalName(description.getUserId());
+            if (user != null) {
+                uid = user.getId();
+                name = user.getName();
+            }
+        } else {
+            uid = getUserId(); // this can be null as well
+        }
+        if (uid != null) {
+            description.setUserId(uid.toString());
+        }
+        if (name != null) {
+            description.setCreatorName(name);
+        }
+        return uid;
+    }
+
+    /**
+     * Calling service sets user id to principle. Our task is to convert this to
+     * an id for later reference. If none is set and this is a user's workspace,
+     * set from that user's id.
+     *
+     * @param comment Comment containing principle name as userId
+     * @return Id (from database)
+     * @throws DataAccessException
+     */
+    private Number convertUserIdInComment(Comment comment, String principalName) throws DataAccessException,
+            ComponentRegistryException {
+        if (principalName != null) {
+            RegistryUser user = userDao.getByPrincipalName(principalName);
+            if (user != null) {
+                Long id = user.getId();
+                if (id != null) {
+                    // Set user id in comment for convenience of calling method
+                    comment.setUserId(id);
+                    // Set name to user's preferred display name
+                    comment.setUserName(user.getName());
+                    return id;
+                } else {
+                    throw new ComponentRegistryException("Cannot find user with principal name: " + principalName);
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public int update(BaseDescription description, CMDComponentSpec spec, boolean forceUpdate) throws UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        try {
+            this.checkAuthorisation(description);
+            this.checkAge(description);
+            // For public components, check if used in other components or
+            // profiles (unless forced)
+            if (!forceUpdate && description.isPublic() && !description.isProfile()) {
+                this.checkStillUsed(description.getId());
+            }
+            componentDao.updateDescription(getIdForDescription(description), description, componentSpecToString(spec));
+            invalidateCache(description);
+            return 0;
+        } catch (JAXBException ex) {
+            LOG.error("Error while updating component", ex);
+            return -1;
+        } catch (UnsupportedEncodingException ex) {
+            LOG.error("Error while updating component", ex);
+            return -1;
+        } catch (IllegalArgumentException ex) {
+            LOG.error("Error while updating component", ex);
+            return -1;
+        } catch (DeleteFailedException e) {
+            LOG.error("Error while updating component", e);
+            return -1;
+        } catch (ComponentRegistryException e) {
+            LOG.error("Error while updating component", e);
+            return -1;
+        }
+    }
+
+    @Override
+    public int publish(BaseDescription desc, CMDComponentSpec spec, Principal principal) throws UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        int result = 0;
+        this.checkAuthorisation(desc);
+        if (desc.isPublic()) { // if already in published
+            // todo
+            desc.setHref(ComponentUtils.createPublicHref(desc.getHref()));
+            Number id = getIdForDescription(desc);
+            try {
+                // Update description & content
+                componentDao.updateDescription(id, desc, componentSpecToString(spec));
+                // Set to public
+                componentDao.setPublished(id, true);
+            } catch (DataAccessException ex) {
+                LOG.error("Database error while updating component", ex);
+                return -1;
+            } catch (JAXBException ex) {
+                LOG.error("Error while updating component", ex);
+                return -2;
+            } catch (UnsupportedEncodingException ex) {
+                LOG.error("Error while updating component", ex);
+                return -3;
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public void getMDProfileAsXml(String profileId, OutputStream output) throws ComponentRegistryException {
+        CMDComponentSpec expandedSpec = CMDComponentSpecExpanderDbImpl.expandProfile(profileId, this);
+        writeXml(expandedSpec, output);
+    }
+
+    @Override
+    public void getMDProfileAsXsd(String profileId, OutputStream outputStream) throws ComponentRegistryException {
+        CMDComponentSpec expandedSpec = CMDComponentSpecExpanderDbImpl.expandProfile(profileId, this);
+        writeXsd(expandedSpec, outputStream);
+    }
+
+    @Override
+    public void getMDComponentAsXml(String componentId, OutputStream output) throws ComponentRegistryException {
+        CMDComponentSpec expandedSpec = CMDComponentSpecExpanderDbImpl.expandComponent(componentId, this);
+        writeXml(expandedSpec, output);
+    }
+
+    @Override
+    public void getMDComponentAsXsd(String componentId, OutputStream outputStream) throws ComponentRegistryException {
+        CMDComponentSpec expandedSpec = CMDComponentSpecExpanderDbImpl.expandComponent(componentId, this);
+        writeXsd(expandedSpec, outputStream);
+    }
+
+    @Override
+    public void deleteMDProfile(String profileId) throws UserUnauthorizedException,
+            DeleteFailedException, ComponentRegistryException, ItemNotFoundException, AuthenticationRequiredException {
+        ProfileDescription desc = getProfileDescriptionAccessControlled(profileId);
+        if (desc != null) {
+            try {
+                this.checkAuthorisation(desc);
+                this.checkAge(desc);
+                componentDao.setDeleted(desc, true);
+                invalidateCache(desc);
+            } catch (DataAccessException ex) {
+                throw new DeleteFailedException("Database access error while trying to delete profile", ex);
+            }
+        }
+    }
+
+    @Override
+    public void deleteMDComponent(String componentId, boolean forceDelete)
+            throws UserUnauthorizedException, DeleteFailedException, ComponentRegistryException, ItemNotFoundException, AuthenticationRequiredException {
+        BaseDescription desc = getComponentDescriptionAccessControlled(componentId);
+        if (desc != null) {
+            try {
+                this.checkAuthorisation(desc);
+                this.checkAge(desc);
+
+                if (!forceDelete) {
+                    checkStillUsed(componentId);
+                }
+                componentDao.setDeleted(desc, true);
+                invalidateCache(desc);
+            } catch (DataAccessException ex) {
+                throw new DeleteFailedException("Database access error while trying to delete component", ex);
+            }
+        }
+    }
+
+    private void invalidateCache(BaseDescription description) {
+        if (description.isProfile()) {
+            profilesCache.remove(description.getId());
+        } else {
+            componentsCache.remove(description.getId());
+        }
+    }
+
+    /**
+     * Looks up description on basis of CMD Id. This will also check if such a
+     * record even exists.
+     *
+     * @param description Description to look up
+     * @return Database id for description
+     * @throws IllegalArgumentException If description with non-existing id is
+     * passed
+     */
+    private Number getIdForDescription(BaseDescription description) throws IllegalArgumentException {
+        Number dbId = null;
+        try {
+            dbId = componentDao.getDbId(description.getId());
+        } catch (DataAccessException ex) {
+            LOG.error("Error getting dbId for component with id " + description.getId(), ex);
+        }
+        if (dbId == null) {
+            throw new IllegalArgumentException("Could not get database Id for description");
+        } else {
+            return dbId;
+        }
+    }
+
+    private String componentSpecToString(CMDComponentSpec spec) throws UnsupportedEncodingException, JAXBException {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        getMarshaller().marshal(spec, os);
+        String xml = os.toString("UTF-8");
+        return xml;
+    }
+
+    private CMDComponentSpec getUncachedMDComponent(String id, ComponentDao dao) {
+        String xml = dao.getContent(false, id);
+        if (xml != null) {
+            try {
+                InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
+                CMDComponentSpec result = getMarshaller().unmarshal(CMDComponentSpec.class, is, null);
+                try {
+                    is.close();
+                    return result;
+                } catch (IOException ex) {
+                    LOG.error("Cannot close the stream", ex);
+                    return result;
+                }
+
+            } catch (JAXBException ex) {
+                LOG.error("Error while unmarshalling", ex);
+            } catch (UnsupportedEncodingException ex) {
+                LOG.error("Exception while reading XML from database", ex);
+            }
+        }
+        return null;
+    }
+
+    private void checkAuthorisation(BaseDescription desc) throws UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        if (!this.canCurrentUserAccessDescription(desc.getId())) {
+            String principalName = (registryOwner != null) ? userDao.getPrincipalNameById(registryOwner.getId()).getPrincipalName() : "null";
+            throw new UserUnauthorizedException("Unauthorized operation user '" + principalName
+                    + "' is not the creator (nor a member of the group, nor an administrator) of the "
+                    + (desc.isProfile() ? "profile" : "component") + "(" + desc + ").");
+        }
+    }
+
+    private void checkAuthorisationComment(Comment desc) throws UserUnauthorizedException {
+        String principalName = userDao.getPrincipalNameById(registryOwner.getId()).getPrincipalName();
+        if (!(this.isOwnerOfComment(desc, principalName) || configuration.isAdminUser(principalName))) {
+            throw new UserUnauthorizedException("Unauthorized operation: user '" + principalName
+                    + "' is not the creator (nor the Administrator) of the comment " + (desc.getId()));
+        }
+    }
+
+//    private boolean isOwnerOfDescription(BaseDescription desc, String principalName) {
+//        String owner = componentDao.getOwnerPrincipalName(getIdForDescription(desc));
+//        return owner != null // If owner is null, no one can be owner
+//                && principalName.equals(owner);
+//    }
+    private boolean isOwnerOfComment(Comment com, String principalName) {
+        long id = Long.parseLong(com.getId());
+        RegistryUser owner = commentsDao.getOwnerOfComment(id);
+        return owner != null // If owner is null, no one can be owner
+                && principalName.equals(owner.getPrincipalName());
+    }
+
+    private void checkAge(BaseDescription desc) throws DeleteFailedException {
+        String principalName = userDao.getPrincipalNameById(registryOwner.getId()).getPrincipalName();
+        if (desc.isPublic() && !configuration.isAdminUser(principalName)) {
+            Date regDate = desc.getRegistrationDate();
+            Calendar calendar = Calendar.getInstance();
+            calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
+            if (regDate.before(calendar.getTime())) { // More then month old
+                throw new DeleteFailedException(
+                        "The "
+                        + (desc.isProfile() ? "profile" : "Ccomponent")
+                        + " is more than a month old and cannot be deleted anymore. It might have been used to create metadata, deleting it would invalidate that metadata.");
+            }
+        }
+    }
+
+    @Override
+    public String getName() {
+        if (this.getRegistrySpace() != null) {
+            if (this.getRegistrySpace().equals(RegistrySpace.PUBLISHED)) {
+                return ComponentRegistry.PUBLIC_NAME;
+            } else {
+                if (this.getRegistrySpace().equals(RegistrySpace.GROUP)) {
+                    if (groupId != null) {
+                        return "Registry of group" + groupId.toString();
+                    } else {
+                        return "Error: Registry of group null.";
+                    }
+                }
+            }
+        };
+        RegistryUser u = userDao.findOne(getUserId().longValue());
+        return "Registry of " + u.getName();
+    }
+
+    @Override
+    public boolean canCurrentUserAccessDescription(String cmdId) throws ItemNotFoundException, AuthenticationRequiredException {
+        if (cmdId == null) {
+            throw new ItemNotFoundException("Item with the null cmdIdentifier.");
+        }
+
+        BaseDescription description = componentDao.getByCmdId(cmdId);
+        if (description == null) {
+            throw new ItemNotFoundException("Item with the id " + cmdId + " is not found.");
+        }
+
+        if (description.isPublic()) {
+            // everyone can access public description
+            return true;
+        } else {
+            final Number userId = getUserId();
+            if (userId == null) {
+                throw new AuthenticationRequiredException("Requested component is not public but no current user");
+            }
+            final RegistryUser user = userDao.findOne(userId.longValue());
+            if (user == null) {
+                return false;
+            }
+
+            if (configuration.isAdminUser(user.getPrincipalName())) {
+                return true;
+            }
+
+            return groupService.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(user, description);
+        }
+    }
+
+    @Override
+    public List<ProfileDescription> getDeletedProfileDescriptions() throws ComponentRegistryException {
+        return ComponentUtils.toProfiles(componentDao.getDeletedDescriptions(getUserId()));
+    }
+
+    @Override
+    public List<ComponentDescription> getDeletedComponentDescriptions() throws ComponentRegistryException {
+        return ComponentUtils.toComponents(componentDao.getDeletedDescriptions(getUserId()));
+    }
+
+    @Override
+    public void deleteComment(String commentId) throws IOException,
+            UserUnauthorizedException, DeleteFailedException, ItemNotFoundException, AuthenticationRequiredException {
+        try {
+            Comment comment = commentsDao.findOne(Long.parseLong(commentId));
+            if (comment != null
+                    // Comment must have an existing (in this registry)
+                    // componentId or profileId
+                    && comment.getComponentId() != null
+                    && this.canCurrentUserAccessDescription(comment.getComponentId())) {
+                this.checkAuthorisationComment(comment);
+                commentsDao.delete(comment);
+            } else {
+                // Comment exists in DB, but component is not in this registry
+                throw new ItemNotFoundException("Comment " + commentId + " cannot be found in specified registry");
+            }
+        } catch (DataAccessException ex) {
+            throw new DeleteFailedException("Database access error while trying to delete component", ex);
+        } catch (NumberFormatException ex) {
+            throw new DeleteFailedException("Illegal comment ID, cannot parse integer", ex);
+        }
+    }
+
+    @Override
+    public CMDComponentSpecExpander getExpander() {
+        return new CMDComponentSpecExpanderDbImpl(this);
+    }
+
+    @Override
+    protected MDMarshaller getMarshaller() {
+        return marshaller;
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+
+    private List<ComponentDescription> getComponentDescriptionsInGroup(Number groupId)
+            throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+
+        String principalName = userDao.getPrincipalNameById(registryOwner.getId()).getPrincipalName();
+        String groupName = groupService.getGroupNameById(groupId.longValue());
+        if (!groupService.userGroupMember(principalName, groupId.longValue())
+                && !groupService.isUserOwnerOfGroup(groupName, principalName)) {
+            throw new UserUnauthorizedException("The user \'" + principalName + "\' does not have access to components of the group " + groupId);
+        }
+
+        List<String> componentIds = componentDao.getAllItemIdsInGroup(ComponentDescription.COMPONENT_PREFIX, groupId.longValue());
+        List<ComponentDescription> components = new ArrayList<ComponentDescription>();
+        for (String id : componentIds) {
+            BaseDescription description = componentDao.getByCmdId(id);
+            if (description != null) {
+                components.add(ComponentUtils.toComponent(description));
+            }
+        }
+        return components;
+    }
+
+    private List<ProfileDescription> getProfileDescriptionsInGroup(Number groupId) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+
+        String principalName = userDao.getPrincipalNameById(registryOwner.getId()).getPrincipalName();
+        String groupName = groupService.getGroupNameById(groupId.longValue());
+        if (!groupService.userGroupMember(principalName, groupId.longValue())
+                && !groupService.isUserOwnerOfGroup(groupName, principalName)) {
+            throw new UserUnauthorizedException("The user \'" + principalName + "\' does not have access to profiles of the group " + groupId);
+        }
+
+        List<String> profileIds = componentDao.getAllItemIdsInGroup(ProfileDescription.PROFILE_PREFIX, groupId.longValue());
+        List<ProfileDescription> profiles = new ArrayList<ProfileDescription>();
+        for (String id : profileIds) {
+            BaseDescription description = componentDao.getByCmdId(id);
+            if (description != null) {
+                profiles.add(ComponentUtils.toProfile(description));
+            }
+        }
+        return profiles;
+    }
+
+    @Override
+    public List<ProfileDescription> getProfileDescriptionsForMetadaEditor(Number groupId) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException {
+        return this.getProfileDescriptionsInGroup(groupId.longValue());
+    }
+
+    @Override
+    public List<String> getAllNonDeletedProfileIds(String containedId) {
+        return componentDao.getAllNonDeletedProfileIds(containedId);
+    }
+
+    @Override
+    public List<String> getAllNonDeletedComponentIds(String containedId) {
+        return componentDao.getAllNonDeletedComponentIds(containedId);
+    }
+
+    @Override
+    public List<ComponentDescription> getUsageInComponents(String componentId) throws ComponentRegistryException {
+        LOG.debug("Checking usage of component {} in components", componentId);
+        List<ComponentDescription> result = new ArrayList<ComponentDescription>();
+        // get the IDs of all non-deleted components that mention the target ID in their XML content
+        List<String> ids = getAllNonDeletedComponentIds(componentId);
+        for (String id : ids) {
+            final CMDComponentSpec spec = getMDComponent(id);
+            // TODO: further checking can be avoided if we can guarantee that there are no false positives
+            if (spec != null && hasComponentId(componentId, spec.getCMDComponent())) {
+                LOG.debug("Component {} used in component {}", componentId, spec.getHeader().getID());
+                try {
+                    result.add(getComponentDescription(id));
+                } catch (ItemNotFoundException ex) {
+                    throw new ComponentRegistryException("Component not found", ex);
+                }
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public List<ProfileDescription> getUsageInProfiles(String componentId) throws ComponentRegistryException {
+        LOG.debug("Checking usage of component {} in profiles", componentId);
+        final List<ProfileDescription> result = new ArrayList<ProfileDescription>();
+        // get the IDs of all non-deleted profiles that mention the target ID in their XML content
+        final List<String> profileIds = getAllNonDeletedProfileIds(componentId);
+        for (String id : profileIds) {
+            final CMDComponentSpec profile = getMDProfile(id);
+            // TODO: further checking can be avoided if we can guarantee that there are no false positives
+            if (profile != null && hasComponentId(componentId, profile.getCMDComponent())) {
+                LOG.debug("Component {} used in profile {}", componentId, profile.getHeader().getID());
+                try {
+                    result.add(getProfileDescription(id));
+                } catch (ItemNotFoundException ex) {
+                    throw new ComponentRegistryException("Profile not found", ex);
+                }
+            }
+        }
+        return result;
+    }
+
+    private static boolean findComponentId(String componentId, List<CMDComponentType> componentReferences) {
+        for (CMDComponentType cmdComponent : componentReferences) {
+            if (hasComponentId(componentId, cmdComponent)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static boolean hasComponentId(String componentId, CMDComponentType cmdComponent) {
+        if (componentId.equals(cmdComponent.getComponentId())) {
+            return true;
+        } else {
+            //recurse over children
+            return findComponentId(componentId, cmdComponent.getCMDComponent());
+        }
+    }
+
+    protected void checkStillUsed(String componentId) throws DeleteFailedException, ComponentRegistryException {
+        final List<String> profileIds = getAllNonDeletedProfileIds(componentId);
+        for (String id : profileIds) {
+            final CMDComponentSpec spec = getMDProfile(id);
+            // TODO: further checking can be avoided if we can guarantee that there are no false positives
+            if (spec != null && hasComponentId(componentId, spec.getCMDComponent())) {
+                LOG.warn("Cannot delete component {}, still used in profile {} and possibly other profiles and/or components", componentId, spec.getHeader().getID());
+                // Profile match - throw
+                throw new DeleteFailedException("Component is still in use by other components or profiles. Request component usage for details.");
+            }
+        }
+
+        // if we get here, profiles are 'clean'
+        LOG.debug("Component {} is not used in any profiles", componentId);
+
+        // get the IDs of all non-deleted profiles that mention the target ID in their XML content
+        final List<String> componentIds = getAllNonDeletedComponentIds(componentId);
+        for (String id : componentIds) {
+            final CMDComponentSpec spec = getMDComponent(id);
+            // TODO: further checking can be avoided if we can guarantee that there are no false positives
+            if (spec != null && hasComponentId(componentId, spec.getCMDComponent())) {
+                LOG.warn("Cannot delete component {}, still used in component {} and possibly other components", componentId, spec.getHeader().getID());
+                // Component match -> throw
+                throw new DeleteFailedException("Component is still in use by one or more other components. Request component usage for details.");
+            }
+        }
+
+        // if we get here, components are 'clean, too'
+        LOG.debug("Component {} is not used in any components", componentId);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryFactoryDbImpl.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryFactoryDbImpl.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryFactoryDbImpl.java	(revision 5961)
@@ -0,0 +1,211 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.Configuration;
+import clarin.cmdi.componentregistry.Owner;
+import clarin.cmdi.componentregistry.OwnerUser;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserCredentials;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+
+/**
+ * Implementation of ComponentRegistryFactory that uses the
+ * ComponentRegistryDbImpl implementation of ComponentRegistry for accessing the
+ * registry
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class ComponentRegistryFactoryDbImpl implements ComponentRegistryFactory {
+
+    private final static Logger LOG = LoggerFactory
+            .getLogger(ComponentRegistryFactoryDbImpl.class);
+    @Autowired
+    private Configuration configuration;
+    @Autowired
+    private ComponentRegistryBeanFactory componentRegistryBeanFactory;
+    @Autowired
+    private UserDao userDao;
+    private ComponentRegistry publicComponentRegistry = null;
+
+    @Override
+    public List<ComponentRegistry> getAllUserRegistries() {
+        // TODO: this probably could use some caching
+        try {
+            List<RegistryUser> users = userDao.getAllUsers();
+            List<ComponentRegistry> registries = new ArrayList<ComponentRegistry>();
+            for (RegistryUser user : users) {
+                registries.add(getNewComponentRegistryForUser(user.getId()));
+            }
+            return registries;
+        } catch (DataAccessException ex) {
+            LOG.error("Could not retrieve users", ex);
+            throw ex;
+        }
+    }
+
+    @Override
+    public ComponentRegistry getComponentRegistry(RegistrySpace space,
+            Owner owner, UserCredentials credentials, Number groupId)
+            throws UserUnauthorizedException {
+
+        switch (space) {
+            case PRIVATE:
+                return this.getPrivateRegistry(owner, credentials);
+            case PUBLISHED:
+                return this.getPublicRegistry();
+            case GROUP:
+                return this.getGroupRegistry(groupId, owner, credentials);
+            default:
+                // TODO: Add support for "review" types
+                throw new UnsupportedOperationException(
+                        "Unsupported component space" + space);
+        }
+    }
+
+    private ComponentRegistry getGroupRegistry(Number groupId, Owner owner, UserCredentials credentials) {
+        if (owner == null || owner instanceof OwnerUser) {
+            RegistryUser user = this.getOrCreateUser(credentials);
+            owner = new OwnerUser(user.getId());
+        }
+        ComponentRegistryDbImpl cr = componentRegistryBeanFactory.getNewComponentRegistry();// default public registry
+        cr.setRegistrySpace(RegistrySpace.GROUP);
+        cr.setRegistryOwner(owner);
+        cr.setGroupId(groupId);
+        return cr;
+    }
+
+    private ComponentRegistry getPrivateRegistry(Owner owner,
+            UserCredentials credentials) throws IllegalArgumentException,
+            DataAccessException, UserUnauthorizedException {
+        if (owner == null || owner instanceof OwnerUser) {
+            RegistryUser user = getOrCreateUser(credentials);
+            if (user != null) {
+                if (owner != null && !user.getId().equals(owner.getId())) {
+                    throw new UserUnauthorizedException(
+                            "User cannot access other user's private registry");
+                }
+
+                try {
+                    return this.getNewComponentRegistryForUser(user.getId());
+                } catch (DataAccessException ex) {
+                    LOG.error("Could not retrieve or create user", ex);
+                    throw ex;
+                }
+            } else {
+                throw new UserUnauthorizedException(
+                        "No user credentials available cannot load userspace.");
+            }
+        } else {
+            // TODO: Support group owners
+            throw new UnsupportedOperationException(
+                    "Group owners not supported");
+        }
+    }
+
+    @Override
+    public ComponentRegistry getOtherUserComponentRegistry(
+            Principal adminPrincipal, Owner owner) {
+        try {
+            RegistryUser user;
+            if (owner instanceof OwnerUser) {
+                user = userDao.findOne(owner.getId().longValue());
+            } else {
+                // TODO: Implement for groups ??? Twan
+                throw new UnsupportedOperationException(
+                        "Groups not implemented yet");
+            }
+            ComponentRegistry result = null;
+            if (user != null) {
+                if (configuration.isAdminUser(adminPrincipal)) {
+                    result = this.getNewComponentRegistryForUser(user.getId());
+                } else {
+                    LOG.info("{} not found in list of {}",
+                            adminPrincipal.getName(),
+                            configuration.getAdminUsersArray().length);
+                    throw new IllegalArgumentException("User "
+                            + adminPrincipal.getName()
+                            + " is not admin user cannot load userspace.");
+                }
+            }
+            return result;
+        } catch (DataAccessException ex) {
+            LOG.error("Could not retrieve user by id", ex);
+            throw ex;
+        }
+    }
+
+    @Override
+    public ComponentRegistry getPublicRegistry() {
+        if (publicComponentRegistry == null) {
+            publicComponentRegistry = this.getNewComponentRegistryForUser(null);
+        }
+        return publicComponentRegistry;
+    }
+
+    private ComponentRegistry getNewComponentRegistryForUser(Number userId) {
+        ComponentRegistryDbImpl componentRegistry = componentRegistryBeanFactory.getNewComponentRegistry();
+        if (userId != null) {
+            OwnerUser ou = new OwnerUser(userId);
+            componentRegistry.setRegistrySpace(RegistrySpace.PRIVATE);
+            componentRegistry.setRegistryOwner(ou);
+            componentRegistry.setGroupId(null);
+        }
+        return componentRegistry;
+    }
+
+    @Override
+    public ComponentRegistryDbImpl getBaseRegistry(UserCredentials credentials) {
+        RegistryUser user = this.getOrCreateUser(credentials);
+        ComponentRegistryDbImpl componentRegistryDbImpl = componentRegistryBeanFactory.getNewComponentRegistry();// default public registry
+        if (user != null) {
+            Number userId = user.getId();
+            Owner owner = new OwnerUser(userId);
+            componentRegistryDbImpl.setRegistrySpace(null);
+            componentRegistryDbImpl.setRegistryOwner(owner);
+            componentRegistryDbImpl.setGroupId(null);
+        }
+        return componentRegistryDbImpl;
+    }
+
+    @Override
+    public RegistryUser getOrCreateUser(UserCredentials credentials) {
+        if (credentials != null
+                && !ANONYMOUS_USER.equals(credentials.getPrincipalName())) {
+            String principalName = credentials.getPrincipalName();
+            return this.getOrCreateUser(principalName, credentials.getDisplayName());
+        }
+        return null;
+    }
+
+    private synchronized RegistryUser getOrCreateUser(String principalName,
+            String displayName) {
+        // Try getting it from db
+        RegistryUser user = userDao.getByPrincipalName(principalName);
+        if (user == null) {
+            LOG.info(
+                    "Request to create user with principal name {} and display name {}",
+                    new Object[]{principalName, displayName});
+            // Create the new user
+            user = new RegistryUser();
+            user.setPrincipalName(principalName);
+            user.setName(displayName);
+            userDao.saveAndFlush(user);
+            // Retrieve from db
+            user = userDao.getByPrincipalName(principalName);
+        }
+        return user;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/GroupService.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/GroupService.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/GroupService.java	(revision 5961)
@@ -0,0 +1,135 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import java.util.List;
+
+import org.springframework.transaction.annotation.Transactional;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.Ownership;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+
+/**
+ * Service for handling groups and component/profile ownership
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+@Transactional
+public interface GroupService {
+
+    /**
+     * Creates a new group. Will fail with an exception if the (normalised) group name already exists
+     * @param name
+     * @param owner
+     * @return ID of group created
+     * @throws ValidationException
+     */
+    long createNewGroup(String name, String ownerPrincipalName) throws ValidationException;
+    
+    /**
+     * Gets groups directly owned by a user
+     * @param ownerPrincipalName
+     * @return
+     */
+    List<Group> getGroupsOwnedByUser(String ownerPrincipalName);
+    
+    /**
+     * Get list of groups of which the provided user is a member of. Does not include
+     * groups he owns but is not a member of.
+     * @param principal
+     * @return
+     */
+    List<Group> getGroupsOfWhichUserIsAMember(String principal);
+    
+    /**
+     * Lists all group names
+     * @return
+     */
+    List<String> listGroupNames();
+
+   
+    boolean isUserOwnerOfGroup(String groupName, String ownerPrincipalName);
+    
+    /**
+     * Add an ownership of a user or group to a profile or component. Will check ownership for plausibility and will fail if that ownership already exists.
+     * Will not fail if user/group/component/profile IDs don't correspond to an existing entry.
+     * @param ownership
+     */
+    void addOwnership(Ownership ownership);
+    
+    /**
+     * Removes an existing ownership. Won't complain if the ownership doesn't exist
+     * @param ownership
+     */
+    void removeOwnership(Ownership ownership);
+    
+    /**
+     * Determines whether a user has read access to a component. Factors that allow access are:
+     * 1. The component is public
+     * 2. The user is the creator
+     * 3. The user has an ownership (see {@link #addOwnership(Ownership)})
+     * 4. The user belongs to a group that has ownership
+     * @param user
+     * @param baseDescription
+     * @return
+     */
+    boolean canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(RegistryUser user, BaseDescription baseDescription);
+
+    /**
+     * Make a user a mamber of a group
+     * @param userName
+     * @param groupName
+     * @return database ID of group membership row
+     */
+    long makeMember(String userName, String groupName) throws ItemNotFoundException;
+    
+   // long removeMember(String userName, String groupName) throws ItemNotFoundException;
+    
+    /**
+     * Move ownership of a component or profile from a user to a group
+     * @param principal name of the owner principal
+     * @param groupName target group name
+     * @param componentId component to transfer
+     */
+    void transferItemOwnershipToGroup(String principal, String groupId, String componentId) throws UserUnauthorizedException;
+
+    /**
+     * Move ownership of a component or profile from a user to a group
+     * @param principal name of the owner principal
+     * @param groupId target group id
+     * @param componentId component to transfer
+     */
+    void transferItemOwnershipFromUserToGroupId(String principal, long groupId, String componentId) throws UserUnauthorizedException;
+
+    /**
+     * Get component IDs in a group
+     * @param groupId
+     * @return
+     */
+    List<String> getComponentIdsInGroup(long groupId);
+
+    /**
+     * Get a list of groups the item is a member of. While it's technically possible for an item to belong to none, one or multiple groups, the transferXOwnerwhip methods make sure
+     * an item belongs only to a single group at most, thus this method returns at most a single group for all practical purposes.
+     * @param itemId
+     * @return List of groups
+     */
+    List<Group> getGroupsTheItemIsAMemberOf(String itemId);
+    
+    /**
+     * Get profile IDs in a group
+     * @param groupId
+     * @return
+     */
+    List<String> getProfileIdsInGroup(long groupId);
+    
+    List<RegistryUser> getUsersInGroup(long groupId);
+    
+    boolean userGroupMember(String principalName, long groupId);
+   
+    public  Number  getGroupIdByName(String groupName) throws ItemNotFoundException;
+    
+    public  String  getGroupNameById(long groupId) throws ItemNotFoundException;
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/GroupServiceImpl.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/GroupServiceImpl.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/GroupServiceImpl.java	(revision 5961)
@@ -0,0 +1,404 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedOperationParameter;
+import org.springframework.jmx.export.annotation.ManagedOperationParameters;
+import org.springframework.jmx.export.annotation.ManagedResource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.GroupMembership;
+import clarin.cmdi.componentregistry.model.Ownership;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.persistence.jpa.GroupDao;
+import clarin.cmdi.componentregistry.persistence.jpa.GroupMembershipDao;
+import clarin.cmdi.componentregistry.persistence.jpa.OwnershipDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import org.springframework.dao.DataAccessException;
+
+/**
+ * Service that manages groups, memberships and ownerships. It exposes some
+ * functions over JMX, that's why some methods use human-friendly names (user
+ * principal names, group names) rather than ID arguments.
+ *
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+@ManagedResource(objectName = "componentregistry:name=GroupService", description = "Operations for managing groups")
+@Service("GroupService")
+@Transactional
+public class GroupServiceImpl implements GroupService {
+
+    @Autowired
+    private GroupDao groupDao;
+    @Autowired
+    private GroupMembershipDao groupMembershipDao;
+    @Autowired
+    private OwnershipDao ownershipDao;
+    @Autowired
+    private ComponentDao componentDao;
+    @Autowired
+    private UserDao userDao;
+
+    public void setGroupDao(GroupDao groupDao) {
+        this.groupDao = groupDao;
+    }
+
+    public void setGroupMembershipDao(GroupMembershipDao groupMembershipDao) {
+        this.groupMembershipDao = groupMembershipDao;
+    }
+
+    public void setOwnershipDao(OwnershipDao ownershipDao) {
+        this.ownershipDao = ownershipDao;
+    }
+
+    @Override
+    public List<Group> getGroupsOwnedByUser(String ownerPrincipalName) {
+        RegistryUser owner = userDao.getByPrincipalName(ownerPrincipalName);
+        return groupDao.findGroupOwnedByUser(owner.getId().longValue());
+    }
+
+    @Override
+    public boolean isUserOwnerOfGroup(String groupName, String ownerPrincipalName) {
+        List<Group> groups = getGroupsOwnedByUser(ownerPrincipalName);
+        for (Group group : groups) {
+            if (group.getName().equals(groupName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private void checkOwnership(Ownership ownership) {
+        if (ownership.getComponentId() == null) {
+            throw new RuntimeException("Ownership needs a componentId");
+        }
+        if (ownership.getUserId() == 0 && ownership.getGroupId() == 0) {
+            throw new RuntimeException("Ownership needs a groupId or userId");
+        }
+        if (ownership.getUserId() != 0 && ownership.getGroupId() != 0) {
+            throw new RuntimeException("Ownership has both a groupId and a userId ");
+        }
+    }
+
+    private void assertOwnershipDoesNotExist(Ownership ownership) {
+        Ownership o = ownershipDao.findOwnershipByGroupAndComponent(ownership.getGroupId(), ownership.getComponentId());
+        if (o != null) {
+            throw new ValidationException("Ownership exists");
+        }
+    }
+
+    @Override
+    public void addOwnership(Ownership ownership) {
+        checkOwnership(ownership);
+        assertOwnershipDoesNotExist(ownership);
+        ownershipDao.save(ownership);
+    }
+
+    @Override
+    public void removeOwnership(Ownership ownership) {
+        throw new RuntimeException("not implemented");
+    }
+
+    protected boolean canUserAccessAbstractDescriptionEitherOnHisOwnOrThroughGroupMembership(RegistryUser user,
+            BaseDescription description) {
+        // TODO make some joins and multi-id queries to speed the entire method
+        // up
+        boolean isProfile = (description instanceof ProfileDescription);
+        long userId = user.getId().longValue();
+        // anyone can access public profile
+        if (componentDao.isPublic(description.getId())) {
+            return true;
+        }
+        // the creator can also access any profile
+        if (description.getUserId().equals(user.getId() + "")) {
+            return true;
+        }
+
+        // a co-ownership on the profile also allows access
+        Ownership ownership = ownershipDao.findOwnershipByUserAndComponent(userId, description.getId());
+        if (ownership != null) {
+            return true;
+        }
+
+        // get a list of groups the user owns and is a member of
+        List<Group> groups = groupDao.findGroupOwnedByUser(userId);
+        Set<Long> groupIds = new HashSet<Long>();
+        for (Group group : groups) {
+            groupIds.add(group.getId());
+        }
+
+        List<GroupMembership> memberships = groupMembershipDao.findGroupsTheUserIsAmemberOf(userId);
+        for (GroupMembership gm : memberships) {
+            groupIds.add(gm.getGroupId());
+        }
+
+        for (Long groupId : groupIds) {
+            ownership = ownershipDao.findOwnershipByGroupAndComponent(groupId, description.getId());
+            if (ownership != null) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(RegistryUser user,
+            BaseDescription baseDescription) {
+        return canUserAccessAbstractDescriptionEitherOnHisOwnOrThroughGroupMembership(user, baseDescription);
+    }
+
+    @Override
+    @ManagedOperation(description = "Make a user member of a group")
+    @ManagedOperationParameters({
+        @ManagedOperationParameter(name = "principalName", description = "Principal name of the user to make a member"),
+        @ManagedOperationParameter(name = "groupName", description = "Name of the group")})
+    public long makeMember(String userPrincipalName, String groupName) throws ItemNotFoundException {
+
+        RegistryUser user = userDao.getByPrincipalName(userPrincipalName);
+
+        if (user == null) {
+            throw new ItemNotFoundException("User with the principal name " + userPrincipalName + " is not found.");
+        }
+        Group group = groupDao.findGroupByName(groupName);
+
+        if (group == null) {
+            throw new ItemNotFoundException("Group with the  name " + groupName + " is not found.");
+        }
+
+        GroupMembership gm = groupMembershipDao.findMembership(user.getId().longValue(), group.getId());
+        if (gm != null) {
+            return gm.getId();
+        }
+        gm = new GroupMembership();
+        gm.setGroupId(group.getId());
+        gm.setUserId(user.getId().longValue());
+        return groupMembershipDao.save(gm).getId();
+    }
+
+//    @Override
+//    @ManagedOperation(description = "Remove user member from  a group")
+//    @ManagedOperationParameters({
+//        @ManagedOperationParameter(name = "principalName", description = "Principal name of the user to make a member"),
+//        @ManagedOperationParameter(name = "groupName", description = "Name of the group")})
+//    public long removeMember(String userPrincipalName, String groupName) throws ItemNotFoundException{
+//        
+//        RegistryUser user = userDao.getByPrincipalName(userPrincipalName);
+//        
+//        if (user == null) {
+//            throw new ItemNotFoundException("User the the principal name "+userPrincipalName+" is not found.");
+//        }
+//        Group group = groupDao.findGroupByName(groupName);
+//        
+//        if (group == null) {
+//            throw new ItemNotFoundException("Group with the  name "+groupName+" is not found.");
+//        }
+//        
+//       
+//        return groupMembershipDao.deleteMembership(user.getId(), group.getId());
+//    }
+    @ManagedOperation(description = "Create a new group")
+    @ManagedOperationParameters({
+        @ManagedOperationParameter(name = "name", description = "Name of the group, must be unique"),
+        @ManagedOperationParameter(name = "ownerPrincipalName", description = "Principal name of the user")})
+    @Override
+    public long createNewGroup(String name, String ownerPrincipalName) {
+        RegistryUser owner = userDao.getByPrincipalName(ownerPrincipalName);
+        if (owner == null) {
+            throw new ValidationException("No principal '" + ownerPrincipalName + "' found");
+        }
+        Group group = groupDao.findGroupByName(name);
+        if (group != null) {
+            throw new ValidationException("Group '" + name + "' already exists");
+        }
+        group = new Group();
+        group.setName(name);
+        group.setOwnerId(owner.getId().longValue());
+        group = groupDao.save(group);
+        return group.getId();
+    }
+
+    @ManagedOperation(description = "List available groups")
+    @Override
+    public List<String> listGroupNames() {
+        List<String> groupNames = new ArrayList<String>();
+        for (Group group : groupDao.findAll()) {
+            groupNames.add(group.getName());
+        }
+        return groupNames;
+    }
+
+    @Override
+    public List<Group> getGroupsOfWhichUserIsAMember(String principal) {
+        RegistryUser user = userDao.getByPrincipalName(principal);
+        if (user == null || user.getId() == null) {
+            return new ArrayList<Group>();
+        }
+        List<GroupMembership> memberships = groupMembershipDao.findGroupsTheUserIsAmemberOf(user.getId().longValue());
+        List<Group> groups = new ArrayList<Group>();
+        for (GroupMembership m : memberships) {
+            groups.add(groupDao.findOne(m.getGroupId()));
+        }
+        return groups;
+    }
+
+    @Override
+    public List<String> getComponentIdsInGroup(long groupId) {
+        List<Ownership> ownerships = ownershipDao.findOwnershipByGroup(groupId);
+        Set<String> componentIds = new HashSet<String>();
+        for (Ownership o : ownerships) {
+            if (ComponentUtils.isComponentId(o.getComponentId())) {
+                componentIds.add(o.getComponentId());
+            }
+        }
+        List<String> idsList = new ArrayList<String>(componentIds);
+        Collections.sort(idsList);
+        return idsList;
+    }
+
+    @Override
+    public List<String> getProfileIdsInGroup(long groupId) {
+        List<Ownership> ownerships = ownershipDao.findOwnershipByGroup(groupId);
+        Set<String> profileIds = new HashSet<String>();
+        for (Ownership o : ownerships) {
+            if (ComponentUtils.isProfileId(o.getComponentId())) {
+                profileIds.add(o.getComponentId());
+            }
+        }
+        List<String> idsList = new ArrayList<String>(profileIds);
+        Collections.sort(idsList);
+        return idsList;
+    }
+
+    @Override
+    public List<Group> getGroupsTheItemIsAMemberOf(String itemId) {
+        Set<Ownership> ownerships = new HashSet<Ownership>();
+        ownerships.addAll(ownershipDao.findOwnershipByComponentId(itemId));
+        Set<Group> groups = new HashSet<Group>();
+        for (Ownership ownership : ownerships) {
+            groups.add(groupDao.findOne(ownership.getGroupId()));
+        }
+        List<Group> groupList = new ArrayList<Group>(groups);
+        Collections.sort(groupList, new Comparator<Group>() {
+            @Override
+            public int compare(Group g1, Group g2) {
+                return (int) (g1.getId() - g2.getId());
+            }
+        });
+        return groupList;
+    }
+
+    @ManagedOperation(description = "Make a component owned by a group instead of a user")
+    @ManagedOperationParameters({
+        @ManagedOperationParameter(name = "principal", description = "Name of the principal who owns the component"),
+        @ManagedOperationParameter(name = "groupName", description = "Name of the group to move the component to"),
+        @ManagedOperationParameter(name = "componentId", description = "Id of component")})
+    @Override
+    public void transferItemOwnershipToGroup(String principal, String groupName, String itemId) throws UserUnauthorizedException {
+        final BaseDescription item = componentDao.getByCmdId(itemId);
+        if (item == null) {
+            throw new ValidationException("No profile or component found with ID " + itemId);
+        }
+        final Group target = groupDao.findGroupByName(groupName);
+        if (target == null) {
+            throw new ValidationException("No group found with name " + groupName);
+        }
+
+        if (!this.userGroupMember(principal, target.getId())) {
+            throw new UserUnauthorizedException("User " + principal + " is not a member of group " + groupName);
+        }
+
+        final List<Ownership> currentOwnerships = ownershipDao.findOwnershipByComponentId(itemId);
+        if (!userHasRightToMove(item, principal, currentOwnerships)) {
+            throw new UserUnauthorizedException("User " + principal + " does not have the rights to move item  " + item.getName());
+        }
+
+        ownershipDao.delete(currentOwnerships);
+        final Ownership ownership = new Ownership();
+        ownership.setComponentId(itemId);
+        ownership.setGroupId(target.getId());
+        addOwnership(ownership);
+    }
+
+    private boolean userHasRightToMove(BaseDescription item, String principal, List<Ownership> currentOwnerships) throws DataAccessException {
+        long itemOwnerUser = item.getDbUserId();
+        long principalId = userDao.getByPrincipalName(principal).getId();
+        if (itemOwnerUser == principalId) {
+            return true;
+        } else {
+            // check if item and user are in the same group
+            for (Ownership ownership : currentOwnerships) {
+                if (userGroupMember(principal, ownership.getGroupId())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void transferItemOwnershipFromUserToGroupId(String principal, long groupId, String componentId) throws UserUnauthorizedException {
+        Group group = groupDao.findOne(groupId);
+        if (group == null) {
+            throw new ValidationException("No group found with id " + groupId);
+        }
+        this.transferItemOwnershipToGroup(principal, group.getName(), componentId);
+    }
+
+    @Override
+    public boolean userGroupMember(String principalName, long groupId) {
+        RegistryUser user = userDao.getByPrincipalName(principalName);
+        GroupMembership gm = groupMembershipDao.findMembership(user.getId(), groupId);
+        return gm != null;
+    }
+
+    @Override
+    public Number getGroupIdByName(String groupName) throws ItemNotFoundException {
+        Group group = groupDao.findGroupByName(groupName);
+        if (group != null) {
+            return group.getId();
+        } else {
+            throw new ItemNotFoundException("No group with the name " + groupName);
+        }
+    }
+
+    @Override
+    public String getGroupNameById(long groupId) throws ItemNotFoundException {
+        Group group = groupDao.findOne(groupId);
+        if (group != null) {
+            return group.getName();
+        } else {
+            throw new ItemNotFoundException("No group with the id " + groupId);
+        }
+    }
+
+    @Override
+    public List<RegistryUser> getUsersInGroup(long groupId) {
+        final List<GroupMembership> groupMemberships = groupMembershipDao.findForGroup(groupId);
+        return Lists.transform(groupMemberships, new Function<GroupMembership, RegistryUser>() {
+
+            @Override
+            public RegistryUser apply(GroupMembership f) {
+                return userDao.getPrincipalNameById(f.getUserId());
+            }
+        });
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/PostgresJpaDialect.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/PostgresJpaDialect.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/PostgresJpaDialect.java	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import java.sql.SQLException;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
+
+import org.springframework.orm.jpa.vendor.HibernateJpaDialect;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionException;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
+
+/**
+ * Changing default transaction isolation level from read committed to serializable. 
+ * Some background: When accessing the application the first time with a user that doesn't exist in the database I was frequently getting an exception about a unique constraint violation
+ * while trying to insert into the database. The reason was that the browser was accessing components and profiles, which in the backend got the current user from tomcat and 
+ * then tried to look it up in the database. If the user didn't exist, it would insert it. Those requests came in in parallel, spawning two simultaneous transactions. Because
+ * of the default postgres isolation level (read committed) the second transaction would not (yet) see the user created by the first one and then try to insert it again, which
+ * stumbled over the unique key constraints. Imposing a stricter isolation level solves this.
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class PostgresJpaDialect extends HibernateJpaDialect{
+
+    @Override
+    public Object beginTransaction(EntityManager entityManager,
+            TransactionDefinition definition) throws PersistenceException,
+            SQLException, TransactionException {
+	DefaultTransactionDefinition dtd = new DefaultTransactionDefinition(definition);
+	dtd.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
+	return super.beginTransaction(entityManager, definition);
+    }
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ValidationException.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ValidationException.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/impl/database/ValidationException.java	(revision 5961)
@@ -0,0 +1,13 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+/**
+ * 
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class ValidationException extends RuntimeException{
+
+    public ValidationException(String message) {
+	super(message);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/BaseDescription.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/BaseDescription.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/BaseDescription.java	(revision 5961)
@@ -0,0 +1,311 @@
+package clarin.cmdi.componentregistry.model;
+
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.util.XmlDateAdapter;
+
+import java.io.Serializable;
+import java.util.Comparator;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+/**
+ * The BaseComponent (formally AbstractDescription) models profiles and
+ * components alike by containing <strong>all</strong> their persistent
+ * attributes. It is meant to serve as a base for XML generation and JPA
+ * persistence. Extending classes are not allowed to model any persistent
+ * attributes.
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+@XmlRootElement(name = "description")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlSeeAlso({ ComponentDescription.class, ProfileDescription.class })
+@Entity
+@Table(name = "basedescription")
+public class BaseDescription implements Serializable {
+
+
+    @SequenceGenerator( name = "basedescription_id_seq", sequenceName = "basedescription_id_seq", allocationSize = 1, initialValue = 1 )
+    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "basedescription_id_seq" )
+    @Id
+    @Column(name = "id")
+    @XmlTransient
+    private Long dbId;
+
+    @XmlElement(name = "id")
+    @Column(name = "component_id", nullable = false, unique = true)
+    private String componentId;
+
+    @Column(name = "description", nullable = false)
+    private String description;
+
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    @Column(name = "registration_date")
+    @XmlJavaTypeAdapter(XmlDateAdapter.class)
+    private Date registrationDate;
+
+    @Column(name = "creator_name")
+    private String creatorName;
+
+    @XmlTransient
+    @Column(name = "user_id", columnDefinition = "integer")
+    private long dbUserId;
+
+    @Transient
+    private String userId;
+
+    @Column(name = "domain_name")
+    private String domainName;
+
+    @XmlElement(namespace = "http://www.w3.org/1999/xlink")
+    private String href;
+
+    @Column(name = "group_name")
+    private String groupName;
+
+    @Transient
+    private int commentsCount;
+
+    @Column(name = "show_in_editor", nullable = false)
+    @XmlTransient
+    private boolean shownInEditor = true;
+
+    @XmlTransient
+    @Column(name = "content", nullable = false)
+    @Transient
+    private String content = "";
+
+    @XmlTransient
+    @Column(name = "is_public", nullable = false)
+    private boolean ispublic;
+
+    @XmlTransient
+    @Column(name = "is_deleted", nullable = false)
+    private boolean deleted;
+
+    public long getDbUserId() {
+        return dbUserId;
+    }
+
+    public void setDbUserId(long dbUserId) {
+        this.dbUserId = dbUserId;
+        setUserId(""+dbUserId);
+    }
+
+    public String getContent() {
+	return content;
+    }
+
+    public void setContent(String content) {
+	this.content = content;
+    }
+
+    public boolean isDeleted() {
+	return deleted;
+    }
+
+    public void setDeleted(boolean deleted) {
+	this.deleted = deleted;
+    }
+
+    /**
+     * Whether this profile should be shown in metadata editor (e.g. Arbil)
+     * 
+     * @return the value of showInEditor
+     */
+    public boolean isShowInEditor() {
+	return shownInEditor;
+    }
+
+    /**
+     * Gets whether this profile should be shown in metadata editor (e.g. Arbil)
+     * 
+     * @param showInEditor
+     *            new value of showInEditor
+     */
+    public void setShowInEditor(boolean showInEditor) {
+	this.shownInEditor = showInEditor;
+    }
+
+    public void setId(String id) {
+	if (id != null && !ComponentUtils.isComponentId(id)
+		&& !ComponentUtils.isProfileId(id))
+	    throw new IllegalArgumentException(
+		    "ID doesn't follow the naming schema for components or profiles "
+			    + id);
+	this.componentId = id;
+    }
+
+    public String getId() {
+	return componentId;
+    }
+
+    public Long getDbId() {
+	return dbId;
+    }
+
+    public void setDbId(Long dbId) {
+	this.dbId = dbId;
+    }
+
+    public void setDescription(String description) {
+	this.description = description;
+    }
+
+    public String getDescription() {
+	return description;
+    }
+
+    public void setName(String name) {
+	this.name = name;
+    }
+
+    public String getName() {
+	return name;
+    }
+
+    public void setRegistrationDate(Date registrationDate) {
+	this.registrationDate = registrationDate;
+    }
+
+    public Date getRegistrationDate() {
+	return registrationDate;
+    }
+
+    public void setCreatorName(String creatorName) {
+	this.creatorName = creatorName;
+    }
+
+    public String getCreatorName() {
+	return creatorName;
+    }
+
+    public void setUserId(String userId) {
+	try {
+	    this.dbUserId = Long.parseLong(userId);
+	} catch (Exception e) {
+	    this.dbUserId = 0;
+	}
+	this.userId = userId;
+    }
+
+    /**
+     * MD5 string representation of the user id. Storing the hash because the
+     * userId can be the email address which we don't want to make public.
+     */
+    public String getUserId() {
+	if (userId == null)
+	    return ""+dbUserId;
+	return userId;
+    }
+
+    public void setDomainName(String domainName) {
+	this.domainName = domainName;
+    }
+
+    public String getDomainName() {
+	return domainName;
+    }
+
+    public void setHref(String href) {
+	this.href = href;
+    }
+
+    public String getHref() {
+	return href;
+    }
+
+    public void setGroupName(String groupName) {
+	this.groupName = groupName;
+    }
+
+    public String getGroupName() {
+	return groupName;
+    }
+
+    /**
+     * @return the number of comments posted on this component
+     */
+    public int getCommentsCount() {
+	return commentsCount;
+    }
+
+    /**
+     * @param commentsCount
+     *            the number of comments posted on this component
+     */
+    public void setCommentsCount(int commentsCount) {
+	this.commentsCount = commentsCount;
+    }
+
+    @Override
+    public String toString() {
+	return "Name=" + getName() + ", id=" + getId() + ", creatorName="
+		+ getCreatorName() + ", userId=" + getUserId();
+    }
+
+    public boolean isProfile() {
+	return this instanceof ProfileDescription;
+    }
+
+    public String getType() {
+	return isProfile() ? "profile" : "component";
+    }
+
+    /**
+     * Helper method.
+     * 
+     * @param userId
+     *            normal string which will be checked to see if it matches the
+     *            md5 hash of the stored userId
+     */
+    public boolean isThisTheOwner(String userId) {
+	String userHash = DigestUtils.md5Hex(userId);
+	return userHash.equals(getUserId());
+    }
+
+    public boolean isPublic() {
+	return ispublic;
+    }
+
+    public void setPublic(boolean ispublic) {
+	this.ispublic = ispublic;
+    }
+    
+    /**
+     * Compares two descriptions by the their value as returned by
+     * {@link BaseDescription#getRegistrationDate() () * }
+     */
+    public static final Comparator<? super BaseDescription> COMPARE_ON_DATE = new Comparator<BaseDescription>() {
+        /**
+         * @returns 1 if o11 is older than o2 (to the bottom), returns -1 if o1 is younger (to the top)
+         * o2
+         */
+        @Override
+        public int compare(BaseDescription o1, BaseDescription o2) {
+            // we need to sort not in standard ascending orde, but in descending, from higher (later date) to the smaller (older date)
+            return ComponentUtils.COMPARE_ON_DATE.compare(o1.getRegistrationDate(),  o2.getRegistrationDate());
+        }
+    };
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Comment.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Comment.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Comment.java	(revision 5961)
@@ -0,0 +1,177 @@
+package clarin.cmdi.componentregistry.model;
+
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import java.text.ParseException;
+import java.util.Comparator;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.apache.commons.lang.time.DateUtils;
+
+import clarin.cmdi.componentregistry.util.XmlDateAdapter;
+
+/**
+ * 
+ * @author Jean-Charles FerriÃšres <jean-charles.ferrieres@mpi.nl>
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author george.georgovassilis@mpi.nl
+ */
+@XmlRootElement(name = "comment")
+@XmlAccessorType(XmlAccessType.FIELD)
+@Entity
+@Table(name = "comments")
+@XmlType(propOrder={"comments","commentDate","componentId","id","userName","canDelete"})
+public class Comment {
+
+    @Column(nullable = false)
+    private String comments;
+
+    @XmlJavaTypeAdapter(XmlDateAdapter.class)
+    @Column(name = "comment_date", nullable = false)
+    private Date commentDate;
+
+    @Column(name = "component_id")
+    private String componentId;
+
+    @XmlTransient
+    @Column(name = "id")
+    @Id
+    @SequenceGenerator(name = "comments_id_seq", sequenceName = "comments_id_seq", allocationSize = 1, initialValue = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "comments_id_seq")
+    private Long dbId;
+
+    @Transient
+    @XmlTransient
+    private String id;
+
+    @Column(name = "user_name")
+    private String userName;
+
+    @Transient
+    private boolean canDelete;
+    @XmlTransient
+    // this prevents userId from being serialized to XML and thus exposed (which
+    // is useless and undesirable)
+    @Column(name = "user_id", nullable = false)
+    private long userId;
+
+    public void setComment(String comment) {
+	this.comments = comment;
+    }
+
+    public String getComment() {
+	return comments;
+    }
+
+    public void setCommentDate(Date commentDate) {
+	this.commentDate = commentDate;
+    }
+
+    public Date getCommentDate() {
+	return commentDate;
+    }
+
+    public void setId(String commentId) {
+	this.id = commentId;
+	try {
+	    this.dbId = Long.parseLong(commentId);
+	} catch (Exception e) {
+	}
+    }
+
+    @XmlElement
+    public String getId() {
+	return id== null?dbId+"":id;
+    }
+
+    public String getComponentId() {
+	return componentId;
+    }
+
+    public void setComponentId(String componentDescriptionId) {
+	this.componentId = componentDescriptionId;
+    }
+
+    public void setUserId(long userId) {
+	this.userId = userId;
+    }
+
+    public long getUserId() {
+	return userId;
+    }
+
+    /**
+     * 
+     * @return userName, that is the user's 'real' name, not login name
+     */
+    public String getUserName() {
+	return userName;
+    }
+
+    /**
+     * @param userName
+     *            the user's 'real' name, not login name
+     */
+    public void setUserName(String userName) {
+	this.userName = userName;
+    }
+
+    /**
+     * @return whether comment can be deleted
+     */
+    public boolean isCanDelete() {
+	return canDelete;
+    }
+
+    /**
+     * @param canDelete
+     *            whether comment can be deleted
+     */
+    public void setCanDelete(boolean canDelete) {
+	this.canDelete = canDelete;
+    }
+
+    public static Date getDate(String registrationDate) throws ParseException {
+	return DateUtils.parseDate(registrationDate,
+		new String[] { DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT
+			.getPattern() });
+    }
+
+    /**
+     * Compares two comments by their value as returned by
+     * {@link Comment#getCommentDate()
+     * }
+     */
+    public static final Comparator<Comment> COMPARE_ON_DATE = new Comparator<Comment>() {
+	/**
+	 * @return -1 if o11-s date is bigger than  o2's (o1 is younger), o1 goes up
+         * so the standard order (older up, smaller date is up) is reversed
+	 */
+	@Override
+	public int compare(Comment o1, Comment o2) {
+	    if (o1.getCommentDate() == o2.getCommentDate())
+		return 0;
+	    if (o1.getCommentDate() == null)
+		return -1; // o1 goes down
+	    if (o2.getCommentDate() == null)
+		return 1; // o1 goes up
+	    return ComponentUtils.COMPARE_ON_DATE.compare(o1.getCommentDate(),  o2.getCommentDate());
+	}
+    };
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/CommentResponse.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/CommentResponse.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/CommentResponse.java	(revision 5961)
@@ -0,0 +1,27 @@
+package clarin.cmdi.componentregistry.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ *
+ * @author jean-charles FerriÃšres <jean-charles.ferrieres@mpi.nl>
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = "commentResponse")
+
+public class CommentResponse extends ComponentRegistryResponse {
+
+    @XmlElement
+    private Comment comment;
+
+    public void setComment(Comment comment) {
+        this.comment = comment;
+    }
+
+    public Comment getComment() {
+        return comment;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ComponentDescription.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ComponentDescription.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ComponentDescription.java	(revision 5961)
@@ -0,0 +1,48 @@
+package clarin.cmdi.componentregistry.model;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.IdSequence;
+
+import java.io.Serializable;
+import java.util.Comparator;
+import java.util.Date;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "componentDescription")
+public class ComponentDescription extends BaseDescription implements Serializable {
+
+    
+    
+    // Attention! COMPONENT_PREFIX here and the client's Config.COMPONENT_PREFIX must be the same 
+    // If you change COMPONENT_PREFIX here, then change the client's  config.COMPONENT_PREFIX
+    public static final String COMPONENT_PREFIX = ComponentRegistry.REGISTRY_ID + "c_";
+    
+    private static final long serialVersionUID = 1L;
+    
+    public static final Comparator<? super ComponentDescription> COMPARE_ON_GROUP_AND_NAME = new Comparator<ComponentDescription>() {
+	@Override
+	public int compare(ComponentDescription o1, ComponentDescription o2) {
+	    int result = 0;
+	    if (o1.getGroupName() != null && o2.getGroupName() != null) {
+		result = o1.getGroupName().compareToIgnoreCase(o2.getGroupName());
+	    }
+	    if (result == 0) {
+		if (o1.getName() != null && o2.getName() != null) {
+		    result = o1.getName().compareToIgnoreCase(o2.getName());
+		} else {
+		    result = o1.getId().compareTo(o2.getId());
+		}
+	    }
+	    return result;
+	}
+    };
+
+    public static ComponentDescription createNewDescription() {
+	String id = COMPONENT_PREFIX + IdSequence.get();
+	ComponentDescription desc = new ComponentDescription();
+	desc.setId(id);
+	desc.setRegistrationDate(new Date());
+	return desc;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ComponentRegistryResponse.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ComponentRegistryResponse.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ComponentRegistryResponse.java	(revision 5961)
@@ -0,0 +1,67 @@
+package clarin.cmdi.componentregistry.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlElements;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import javax.xml.bind.annotation.XmlType;
+
+/**
+ *
+ * @author jeafer
+ */
+@XmlRootElement(name = "response")
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlSeeAlso({RegisterResponse.class, CommentResponse.class})
+@XmlType(propOrder = {"registered","isPrivate","errors"})
+public class ComponentRegistryResponse {
+
+    @XmlAttribute(required = true)
+    private Boolean registered;
+    
+    @XmlAttribute(required = true)
+    private Boolean isPrivate;
+    
+    @XmlElementWrapper(name = "errors", required = false)
+    @XmlElements(
+    @XmlElement(name = "error", type = String.class))
+    private List<String> errors = new ArrayList<String>();
+
+    public ComponentRegistryResponse() {
+    }
+
+    public void addError(String error) {
+        getErrors().add(error);
+    }
+
+    public List<String> getErrors() {
+        return errors;
+    }
+
+    public boolean isRegistered() {
+        return registered;
+    }
+
+    public void setErrors(List<String> errors) {
+        this.errors = errors;
+    }
+
+    public void setRegistered(boolean registered) {
+        this.registered = registered;
+    }
+
+    public void setIsPrivate(Boolean isPrivate) {
+        this.isPrivate = isPrivate;
+    }
+
+    public Boolean isPrivate() {
+        return isPrivate;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Group.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Group.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Group.java	(revision 5961)
@@ -0,0 +1,44 @@
+package clarin.cmdi.componentregistry.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.hibernate.annotations.GenericGenerator;
+
+@XmlRootElement(name = "group")
+@XmlAccessorType(XmlAccessType.FIELD)
+@Entity
+@Table(name = "usergroup")
+public class Group {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long id;
+    private String name;
+    private long ownerId;
+    
+    public long getOwnerId() {
+        return ownerId;
+    }
+    public void setOwnerId(long ownerId) {
+        this.ownerId = ownerId;
+    }
+    public long getId() {
+        return id;
+    }
+    public void setId(long id) {
+        this.id = id;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/GroupMembership.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/GroupMembership.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/GroupMembership.java	(revision 5961)
@@ -0,0 +1,49 @@
+package clarin.cmdi.componentregistry.model;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.hibernate.annotations.GenericGenerator;
+
+@XmlRootElement(name = "groupmembership")
+@XmlAccessorType(XmlAccessType.FIELD)
+@Entity
+@Table(name = "groupmembership")
+public class GroupMembership {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long id;
+    private long groupId;
+    private long userId;
+
+    public long getId() {
+	return id;
+    }
+
+    public void setId(long id) {
+	this.id = id;
+    }
+
+    public long getGroupId() {
+	return groupId;
+    }
+
+    public void setGroupId(long groupId) {
+	this.groupId = groupId;
+    }
+
+    public long getUserId() {
+	return userId;
+    }
+
+    public void setUserId(long userId) {
+	this.userId = userId;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ObjectFactory.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ObjectFactory.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ObjectFactory.java	(revision 5961)
@@ -0,0 +1,22 @@
+/**
+ * 
+ */
+package clarin.cmdi.componentregistry.model;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+@XmlRegistry
+public class ObjectFactory {
+
+    public ProfileDescription createProfileDescription() {
+        return new ProfileDescription();
+    }
+
+    public ComponentDescription createComponentDescription() {
+        return new ComponentDescription();
+    }
+
+    public RegisterResponse createRegisterErrorResponse() {
+        return new RegisterResponse();
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Ownership.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Ownership.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/Ownership.java	(revision 5961)
@@ -0,0 +1,67 @@
+package clarin.cmdi.componentregistry.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.hibernate.annotations.GenericGenerator;
+
+/**
+ * Models ownership of a profile or component by a user or group. A valid {@link Ownership} has either the {@link #profileId} or the {@link #componentId} filled out
+ * and either the {@link #groupId} or the {@link #userId}.
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+@XmlRootElement(name = "ownership")
+@XmlAccessorType(XmlAccessType.FIELD)
+@Entity
+@Table(name = "ownership")
+public class Ownership implements Serializable {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private long id;
+    private String componentId;
+    private long groupId;
+    private long userId;
+
+    public String getComponentId() {
+	return componentId;
+    }
+
+    public void setComponentId(String componentId) {
+	this.componentId = componentId;
+    }
+
+    public long getGroupId() {
+	return groupId;
+    }
+
+    /**
+     * 
+     * @param groupId 0 denotes no group (user must be set)
+     */
+    public void setGroupId(long groupId) {
+	this.groupId = groupId;
+    }
+
+    public long getUserId() {
+	return userId;
+    }
+
+    /**
+     * 
+     * @param userId 0 denotes no user (group must be set)
+     */
+    public void setUserId(long userId) {
+	this.userId = userId;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ProfileDescription.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ProfileDescription.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/ProfileDescription.java	(revision 5961)
@@ -0,0 +1,42 @@
+package clarin.cmdi.componentregistry.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.springframework.beans.BeanUtils;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.IdSequence;
+
+@XmlRootElement(name = "profileDescription")
+public class ProfileDescription extends BaseDescription implements Serializable {
+
+    // Attention! PROFILE_PREFIX here and the client's Config.PROFILE_PREFIX must be the same 
+    // If you change PROFILE_PREFIX here, then the client's  Config.PROFILE_PREFIX
+    public static final String PROFILE_PREFIX = ComponentRegistry.REGISTRY_ID + "p_";
+    
+    private static final long serialVersionUID = 1L;
+
+    public static ProfileDescription createNewDescription() {
+	String id = PROFILE_PREFIX + IdSequence.get();
+	ProfileDescription desc = new ProfileDescription();
+	desc.setId(id);
+	desc.setRegistrationDate(new Date());
+	return desc;
+    }
+    
+    @XmlElement(name="showInEditor")
+    @Override
+    public void setShowInEditor(boolean showInEditor) {
+        super.setShowInEditor(showInEditor);
+    }
+    
+    @Override
+    public boolean isShowInEditor() {
+        return super.isShowInEditor();
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/RegisterResponse.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/RegisterResponse.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/RegisterResponse.java	(revision 5961)
@@ -0,0 +1,38 @@
+package clarin.cmdi.componentregistry.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = "registerResponse")
+@XmlType(propOrder = {"isProfile","description"})
+public class RegisterResponse extends ComponentRegistryResponse {
+
+    @XmlAttribute(required = true)
+    private Boolean isProfile;
+
+    @XmlElement
+    private BaseDescription description;
+
+    public void setDescription(BaseDescription description) {
+        this.description = description;
+    }
+
+    public BaseDescription getDescription() {
+        return description;
+    }
+
+    public boolean isProfile() {
+        return isProfile;
+    }
+
+    public void setIsProfile(boolean isProfile) {
+        this.isProfile = isProfile;
+    }
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/RegistryUser.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/RegistryUser.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/model/RegistryUser.java	(revision 5961)
@@ -0,0 +1,69 @@
+package clarin.cmdi.componentregistry.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+@XmlAccessorType(value = XmlAccessType.FIELD)
+@Entity
+@Table(name = "registry_user")
+public class RegistryUser implements Serializable {
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "principal_name", unique = true)
+    private String principalName;
+
+    @Id
+    @SequenceGenerator(name = "registry_user_id_seq", sequenceName = "registry_user_id_seq", allocationSize = 1, initialValue = 1)
+    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "registry_user_id_seq")
+    @Column(name = "id")
+    private Long id;
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setPrincipalName(String principalName) {
+        this.principalName = principalName;
+    }
+
+    public String getPrincipalName() {
+        return principalName;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String toString() {
+        if (getName() == null) {
+            return getPrincipalName();
+        } else {
+            return String.format("%s [%s]", getName(), getPrincipalName());
+        }
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/ComponentDao.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/ComponentDao.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/ComponentDao.java	(revision 5961)
@@ -0,0 +1,178 @@
+package clarin.cmdi.componentregistry.persistence;
+
+import java.util.List;
+
+import org.springframework.dao.DataAccessException;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+
+/**
+ * Interface for a persistence operation on components and profiles
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ * @param <T>
+ */
+public interface ComponentDao {
+
+    
+    /**
+     * Get all public profiles
+     * 
+     * @return
+     */
+    List<BaseDescription> getPublicBaseDescriptions(String prefix);
+
+    /**
+     * 
+     * @param cmdId
+     *            CMD id
+     * @return Whether the specified item is in the public space
+     */
+    boolean isPublic(String cmdId);
+
+    /**
+     * 
+     * @param cmdId
+     *            CMD id
+     * @param userId
+     *            User db id of workspace owner
+     * @return Whether the specified item is in the specified user's workspace
+     */
+    boolean isInUserSpace(String cmdId, Number userId);
+
+    /**
+     * 
+     * @param cmdId
+     *            CMD id
+     * @param userId
+     *            User db id of workspace owner, null for public registry
+     * @return Whether the specified item is in the specified workspace (user or
+     *         public)
+     */
+    //boolean isAccessible(String cmdId, Number userId);
+
+    /**
+     * 
+     * @param cmdId
+     *            Profile or component Id (not primary key)
+     * @return String value of XML content for profile or component
+     */
+    String getContent(boolean isDeleted, String cmdId)
+	    throws DataAccessException;
+
+    /**
+     * @param description
+     *            Description to insert
+     * @param content
+     *            Content to insert and refer to from description
+     * @return Id of newly inserted description
+     */
+    Number insertDescription(BaseDescription description, String content,
+	    boolean isPublic, Number userId) throws DataAccessException;
+
+    /**
+     * Updates a description by database id
+     * 
+     * @param id
+     *            Id (key) of description record
+     * @param description
+     *            New values for description (leave null to not change)
+     * @param content
+     *            New content for description (leave null to not change)
+     */
+    void updateDescription(Number id, BaseDescription description, String content);
+
+    /**
+     * Retrieves description by it's primary key Id
+     * 
+     * @param id
+     *            Description key
+     * @return The description, if it exists; null otherwise
+     */
+    BaseDescription getById(Number id) throws DataAccessException;
+
+    /**
+     * Get by ComponentId / ProfileId, whether in userspace or public
+     * 
+     * @param id
+     *            Full component id
+     * @return The description, if it exists; null otherwise
+     */
+    BaseDescription getByCmdId(String id) throws DataAccessException;
+
+    /**
+     * Get by ComponentId / ProfileId
+     * 
+     * @param id
+     *            Full component id
+     * @param userId
+     *            Db id of user for workspace; null for public space
+     * @return The description, if it exists; null otherwise
+     */
+//    BaseDescription getByCmdId(String id, Number userId)
+//	    throws DataAccessException;
+ 
+
+    /**
+     * 
+     * @param cmdId
+     *            CMD Id of description
+     * @return Database id for description record
+     */
+    Number getDbId(String cmdId);
+
+    /**
+     * 
+     * @return All descriptions in the public space
+     */
+    List<BaseDescription> getPublicDescriptions() throws DataAccessException;
+
+    /**
+     * @return List of deleted descriptions in user space or in public when
+     *         userId=null
+     * @param userId
+     */
+    List<BaseDescription> getDeletedDescriptions(Number userId);
+
+    /**
+     * 
+     * @return All the user's components not in the public space and are also
+     *         not part of any group
+     */
+    List<BaseDescription> getPrivateBaseDescriptions(Number userId, String prefix)
+	    throws DataAccessException;
+  
+    void setDeleted(BaseDescription desc, boolean isDeleted)
+	    throws DataAccessException;
+
+    void setPublished(Number id, boolean published);
+
+    /**
+     * 
+     * @param id
+     *            Id of description record
+     * @return Principal name of description's owner, if any. Otherwise, null.
+     */
+    String getOwnerPrincipalName(Number id);
+    
+    /**
+     * Get a list of ids ({@link BaseDescription#getId()}) of all non-deleted profiles
+     * @param contentFilter filter on profiles that contain this string in their XML content (can be null for no filtering)
+     * @return
+     */
+    List<String> getAllNonDeletedProfileIds(String contentFilter);
+
+    /**
+     * Get a list of ids ({@link BaseDescription#getId()}) of all non-deleted components
+     * @param contentFilter filter on components that contain this string in their XML content (can be null for no filtering)
+     * @return
+     */
+    List<String> getAllNonDeletedComponentIds(String contentFilter);
+
+    public List<BaseDescription> getAllNonDeletedDescriptions();
+            
+    // Olha was here
+    public List<String> getAllItemIdsInGroup(String prefix, Long groupId);
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/impl/ComponentDaoImpl.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/impl/ComponentDaoImpl.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/impl/ComponentDaoImpl.java	(revision 5961)
@@ -0,0 +1,397 @@
+package clarin.cmdi.componentregistry.persistence.impl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.stereotype.Repository;
+
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.persistence.jpa.CommentsDao;
+import clarin.cmdi.componentregistry.persistence.jpa.JpaComponentDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+
+/**
+ * Base DAO which can be extended to serve {@link ComponentDescription}s and
+ * {@link ProfileDescription}s
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+@Repository
+public class ComponentDaoImpl implements ComponentDao {
+
+    @Autowired
+    private JpaComponentDao jpaComponentDao;
+    @Autowired
+    private CommentsDao commentsDao;
+    @Autowired
+    private UserDao userDao;
+    private final static Logger LOG = LoggerFactory
+            .getLogger(ComponentDaoImpl.class);
+
+    /**
+     * Copy a set of properties which are allowed to change from "from" to "to"
+     * thus making sure that only those properties are updated and not other
+     * ones.
+     *
+     * @param from
+     * @param to
+     */
+    protected void copyPersistentProperties(BaseDescription from, BaseDescription to) {
+        to.setName(from.getName());
+        to.setDescription(from.getDescription());
+        to.setRegistrationDate(from.getRegistrationDate());
+        to.setCreatorName(from.getCreatorName());
+        to.setDomainName(from.getDomainName());
+        to.setGroupName(from.getGroupName());
+        to.setHref(from.getHref());
+    }
+
+    protected String getTableName() {
+        return "persistentcomponents";
+    }
+
+    ;
+
+    private boolean compare(String s, Number n) {
+        return ("" + s).equals("" + n);
+    }
+
+    private String toString(Number n) {
+        if (n == null) {
+            return null;
+        }
+        return n.toString();
+    }
+
+    private BaseDescription castDown(BaseDescription c) {
+        // JPA will save only BaseComponent instances, not derived classes
+        if (c instanceof ComponentDescription
+                || c instanceof ProfileDescription) {
+            BaseDescription copy = new BaseDescription();
+            ComponentUtils.copyPropertiesFrom(c, copy);
+            return copy;
+        }
+        return c;
+    }
+
+    /**
+     * Update {@link BaseDescription#getCommentsCount()} (which is a transient
+     * property) with the number of comments for that component and load
+     * {@link BaseDescription#getContent()}
+     *
+     * @param baseDescription
+     */
+    private void augment(BaseDescription baseDescription) {
+        if (baseDescription == null) {
+            return;
+        }
+        int count = (int) commentsDao.findCommentCountForComponent(baseDescription
+                .getId());
+        baseDescription.setCommentsCount(count);
+        baseDescription.setContent(jpaComponentDao.findContentByComponentId(baseDescription
+                .getId()));
+    }
+
+    /**
+     * Update {@link BaseDescription#getCommentsCount()
+     *
+     * @param baseDescription
+     */
+    private List<BaseDescription> augment(List<BaseDescription> baseDescription) {
+        if (baseDescription.isEmpty()) {
+            return baseDescription;
+        }
+        Map<String, BaseDescription> map = new HashMap<String, BaseDescription>();
+        List<String> idlist = new ArrayList<String>();
+        for (BaseDescription c : baseDescription) {
+            if (c != null) {
+                idlist.add(c.getId());
+                map.put(c.getId(), c);
+            }
+        }
+        List<Object[]> tuples = commentsDao
+                .findCommentCountForComponents(idlist);
+        for (Object[] tuple : tuples) {
+            String id = tuple[0].toString();
+            int count = Integer.parseInt(tuple[1].toString());
+            map.get(id).setCommentsCount(count);
+        }
+        return baseDescription;
+    }
+
+    /**
+     *
+     * @param cmdId CMD id
+     * @return Whether the specified item is in the public space
+     */
+    @Override
+    public boolean isPublic(String cmdId) {
+        BaseDescription baseDescription = jpaComponentDao.findByComponentId(cmdId);
+        return baseDescription != null && baseDescription.isPublic();
+    }
+
+    /**
+     *
+     * @param cmdId CMD id
+     * @param userId User db id of workspace owner
+     * @return Whether the specified item is in the specified user's workspace
+     */
+    @Override
+    public boolean isInUserSpace(String cmdId, Number userId) {
+        BaseDescription baseDescription = jpaComponentDao.findByComponentId(cmdId);
+        boolean b = baseDescription != null && !baseDescription.isPublic()
+                && compare(baseDescription.getUserId(), userId);
+        return b;
+    }
+
+    /**
+     *
+     * @param cmdId CMD id
+     * @param userId User db id of workspace owner, null for public registry
+     * @return Whether the specified item is in the specified workspace (user or
+     * public)
+     */
+//    @Override
+//    public boolean isAccessible(String cmdId, Number userId) {
+//	if (userId == null) {
+//	    return this.isPublic(cmdId);
+//	} else {
+//	    return this.isInUserSpace(cmdId, userId);
+//	}
+//    }
+    /**
+     *
+     * @param cmdId Profile or component Id (not primary key)
+     * @return String value of XML content for profile or component
+     */
+    @Override
+    public String getContent(boolean isDeleted, String cmdId) {
+        return jpaComponentDao.findContentByComponentId(cmdId, isDeleted);
+    }
+
+    /**
+     * @param description Description to insert
+     * @param content Content to insert and refer to from description
+     * @return Id of newly inserted description
+     */
+    @Override
+    public Number insertDescription(BaseDescription description, String content,
+            boolean isPublic, Number userId) {
+
+        if (description.getId() != null
+                && jpaComponentDao.findByComponentId(description.getId()) != null) {
+            throw new IllegalArgumentException("Component "
+                    + description.getId() + " already in DB");
+        }
+        if (content == null) {
+            content = "";
+        }
+        BaseDescription copy = castDown(description);
+        copy.setContent(content);
+        copy.setPublic(isPublic);
+        copy.setUserId(toString(userId));
+        copy.setCreatorName(description.getCreatorName());
+        copy = jpaComponentDao.saveAndFlush(copy);
+        jpaComponentDao.updateContent(copy.getId(), content);
+        return copy.getDbId();
+    }
+
+    /**
+     * Updates a description by database id
+     *
+     * @param id Id (key) of description record
+     * @param description New values for description (leave null to not change)
+     * @param content New content for description (leave null to not change)
+     */
+    @Override
+    public void updateDescription(Number id, BaseDescription description,
+            String content) {
+        if (content == null) {
+            content = "";
+        }
+        if (description != null) {
+            // Update description
+            BaseDescription copy = jpaComponentDao.findByComponentId(description
+                    .getId());
+            copyPersistentProperties(description, copy);
+            jpaComponentDao.saveAndFlush(copy);
+            jpaComponentDao.updateContent(copy.getId(), content);
+        }
+
+        if (content != null) {
+            BaseDescription copy = jpaComponentDao.findOne(id.longValue());
+            copy.setContent(content);
+            jpaComponentDao.saveAndFlush(copy);
+            jpaComponentDao.updateContent(copy.getId(), content);
+        }
+    }
+
+    /**
+     * Retrieves description by it's primary key Id
+     *
+     * @param id Description key
+     * @return The description, if it exists; null otherwise
+     */
+    @Override
+    public BaseDescription getById(Number id) {
+        BaseDescription baseDescription = jpaComponentDao.findOne(id.longValue());
+        if (baseDescription != null && !baseDescription.isDeleted()) {
+            augment(baseDescription);
+            return baseDescription;
+        }
+        return null;
+    }
+
+    /**
+     * Get by ComponentId / ProfileId, whether in userspace or public
+     *
+     * @param id Full component id
+     * @return The description, if it exists; null otherwise
+     */
+    @Override
+    public BaseDescription getByCmdId(String id) {
+        BaseDescription baseDescription = jpaComponentDao.findByComponentId(id);
+        if (baseDescription != null && !baseDescription.isDeleted()) {
+            augment(baseDescription);
+            return baseDescription;
+        }
+        return null;
+    }
+
+    /**
+     *
+     * @param cmdId CMD Id of description
+     * @return Database id for description record
+     */
+    @Override
+    public Number getDbId(String cmdId) {
+        Number id = null;
+        BaseDescription c = jpaComponentDao.findByComponentId(cmdId);
+        if (c != null) {
+            id = c.getDbId();
+        }
+        return id;
+    }
+
+    /**
+     *
+     * @return All descriptions in the public space. Won't include xml content
+     * and comments count.
+     */
+    @Override
+    public List<BaseDescription> getPublicDescriptions() {
+        return augment(jpaComponentDao.findPublicItems());
+    }
+
+    /**
+     * @return List of deleted descriptions in user space or in public when
+     * userId=null. Won't include xml content and comments count.
+     * @param userId
+     */
+    @Override
+    public List<BaseDescription> getDeletedDescriptions(Number userId) {
+        List<BaseDescription> list = null;
+        if (userId != null) {
+            list = jpaComponentDao.findDeletedItemsForUser(userId.longValue());
+        } else {
+            list = jpaComponentDao.findPublicDeletedItems();
+        }
+        list = augment(list);
+        return list;
+    }
+
+    /**
+     *
+     * @return All the user's descriptions not in the public space .Won't
+     * include xml content and comments count.
+     */
+    @Override
+    public List<BaseDescription> getPrivateBaseDescriptions(Number userId, String prefix) {
+        return augment(jpaComponentDao.findItemsForUserThatAreNotInGroups(userId.longValue(), prefix + "%"));
+        //return augment(jpaComponentDao.findNotPublishedUserItems(userId.longValue(),prefix + "%"));
+    }
+
+    @Override
+    public void setDeleted(BaseDescription desc, boolean isDeleted) {
+        BaseDescription copy = jpaComponentDao.findByComponentId(desc.getId());
+        copy.setDeleted(isDeleted);
+        jpaComponentDao.saveAndFlush(copy);
+    }
+
+    @Override
+    public void setPublished(Number id, boolean published) {
+        BaseDescription copy = jpaComponentDao.findOne(id.longValue());
+        copy.setPublic(published);
+        jpaComponentDao.saveAndFlush(copy);
+    }
+
+    /**
+     *
+     * @param id Id of description record
+     * @return Principal name of description's owner, if any. Otherwise, null.
+     */
+    @Override
+    public String getOwnerPrincipalName(Number id) {
+        BaseDescription baseDescription = getById(id);
+        if (baseDescription == null) {
+            return null;
+        }
+
+        long userId = baseDescription.getDbUserId();
+        RegistryUser user = userDao.findOne(userId);
+        if (user == null) {
+            return null;
+        }
+
+        return user.getPrincipalName();
+    }
+
+    @Override
+    public List<BaseDescription> getPublicBaseDescriptions(String prefix) {
+        return augment(jpaComponentDao.findPublishedItems(prefix + "%"));
+    }
+
+    @Override
+    public List<String> getAllNonDeletedProfileIds(String contentFilter) {
+        final String prefix = ProfileDescription.PROFILE_PREFIX + "%";
+        if (contentFilter == null) {
+            return jpaComponentDao.findNonDeletedItemIds(prefix);
+        } else {
+            return jpaComponentDao.findNonDeletedItemIds(prefix, contentFilter);
+        }
+    }
+
+    @Override
+    public List<String> getAllNonDeletedComponentIds(String contentFilter) {
+        final String prefix = ComponentDescription.COMPONENT_PREFIX + "%";
+        if (contentFilter == null) {
+            return jpaComponentDao.findNonDeletedItemIds(prefix);
+        } else {
+            return jpaComponentDao.findNonDeletedItemIds(prefix, contentFilter);
+        }
+    }
+
+    @Override
+    public List<BaseDescription> getAllNonDeletedDescriptions() {
+        return jpaComponentDao.findNonDeletedDescriptions();
+    }
+
+    // Olha was here
+    @Override
+    public List<String> getAllItemIdsInGroup(String prefix, Long groupId) {
+        // we are ineterested only in non-published components in the group
+        return jpaComponentDao.findAllItemIdsInGroup(false, prefix + "%", groupId);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/CommentsDao.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/CommentsDao.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/CommentsDao.java	(revision 5961)
@@ -0,0 +1,77 @@
+package clarin.cmdi.componentregistry.persistence.jpa;
+
+import java.util.List;
+
+import org.springframework.dao.DataAccessException;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+
+/**
+ * Interface for DAOs that handle comments
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public interface CommentsDao extends JpaRepository<Comment, Long>{
+
+	/**
+	 * Get the list of all the comments available in the database The
+	 * distinction between profile or component is not treated in this method
+	 * 
+	 * @return list of Comments
+	 */
+    	@Query("select c from Comment c order by c.id")
+	List<Comment> getAllComments();
+
+	/**
+	 * Retrieve the comments related to a certain component
+	 * 
+	 * @param id
+	 *            Database record id (fkey)
+	 * @return list of Comments
+	 * @throws DataAccessException
+	 */
+    	@Query("select c from Comment c where c.componentId = ?1 order by c.commentDate, c.id")
+	List<Comment> getCommentsFromItem(String componentId)
+			throws DataAccessException;
+
+	/**
+	 * 
+	 * @param id
+	 *            Id of description record
+	 * @return Principal name of description's owner, if any. Otherwise, null.
+	 */
+    	//@Query("select user from RegistryUser user, Comment comment, BaseDescription component where comment.id = ?1 and comment.componentId = component.componentId and component.dbUserId = user.id")
+	@Query("select user from RegistryUser user, Comment comment where comment.id = ?1 and user.id=comment.userId")
+	RegistryUser getOwnerOfComment(long id);
+
+	/**
+	 * Method use for tests that will select comments based on the content
+	 * 
+	 * @param aComment
+	 * @return list of Comments
+	 * @throws DataAccessException
+	 */
+    	@Query("select c from Comment c where c.comments = ?1")
+	Comment getByComment(String aComment) throws DataAccessException;
+
+	/**
+	 * Get number of comments for component
+	 * 
+	 * @param componentId
+	 * @return comment count
+	 */
+    	@Query("select count(c) from Comment c where c.componentId = ?1")
+	long findCommentCountForComponent(String componentId);
+    	
+	/**
+	 * Get number of comments for components
+	 * 
+	 * @param componentIds
+	 * @return list of (componentId,count) tuples
+	 */
+    	@Query(nativeQuery=true, value = "select component_id, count(*) from comments where component_id in (?1) group by component_id")
+	List<Object[]> findCommentCountForComponents(List<String> ids);
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/GroupDao.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/GroupDao.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/GroupDao.java	(revision 5961)
@@ -0,0 +1,19 @@
+package clarin.cmdi.componentregistry.persistence.jpa;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+
+import clarin.cmdi.componentregistry.model.Group;
+
+public interface GroupDao extends JpaRepository<Group, Long>{
+
+    @Query("select g from Group g where g.name=?1")
+    Group findGroupByName(String name);
+    
+    @Query("select g from Group g where g.ownerId=?1 order by g.name")
+    List<Group> findGroupOwnedByUser(long userId);
+    
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/GroupMembershipDao.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/GroupMembershipDao.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/GroupMembershipDao.java	(revision 5961)
@@ -0,0 +1,23 @@
+package clarin.cmdi.componentregistry.persistence.jpa;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import clarin.cmdi.componentregistry.model.GroupMembership;
+
+public interface GroupMembershipDao extends JpaRepository<GroupMembership, String>{
+
+    @Query("select gm from GroupMembership gm where gm.userId = ?1")
+    List<GroupMembership> findGroupsTheUserIsAmemberOf(long userId);
+
+    @Query("select gm from GroupMembership gm where gm.userId = ?1 and gm.groupId = ?2")
+    GroupMembership findMembership(long userId, long groupId);
+//
+//    @Query("delete gm from GroupMembership gm where gm.userId = ?1 and gm.groupId = ?2")
+//    int deleteMembership(long userId, long groupId);
+
+    @Query("select gm from GroupMembership gm where gm.groupId = ?1")
+    public List<GroupMembership> findForGroup(long groupId);
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/JpaComponentDao.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/JpaComponentDao.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/JpaComponentDao.java	(revision 5961)
@@ -0,0 +1,62 @@
+package clarin.cmdi.componentregistry.persistence.jpa;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+
+/**
+ * Basic jpa persistence functions. The more complicated rest is performed by {@link ComponentDao} 
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public interface JpaComponentDao extends JpaRepository<BaseDescription, Long>{
+
+    @Query("select c from BaseDescription c where c.componentId = ?1")
+    BaseDescription findByComponentId(String componentId);
+    
+    @Query("select c from BaseDescription c where c.ispublic = true and c.deleted = false order by upper(c.name), c.id")
+    List<BaseDescription> findPublicItems();
+
+    @Query("select c from BaseDescription c where c.ispublic = true and c.deleted = false and c.componentId like ?1 order by upper(c.name) asc")
+    List<BaseDescription> findPublishedItems(String idPrefix);
+
+    @Query("select c from BaseDescription c where c.ispublic = false and c.deleted = true and c.dbUserId = ?1 order by upper(c.name), c.id")
+    List<BaseDescription> findDeletedItemsForUser(Long userId);
+
+    @Query("select c from BaseDescription c where c.ispublic = true and c.deleted = true order by upper(c.name), c.id")
+    List<BaseDescription> findPublicDeletedItems();
+    
+    //compare @Query("select c from BaseDescription c where c.dbUserId = ?1 AND c.deleted = false AND c.ispublic = false AND c.componentId like ?2 order by upper(c.name), c.id")
+    @Query("select c from BaseDescription c where c.dbUserId = ?1 AND c.deleted = false AND c.ispublic = false AND c.componentId like ?2 AND not exists (select 1 from Ownership o where o.componentId = c.componentId) order by upper(c.name), c.id")
+    List<BaseDescription> findItemsForUserThatAreNotInGroups(Long userId, String idPrefix);
+
+    @Modifying
+    @Query(nativeQuery=true, value="update basedescription set content = ?2 where component_id like ?1")
+    void updateContent(String componentId, String content);
+    
+    @Query(nativeQuery=true, value="select content from basedescription where component_id like ?1 and is_deleted = ?2")
+    String findContentByComponentId(String componentId, boolean deleted);
+
+    @Query(nativeQuery=true, value="select content from basedescription where component_id like ?1")
+    String findContentByComponentId(String componentId);
+    
+    @Query("select c.componentId from BaseDescription c where c.deleted = false and c.componentId like ?1 order by c.id asc")
+    List<String> findNonDeletedItemIds(String componentIdPrefix);
+    
+    @Query("select c.componentId from BaseDescription c where c.deleted = false and c.componentId like ?1 and content like CONCAT('%', ?2, '%') order by c.id asc")
+    List<String> findNonDeletedItemIds(String componentIdPrefix, String contentFilter);
+    
+    @Query("select c from BaseDescription c where c.deleted = false order by c.id asc")
+    List<BaseDescription> findNonDeletedDescriptions();
+
+    @Query("select c from BaseDescription c where c.dbUserId = ?1 AND c.deleted = false AND c.ispublic = false AND c.componentId like ?2 order by upper(c.name), c.id")
+    List<BaseDescription> findNotPublishedUserItems(Long userId, String idPrefix);    
+    
+    @Query("select c.componentId from BaseDescription c where c.ispublic = ?1 AND c.componentId like ?2 AND exists (select o from Ownership o where o.componentId = c.componentId AND o.groupId = ?3)")
+    List<String> findAllItemIdsInGroup(boolean isPublished, String idPrefix, long groupId);
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/OwnershipDao.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/OwnershipDao.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/OwnershipDao.java	(revision 5961)
@@ -0,0 +1,25 @@
+package clarin.cmdi.componentregistry.persistence.jpa;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+
+import clarin.cmdi.componentregistry.model.Ownership;
+
+public interface OwnershipDao extends JpaRepository<Ownership, String>{
+
+    @Query("select o from Ownership o where o.userId=?1 and o.componentId=?2")
+    Ownership findOwnershipByUserAndComponent(long userId, String componentId);
+
+    @Query("select o from Ownership o where o.groupId=?1 and o.componentId=?2")
+    Ownership findOwnershipByGroupAndComponent(long groupId, String componentId);
+
+    @Query("select o from Ownership o where o.groupId=?1")
+    List<Ownership> findOwnershipByGroup(long groupId);
+    
+    @Query("select o from Ownership o where o.componentId=?1")
+    List<Ownership> findOwnershipByComponentId(String componentId);
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/UserDao.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/UserDao.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/jpa/UserDao.java	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry.persistence.jpa;
+
+import java.util.List;
+
+import org.springframework.dao.DataAccessException;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import clarin.cmdi.componentregistry.model.RegistryUser;
+
+/**
+ * 
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public interface UserDao extends JpaRepository<RegistryUser, Long>{
+
+    	@Query("select u from RegistryUser u order by id")
+	List<RegistryUser> getAllUsers() throws DataAccessException;
+
+	/**
+	 *
+	 * @param principalName User's principal name
+	 * @return User, if it exists
+	 * @throws DataAccessException
+	 */
+    	@Query("select u from RegistryUser u where u.principalName = ?1")
+	RegistryUser getByPrincipalName(String principalName)
+			throws DataAccessException;
+        
+        @Query("select u from RegistryUser u where u.id = ?1")
+	RegistryUser getPrincipalNameById(Number id) throws DataAccessException;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/support/BugFixedTransactionAwareDataSourceProxy.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/support/BugFixedTransactionAwareDataSourceProxy.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/persistence/support/BugFixedTransactionAwareDataSourceProxy.java	(revision 5961)
@@ -0,0 +1,225 @@
+package clarin.cmdi.componentregistry.persistence.support;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import javax.sql.DataSource;
+
+import org.springframework.jdbc.datasource.ConnectionProxy;
+import org.springframework.jdbc.datasource.DataSourceUtils;
+import org.springframework.jdbc.datasource.DelegatingDataSource;
+import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+import org.springframework.util.Assert;
+
+/**
+ * Copy of {@link TransactionAwareDataSourceProxy}. We're having a problem on lux16 with this stack overflow:
+ * 
+ * 	at com.sun.proxy.$Proxy454.close(Unknown Source)
+ *	at org.springframework.jdbc.support.JdbcUtils.closeConnection(JdbcUtils.java:67)
+ *	at org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle.releaseConnection(HibernateJpaDialect.java:169)
+ *	at org.springframework.jdbc.datasource.ConnectionHolder.released(ConnectionHolder.java:193)
+ *	at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:324)
+ *	at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:211)
+ *	at com.sun.proxy.$Proxy454.close(Unknown Source)
+ *	at org.springframework.jdbc.support.JdbcUtils.closeConnection(JdbcUtils.java:67)
+ *	at org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle.releaseConnection(HibernateJpaDialect.java:169)
+ *	at org.springframework.jdbc.datasource.ConnectionHolder.released(ConnectionHolder.java:193)
+ *	at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:324)
+ *	at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:211)
+ *	at com.sun.proxy.$Proxy454.close(Unknown Source)
+ *
+ * which is caused by the {@link TransactionAwareDataSourceProxy} closing the same connection multiple times.
+ *
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class BugFixedTransactionAwareDataSourceProxy extends
+	DelegatingDataSource {
+
+    private boolean reobtainTransactionalConnections = false;
+
+    public BugFixedTransactionAwareDataSourceProxy() {
+    }
+
+    public BugFixedTransactionAwareDataSourceProxy(DataSource targetDataSource) {
+	super(targetDataSource);
+    }
+
+    /**
+     * Specify whether to reobtain the target Connection for each operation
+     * performed within a transaction.
+     * <p>
+     * The default is "false". Specify "true" to reobtain transactional
+     * Connections for every call on the Connection proxy; this is advisable on
+     * JBoss if you hold on to a Connection handle across transaction
+     * boundaries.
+     * <p>
+     * The effect of this setting is similar to the
+     * "hibernate.connection.release_mode" value "after_statement".
+     */
+    public void setReobtainTransactionalConnections(
+	    boolean reobtainTransactionalConnections) {
+	this.reobtainTransactionalConnections = reobtainTransactionalConnections;
+    }
+
+    /**
+     * Delegates to DataSourceUtils for automatically participating in
+     * Spring-managed transactions. Throws the original SQLException, if any.
+     * <p>
+     * The returned Connection handle implements the ConnectionProxy interface,
+     * allowing to retrieve the underlying target Connection.
+     * 
+     * @return a transactional Connection if any, a new one else
+     * @see DataSourceUtils#doGetConnection
+     * @see ConnectionProxy#getTargetConnection
+     */
+    @Override
+    public Connection getConnection() throws SQLException {
+	DataSource ds = getTargetDataSource();
+	Assert.state(ds != null, "'targetDataSource' is required");
+	return getTransactionAwareConnectionProxy(ds);
+    }
+
+    /**
+     * Wraps the given Connection with a proxy that delegates every method call
+     * to it but delegates <code>close()</code> calls to DataSourceUtils.
+     * 
+     * @param targetDataSource
+     *            DataSource that the Connection came from
+     * @return the wrapped Connection
+     * @see java.sql.Connection#close()
+     * @see DataSourceUtils#doReleaseConnection
+     */
+    protected Connection getTransactionAwareConnectionProxy(
+	    DataSource targetDataSource) {
+	return (Connection) Proxy.newProxyInstance(
+		ConnectionProxy.class.getClassLoader(),
+		new Class[] { ConnectionProxy.class },
+		new TransactionAwareInvocationHandler(targetDataSource));
+    }
+
+    /**
+     * Determine whether to obtain a fixed target Connection for the proxy or to
+     * reobtain the target Connection for each operation.
+     * <p>
+     * The default implementation returns <code>true</code> for all standard
+     * cases. This can be overridden through the
+     * {@link #setReobtainTransactionalConnections
+     * "reobtainTransactionalConnections"} flag, which enforces a non-fixed
+     * target Connection within an active transaction. Note that
+     * non-transactional access will always use a fixed Connection.
+     * 
+     * @param targetDataSource
+     *            the target DataSource
+     */
+    protected boolean shouldObtainFixedConnection(DataSource targetDataSource) {
+	return (!TransactionSynchronizationManager.isSynchronizationActive() || !this.reobtainTransactionalConnections);
+    }
+
+    /**
+     * Invocation handler that delegates close calls on JDBC Connections to
+     * DataSourceUtils for being aware of thread-bound transactions.
+     */
+    private class TransactionAwareInvocationHandler implements
+	    InvocationHandler {
+
+	private final DataSource targetDataSource;
+
+	private Connection target;
+
+	private boolean closed = false;
+
+	public TransactionAwareInvocationHandler(DataSource targetDataSource) {
+	    this.targetDataSource = targetDataSource;
+	}
+
+	public Object invoke(Object proxy, Method method, Object[] args)
+		throws Throwable {
+	    // Invocation on ConnectionProxy interface coming in...
+
+	    if (method.getName().equals("equals")) {
+		// Only considered as equal when proxies are identical.
+		return (proxy == args[0]);
+	    } else if (method.getName().equals("hashCode")) {
+		// Use hashCode of Connection proxy.
+		return System.identityHashCode(proxy);
+	    } else if (method.getName().equals("toString")) {
+		// Allow for differentiating between the proxy and the raw
+		// Connection.
+		StringBuilder sb = new StringBuilder(
+			"Transaction-aware proxy for target Connection ");
+		if (this.target != null) {
+		    sb.append("[").append(this.target.toString()).append("]");
+		} else {
+		    sb.append(" from DataSource [")
+			    .append(this.targetDataSource).append("]");
+		}
+		return sb.toString();
+	    } else if (method.getName().equals("unwrap")) {
+		if (((Class) args[0]).isInstance(proxy)) {
+		    return proxy;
+		}
+	    } else if (method.getName().equals("isWrapperFor")) {
+		if (((Class) args[0]).isInstance(proxy)) {
+		    return true;
+		}
+	    } else if (method.getName().equals("close")) {
+		// Handle close method: only close if not within a transaction.
+		DataSourceUtils.doReleaseConnection(this.target,
+			this.targetDataSource);
+		this.closed = true;
+		return null;
+	    } else if (method.getName().equals("isClosed")) {
+		return this.closed;
+	    }
+
+	    if (this.target == null) {
+		if (this.closed) {
+		    throw new SQLException("Connection handle already closed");
+		}
+		if (shouldObtainFixedConnection(this.targetDataSource)) {
+		    this.target = DataSourceUtils
+			    .doGetConnection(this.targetDataSource);
+		}
+	    }
+	    Connection actualTarget = this.target;
+	    if (actualTarget == null) {
+		actualTarget = DataSourceUtils
+			.doGetConnection(this.targetDataSource);
+	    }
+
+	    if (method.getName().equals("getTargetConnection")) {
+		// Handle getTargetConnection method: return underlying
+		// Connection.
+		return actualTarget;
+	    }
+
+	    // Invoke method on target Connection.
+	    try {
+		Object retVal = method.invoke(actualTarget, args);
+
+		// If return value is a Statement, apply transaction timeout.
+		// Applies to createStatement, prepareStatement, prepareCall.
+		if (retVal instanceof Statement) {
+		    DataSourceUtils.applyTransactionTimeout((Statement) retVal,
+			    this.targetDataSource);
+		}
+
+		return retVal;
+	    } catch (InvocationTargetException ex) {
+		throw ex.getTargetException();
+	    } finally {
+		if (actualTarget != this.target) {
+		    DataSourceUtils.doReleaseConnection(actualTarget,
+			    this.targetDataSource);
+		}
+	    }
+	}
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/CommentValidator.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/CommentValidator.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/CommentValidator.java	(revision 5961)
@@ -0,0 +1,79 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import javax.xml.bind.JAXBException;
+
+/**
+ * Implementation of Validator
+ * @author jean-charles FerriÃšres <jean-charles.ferrieres@mpi.nl>
+ */
+class CommentValidator implements Validator {
+
+    static final String PARSE_ERROR = "Error in validation input file. Error is: ";
+    static final String COMMENT_SPECIFICATION_ERROR = "Illegal comment specification: ";
+    static final Collection<String> ILLEGAL_ATTRIBUTE_NAMES = Collections.unmodifiableCollection(Arrays.asList("ref", "CommentId"));
+    private List<String> errorMessages = new ArrayList<String>();
+    private Comment com = null;
+    private final InputStream input;
+    private final BaseDescription description;
+    private final MDMarshaller marshaller;
+
+    /*
+     * @param input In order to validate the input is consumed. So use @see getCommentSpec to get the parsed CommentSpec.
+     * @param description use to validate the comment with the appropriate description (profile or a component)
+     */
+    public CommentValidator(InputStream input, BaseDescription description, MDMarshaller marshaller) {
+	this.input = input;
+	this.description = description;
+	this.marshaller = marshaller;
+    }
+
+    @Override
+    public List<String> getErrorMessages() {
+	return errorMessages;
+    }
+
+    @Override
+    public boolean validate() {
+	try {
+	    com = marshaller.unmarshal(Comment.class, input, null);
+	} catch (JAXBException e) {
+	    errorMessages.add(PARSE_ERROR + e);
+	}
+	if (errorMessages.isEmpty()) {
+	    validateComment(com);
+	}
+	return errorMessages.isEmpty();
+    }
+
+    /*
+     * Method that check wether a comment is valid (good attributes)
+     * @param comment, the comment to be validated
+     */
+    private void validateComment(Comment comment) {
+	if (comment.getComment() == null || comment.getComment().isEmpty()) {
+	    errorMessages.add(COMMENT_SPECIFICATION_ERROR + "comment has to be filled in");
+	}
+	if (description.isProfile()) {
+	    if (comment.getComponentId() == null || comment.getComponentId().isEmpty()) {
+		errorMessages.add(COMMENT_SPECIFICATION_ERROR + "profileId could not be found");
+	    }
+	} else {
+	    if (comment.getComponentId() == null || comment.getComponentId().isEmpty()) {
+		errorMessages.add(COMMENT_SPECIFICATION_ERROR + "componentId could not be found");
+	    }
+	}
+    }
+
+    public Comment getCommentSpec() {
+	return com;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ComponentClosure.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ComponentClosure.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ComponentClosure.java	(revision 5961)
@@ -0,0 +1,17 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+
+public class ComponentClosure implements RegistryClosure<ComponentDescription> {
+
+    @Override
+    public ComponentDescription getDescription(ComponentRegistry registry, String id) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        return registry.getComponentDescriptionAccessControlled(id);
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestService.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestService.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestService.java	(revision 5961)
@@ -0,0 +1,1998 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AllowedAttributetypesXML;
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.DeleteFailedException;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserCredentials;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import clarin.cmdi.componentregistry.impl.database.GroupService;
+import clarin.cmdi.componentregistry.impl.database.ValidationException;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.CommentResponse;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+import clarin.cmdi.componentregistry.rss.Rss;
+import clarin.cmdi.componentregistry.rss.RssCreatorComments;
+import clarin.cmdi.componentregistry.rss.RssCreatorDescriptions;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
+import com.sun.jersey.api.core.InjectParam;
+import com.sun.jersey.multipart.FormDataParam;
+import com.wordnik.swagger.annotations.Api;
+import com.wordnik.swagger.annotations.ApiOperation;
+import com.wordnik.swagger.annotations.ApiResponse;
+import com.wordnik.swagger.annotations.ApiResponses;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.security.Principal;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+import javax.xml.bind.JAXBException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Handles CRUD operations on
+ * {@link ComponentDescription}, {@link ProfileDescription} and {@link Comment}s
+ *
+ * @author twago@mpi.nl
+ * @author olsha@mpi.nl
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+@Path("/registry")
+@Service
+@Transactional(rollbackFor = {Exception.class, ValidationException.class})
+@Api(value = "/registry", description = "Rest API for the CMDI Component Registry", produces = MediaType.APPLICATION_XML)
+public class ComponentRegistryRestService implements
+        IComponentRegistryRestService {
+
+    private final static Logger LOG = LoggerFactory
+            .getLogger(ComponentRegistryRestService.class);
+    @Context
+    private UriInfo uriInfo;
+    @Context
+    private SecurityContext security;
+    @Context
+    private HttpServletRequest request;
+    @Context
+    private HttpServletResponse response;
+    @Context
+    private ServletContext servletContext;
+    @InjectParam(value = "componentRegistryFactory")
+    private ComponentRegistryFactory componentRegistryFactory;
+    @InjectParam(value = "mdMarshaller")
+    private MDMarshaller marshaller;
+    @Autowired
+    private GroupService groupService;
+
+    private ComponentRegistry getBaseRegistry() throws AuthenticationRequiredException {
+        Principal userPrincipal = security.getUserPrincipal();
+        if (userPrincipal == null) {
+            return componentRegistryFactory.getBaseRegistry(null);
+        } else {
+            UserCredentials userCredentials = this.getUserCredentials(userPrincipal);
+            return componentRegistryFactory.getBaseRegistry(userCredentials);
+        }
+    }
+
+    private ComponentRegistry getRegistry(RegistrySpace space, Number groupId) {
+        Principal userPrincipal = security.getUserPrincipal();
+        UserCredentials userCredentials = this.getUserCredentials(userPrincipal);
+        try {
+            return componentRegistryFactory.getComponentRegistry(space, null, userCredentials, groupId);
+        } catch (UserUnauthorizedException uuEx) {
+            LOG.warn("Unauthorized access to {} registry by user {}", space,
+                    userCredentials);
+            LOG.debug("Details for unauthorized access", uuEx);
+            throw new WebApplicationException(uuEx, Status.FORBIDDEN);
+        }
+    }
+
+    /**
+     *
+     * @return Principal of current request
+     * @throws AuthenticationRequiredException If no user principal found
+     */
+    private Principal checkAndGetUserPrincipal()
+            throws AuthenticationRequiredException {
+        Principal principal = security.getUserPrincipal();
+        if (principal == null) {
+            throw new AuthenticationRequiredException("No user principal found.");
+        }
+        return principal;
+    }
+
+    private UserCredentials getUserCredentials(Principal userPrincipal) {
+        UserCredentials userCredentials = null;
+        if (userPrincipal != null) {
+            userCredentials = new UserCredentials(userPrincipal);
+        }
+        return userCredentials;
+    }
+
+    private ComponentRegistry initialiseRegistry(String space, String groupId) throws AuthenticationRequiredException {
+        //checking credentials 
+        RegistrySpace regSpace = RegistrySpace.valueOf(space.toUpperCase());
+        if (regSpace != RegistrySpace.PUBLISHED) {
+            // ensure that user is authenticated
+            this.getUserCredentials(this.checkAndGetUserPrincipal());
+        }
+        // initializing the registry
+        Number groupIdNumber = null;
+        if (groupId != null && !groupId.isEmpty()) {
+            groupIdNumber = Integer.parseInt(groupId);
+        }
+
+        return this.getRegistry(regSpace, groupIdNumber);
+    }
+
+    private boolean checkRegistrySpaceString(String registrySpace) {
+        return (registrySpace.equalsIgnoreCase(REGISTRY_SPACE_GROUP) || registrySpace.equalsIgnoreCase(REGISTRY_SPACE_PRIVATE) || registrySpace.equalsIgnoreCase(REGISTRY_SPACE_PUBLISHED));
+    }
+
+    @Override
+    @GET
+    @Path("/components")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "A listing of the descriptions of components in the specified registry space")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Registry requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public registry is not owned by current user"),
+        @ApiResponse(code = 404, message = "Registry space does not exist")
+    })
+    public List<ComponentDescription> getRegisteredComponents(
+            @QueryParam(REGISTRY_SPACE_PARAM) @DefaultValue(REGISTRY_SPACE_PUBLISHED) String registrySpace,
+            @QueryParam(GROUPID_PARAM) String groupId,
+            @Deprecated @QueryParam(USER_SPACE_PARAM) @DefaultValue("") String userSpace)
+            throws ComponentRegistryException, IOException {
+        long start = System.currentTimeMillis();
+
+        // deprecated parameter, processed here for backwards compatibility
+        if (!Strings.isNullOrEmpty(userSpace)) {
+            LOG.warn("Usage of deprecated {} parameter", USER_SPACE_PARAM);
+            if (Boolean.valueOf(userSpace)) {
+                registrySpace = REGISTRY_SPACE_PRIVATE;
+            }
+        }
+
+        if (!checkRegistrySpaceString(registrySpace)) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), "illegal registry space");
+            return new ArrayList<ComponentDescription>();
+        }
+
+        try {
+            ComponentRegistry cr = this.initialiseRegistry(registrySpace, groupId);
+            List<ComponentDescription> result = cr.getComponentDescriptions();
+            LOG.debug(
+                    "Releasing {} registered components into the world ({} millisecs)",
+                    result.size(), (System.currentTimeMillis() - start));
+
+            return result;
+        } catch (AuthenticationRequiredException e) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e.toString());
+            return new ArrayList<ComponentDescription>();
+
+        } catch (UserUnauthorizedException e) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e.toString());
+            return new ArrayList<ComponentDescription>();
+
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.toString());
+            return new ArrayList<ComponentDescription>();
+        }
+
+    }
+
+    @Override
+    @GET
+    @Path("/profiles")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "A listing of the descriptions of profiles in the specified registry space")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Registry requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public registry is not owned by current user"),
+        @ApiResponse(code = 404, message = "Registry space does not exist")
+    })
+    public List<ProfileDescription> getRegisteredProfiles(
+            @QueryParam(REGISTRY_SPACE_PARAM) @DefaultValue(REGISTRY_SPACE_PUBLISHED) String registrySpace,
+            @QueryParam(METADATA_EDITOR_PARAM) @DefaultValue("false") boolean metadataEditor,
+            @QueryParam(GROUPID_PARAM) String groupId,
+            @Deprecated @QueryParam(USER_SPACE_PARAM) @DefaultValue("") String userSpace
+    )
+            throws ComponentRegistryException, IOException {
+
+        long start = System.currentTimeMillis();
+
+        // deprecated parameter, processed here for backwards compatibility
+        if (!Strings.isNullOrEmpty(userSpace)) {
+            LOG.warn("Usage of deprecated {} parameter", USER_SPACE_PARAM);
+            if (Boolean.valueOf(userSpace)) {
+                registrySpace = REGISTRY_SPACE_PRIVATE;
+            }
+        }
+
+        if (!checkRegistrySpaceString(registrySpace)) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), "illegal registry space");
+            return new ArrayList<ProfileDescription>();
+        }
+        try {
+            ComponentRegistry cr = this.initialiseRegistry(registrySpace, groupId);
+            List<ProfileDescription> result = (metadataEditor) ? cr.getProfileDescriptionsForMetadaEditor() : cr.getProfileDescriptions();
+            LOG.debug(
+                    "Releasing {} registered components into the world ({} millisecs)",
+                    result.size(), (System.currentTimeMillis() - start));
+
+            return result;
+        } catch (AuthenticationRequiredException e) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e.toString());
+            return new ArrayList<ProfileDescription>();
+
+        } catch (UserUnauthorizedException e) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e.toString());
+            return new ArrayList<ProfileDescription>();
+
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.toString());
+            return new ArrayList<ProfileDescription>();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/components/{componentId}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "The component specification of a single component")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response getRegisteredComponent(
+            @PathParam("componentId") String componentId) throws IOException {
+        LOG.debug("Component with id: {} is requested.", componentId);
+        try {
+            CMDComponentSpec mdComponent = this.getBaseRegistry().getMDComponentAccessControlled(componentId);
+            return Response.ok(mdComponent).build();
+        } catch (ItemNotFoundException e) {
+            return Response.status(Status.NOT_FOUND).build();
+        } catch (ComponentRegistryException e1) {
+            return Response.serverError().status(Status.CONFLICT).build();
+        } catch (AuthenticationRequiredException e) {
+            return Response.serverError().status(Status.UNAUTHORIZED).build();
+        } catch (UserUnauthorizedException e) {
+            return Response.serverError().status(Status.FORBIDDEN).build();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/profiles/{profileId}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "The component specification of a single profile")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response getRegisteredProfile(
+            @PathParam("profileId") String profileId) throws IOException {
+        LOG.debug("Profile with id {} is requested.", profileId);
+        try {
+            CMDComponentSpec mdProfile = this.getBaseRegistry().getMDProfileAccessControled(profileId);
+            return Response.ok(mdProfile).build();
+        } catch (ItemNotFoundException e) {
+            return Response.status(Status.NOT_FOUND).build();
+        } catch (ComponentRegistryException e1) {
+            return Response.serverError().status(Status.CONFLICT).build();
+        } catch (UserUnauthorizedException e) {
+            return Response.serverError().status(Status.FORBIDDEN).build();
+        } catch (AuthenticationRequiredException e) {
+            return Response.serverError().status(Status.UNAUTHORIZED).build();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/components/{componentId}/{rawType}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML})
+    @ApiOperation(value = "The expanded XML or XSD represenation of the component specification of a single component (publicly accessible regardless of state!)")
+    @ApiResponses(value = {
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response getRegisteredComponentRawType(
+            @PathParam("componentId") final String componentId, @PathParam("rawType") String rawType) throws ComponentRegistryException {
+
+        LOG.debug("Component with id: {} and rawType: {} is requested.", componentId, rawType);
+        try {
+            final ComponentRegistry registry = this.getBaseRegistry();
+            ComponentDescription desc = registry.getComponentDescription(componentId);
+            StreamingOutput result = null;
+            String fileName = desc.getName() + "." + rawType;
+            if ("xml".equalsIgnoreCase(rawType)) {
+                result = new StreamingOutput() {
+                    @Override
+                    public void write(OutputStream output) throws IOException,
+                            WebApplicationException {
+                        try {
+                            try {
+                                try {
+                                    registry.getMDComponentAsXml(componentId, output);
+                                } catch (ItemNotFoundException e) {
+                                    LOG.warn("Could not retrieve component {}: {}",
+                                            componentId, e.getMessage());
+                                    LOG.debug("Details", e);
+                                    throw new WebApplicationException(Response
+                                            .serverError()
+                                            .status(Status.INTERNAL_SERVER_ERROR)
+                                            .build());
+                                }
+                            } catch (ComponentRegistryException e) {
+                                LOG.warn("Could not retrieve component {}: {}",
+                                        componentId, e.getMessage());
+                                LOG.debug("Details", e);
+                                throw new WebApplicationException(Response
+                                        .serverError()
+                                        .status(Status.INTERNAL_SERVER_ERROR)
+                                        .build());
+                            }
+
+                        } catch (UserUnauthorizedException e2) {
+                            LOG.error(e2.toString());
+                        }
+                    }
+                };
+                return createDownloadResponse(result, fileName);
+            } else if ("xsd".equalsIgnoreCase(rawType)) {
+                result = new StreamingOutput() {
+                    @Override
+                    public void write(OutputStream output) throws IOException,
+                            WebApplicationException {
+                        try {
+                            try {
+                                try {
+                                    registry.getMDComponentAsXsd(componentId, output);
+                                } catch (ItemNotFoundException e) {
+                                    LOG.warn("Could not retrieve component {}: {}",
+                                            componentId, e.getMessage());
+                                    LOG.debug("Details", e);
+                                    throw new WebApplicationException(Response
+                                            .serverError()
+                                            .status(Status.INTERNAL_SERVER_ERROR)
+                                            .build());
+                                }
+                            } catch (ComponentRegistryException e) {
+                                LOG.warn("Could not retrieve component {}: {}",
+                                        componentId, e.getMessage());
+                                LOG.debug("Details", e);
+                                throw new WebApplicationException(Response
+                                        .serverError()
+                                        .status(Status.INTERNAL_SERVER_ERROR)
+                                        .build());
+                            }
+                        } catch (UserUnauthorizedException e2) {
+                            LOG.error(e2.toString());
+                        }
+
+                    }
+                };
+                return createDownloadResponse(result, fileName);
+            } else {
+                return Response.status(Status.NOT_FOUND).entity("Usupported raw type " + rawType).build();
+            }
+        } catch (ItemNotFoundException e3) {
+            return Response.status(Status.NOT_FOUND).build();
+        } catch (AuthenticationRequiredException e) {
+            return Response.serverError().status(Status.UNAUTHORIZED).build();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/components/usage/{componentId}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Returns a descriptions listing of components that use the identified component")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated")
+    })
+    public List<BaseDescription> getComponentUsage(
+            @PathParam("componentId") String componentId) throws ComponentRegistryException, IOException {
+
+        final long start = System.currentTimeMillis();
+        try {
+            ComponentRegistry registry = this.getBaseRegistry();
+            List<ComponentDescription> components = registry.getUsageInComponents(componentId);
+            List<ProfileDescription> profiles = registry.getUsageInProfiles(componentId);
+
+            LOG.debug(
+                    "Found {} components and {} profiles that use component {} ({} millisecs)",
+                    components.size(), profiles.size(), componentId,
+                    (System.currentTimeMillis() - start));
+
+            List<BaseDescription> usages = new ArrayList<BaseDescription>(components.size() + profiles.size());
+            usages.addAll(components);
+            usages.addAll(profiles);
+
+            return usages;
+        } catch (ComponentRegistryException e) {
+            LOG.warn("Could not retrieve profile usage {}", componentId);
+            LOG.debug("Details", e);
+            return new ArrayList<BaseDescription>();
+        } catch (AuthenticationRequiredException e1) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode());
+            return new ArrayList<BaseDescription>();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/profiles/{profileId}/comments")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Returns a listing of all comments that have been made on the identified profile")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user and user is no administrator"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public List<Comment> getCommentsFromProfile(
+            @PathParam("profileId") String profileId)
+            throws IOException {
+        long start = System.currentTimeMillis();
+        try {
+            List<Comment> comments = this.getBaseRegistry().getCommentsInProfile(profileId);
+            LOG.debug(
+                    "Releasing {} registered comments in profile into the world ({} millisecs)",
+                    comments.size(), (System.currentTimeMillis() - start));
+            return comments;
+        } catch (ComponentRegistryException e) {
+            response.sendError(Status.INTERNAL_SERVER_ERROR.getStatusCode(), e.getMessage());
+            return new ArrayList<Comment>();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.getMessage());
+            return new ArrayList<Comment>();
+        } catch (UserUnauthorizedException e) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e.getMessage());
+            return new ArrayList<Comment>();
+        } catch (AuthenticationRequiredException e1) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e1.getMessage());
+            return new ArrayList<Comment>();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/components/{componentId}/comments")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Returns a listing of all comments that have been made on the identified component")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user and user is no administrator"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public List<Comment> getCommentsFromComponent(
+            @PathParam("componentId") String componentId)
+            throws IOException {
+        long start = System.currentTimeMillis();
+        try {
+            List<Comment> comments = this.getBaseRegistry().getCommentsInComponent(componentId);
+            LOG.debug(
+                    "Releasing {} registered comments in Component into the world ({} millisecs)",
+                    comments.size(), (System.currentTimeMillis() - start));
+            return comments;
+        } catch (ComponentRegistryException e) {
+            response.sendError(Status.INTERNAL_SERVER_ERROR.getStatusCode(), e.getMessage());
+            return new ArrayList<Comment>();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.getMessage());
+            return new ArrayList<Comment>();
+        } catch (UserUnauthorizedException e1) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e1.getMessage());
+            return new ArrayList<Comment>();
+        } catch (AuthenticationRequiredException e1) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e1.getMessage());
+            return new ArrayList<Comment>();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/profiles/{profileId}/comments/{commentId}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Returns a single comment on a profile")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Component requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public component is not owned by current user"),
+        @ApiResponse(code = 404, message = "Component or comment does not exist")
+    })
+    public Comment getSpecifiedCommentFromProfile(
+            @PathParam("profileId") String profileId,
+            @PathParam("commentId") String commentId)
+            throws IOException {
+
+        LOG.debug("Comments of profile with id {} are requested.", commentId);
+        try {
+
+            return this.getBaseRegistry().getSpecifiedCommentInProfile(profileId, commentId);
+        } catch (ComponentRegistryException e) {
+            response.sendError(Status.INTERNAL_SERVER_ERROR.getStatusCode(), e.getMessage());
+            return new Comment();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.getMessage());
+            return new Comment();
+        } catch (UserUnauthorizedException e1) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e1.getMessage());
+            return new Comment();
+        } catch (AuthenticationRequiredException e1) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e1.getMessage());
+            return new Comment();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/components/{componentId}/comments/{commentId}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Returns a single comment on a component")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Component requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public component is not owned by current user"),
+        @ApiResponse(code = 404, message = "Component or comment does not exist")
+    })
+    public Comment getSpecifiedCommentFromComponent(
+            @PathParam("componentId") String componentId,
+            @PathParam("commentId") String commentId)
+            throws IOException {
+        LOG.debug("Comments of component with id {} are requested.", commentId);
+        try {
+            Comment result = this.getBaseRegistry().getSpecifiedCommentInComponent(componentId, commentId);
+            return result;
+        } catch (ComponentRegistryException e) {
+            response.sendError(Status.INTERNAL_SERVER_ERROR.getStatusCode(), e.getMessage());
+            return new Comment();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.getMessage());
+            return new Comment();
+        } catch (UserUnauthorizedException e1) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e1.getMessage());
+            return new Comment();
+        } catch (AuthenticationRequiredException e1) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e1.getMessage());
+            return new Comment();
+        }
+    }
+
+    /**
+     *
+     * Purely helper method for my front-end (FLEX) which only does post/get
+     * requests. The query param is checked and the "proper" method is called.
+     *
+     * @param profileId
+     * @param method
+     * @return
+     */
+    // TODO: test via POSTMAN
+    @Override
+    @POST
+    @Path("/profiles/{profileId}")
+    @ApiOperation(value = "Allows for deletion of single profile (workaround for Flex which does not support the DELETE method)")
+    public Response manipulateRegisteredProfile(
+            @PathParam("profileId") String profileId,
+            @FormParam("method") String method) {
+        if ("delete".equalsIgnoreCase(method)) {
+            return this.deleteRegisteredProfile(profileId);
+        } else {
+            return Response.ok().build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/profiles/{profileId}/comments/{commentId}")
+    @ApiOperation(value = "Allows for deletion of single profile comment (workaround for Flex which does not support the DELETE method)")
+    public Response manipulateCommentFromProfile(
+            @PathParam("profileId") String profileId,
+            @PathParam("commentId") String commentId,
+            @FormParam("method") String method) {
+        if ("delete".equalsIgnoreCase(method)) {
+            return this.deleteCommentFromProfile(profileId, commentId);
+        } else {
+            return Response.ok().build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/components/{componentId}/comments/{commentId}")
+    @ApiOperation(value = "Allows for deletion of single component comment (workaround for Flex which does not support the DELETE method)")
+    public Response manipulateCommentFromComponent(
+            @PathParam("componentId") String componentId,
+            @PathParam("commentId") String commentId,
+            @FormParam("method") String method) {
+        if ("delete".equalsIgnoreCase(method)) {
+            return this.deleteCommentFromComponent(componentId, commentId);
+        } else {
+            return Response.ok().build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/profiles/{profileId}/publish")
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Changes the state of the specified profile to published")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response publishRegisteredProfile(
+            @PathParam("profileId") String profileId,
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @FormDataParam(NAME_FORM_FIELD) String name,
+            @FormDataParam(DESCRIPTION_FORM_FIELD) String description,
+            @FormDataParam(GROUP_FORM_FIELD) String group,
+            @FormDataParam(DOMAIN_FORM_FIELD) String domainName) {
+
+        try {
+            Principal principal = checkAndGetUserPrincipal();
+            ComponentRegistry registry = this.getBaseRegistry();
+            registry.setRegistrySpace(RegistrySpace.PUBLISHED);
+            ProfileDescription desc = registry.getProfileDescriptionAccessControlled(profileId);
+            if (desc != null) {
+                if (desc.isPublic()) {
+                    return Response.status(Status.CONFLICT).entity("Cannot publish already published profile.")
+                            .build();
+                }
+                desc.setPublic(true);
+                this.updateDescription(desc, name, description, domainName, group);
+                return this.register(input, desc, new PublishAction(principal), registry);
+            } else {
+                LOG.error("Update of nonexistent profile {} failed.", profileId);
+                return Response
+                        .serverError()
+                        .entity("Invalid id, cannot update nonexistent profile")
+                        .build();
+            }
+
+        } catch (AuthenticationRequiredException e) {
+            return Response.serverError().status(Status.UNAUTHORIZED)
+                    .build();
+        } catch (ItemNotFoundException e1) {
+            return Response.status(Status.NOT_FOUND).entity(e1.getMessage()).build();
+        } catch (ComponentRegistryException e) {
+            LOG.warn("Could not retrieve profile {}", profileId);
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN).entity(ex.getMessage())
+                    .build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/profiles/{profileId}/update")
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Updates an already registered (but unpublished) profile")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response updateRegisteredProfile(
+            @PathParam("profileId") String profileId,
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @FormDataParam(NAME_FORM_FIELD) String name,
+            @FormDataParam(DESCRIPTION_FORM_FIELD) String description,
+            @FormDataParam(GROUP_FORM_FIELD) String group,
+            @FormDataParam(DOMAIN_FORM_FIELD) String domainName) {
+        try {
+            ComponentRegistry br = this.getBaseRegistry();
+            ProfileDescription desc = br.getProfileDescriptionAccessControlled(profileId);
+            if (desc != null) {
+                if (desc.isPublic()) {
+                    return Response.status(Status.CONFLICT).entity("Cannot update already published profile.")
+                            .build();
+
+                }
+                Number groupId;
+                RegistrySpace space;
+                List<Number> groupIds = br.getItemGroups(profileId);
+                if (groupIds == null || groupIds.isEmpty()) {
+                    groupId = null;
+                    space = RegistrySpace.PRIVATE;
+                } else {
+                    groupId = groupIds.get(0);
+                    space = RegistrySpace.GROUP;
+                }
+
+                updateDescription(desc, name, description, domainName, group);
+                ComponentRegistry cr = this.getRegistry(space, groupId);
+                return register(input, desc, new UpdateAction(), cr);
+            } else {
+                LOG.error("Update of nonexistent id (" + profileId
+                        + ") failed.");
+                return Response
+                        .serverError()
+                        .entity("Invalid id, cannot update nonexistent profile")
+                        .build();
+            }
+        } catch (ComponentRegistryException e) {
+            LOG.warn("Could not retrieve profile {}", profileId);
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN).entity(ex.getMessage())
+                    .build();
+
+        } catch (ItemNotFoundException ex2) {
+            return Response.status(Status.NOT_FOUND).entity(ex2.getMessage())
+                    .build();
+        } catch (AuthenticationRequiredException e1) {
+            return Response.status(Status.UNAUTHORIZED).entity(e1.getMessage())
+                    .build();
+        }
+
+    }
+
+    /**
+     *
+     * Purely helper method for my front-end (FLEX) which van only do post/get
+     * requests. The query param is checked and the "proper" method is called.
+     *
+     * @param componentId
+     * @param method
+     * @return
+     */
+    @Override
+    @POST
+    @Path("/components/{componentId}")
+    @ApiOperation(value = "Allows for deletion of single component (workaround for Flex which does not support the DELETE method)")
+    public Response manipulateRegisteredComponent(
+            @PathParam("componentId") String componentId,
+            @FormParam("method") String method) {
+        if ("delete".equalsIgnoreCase(method)) {
+            return this.deleteRegisteredComponent(componentId);
+        } else {
+            return Response.ok("Nothing to do, not 'delete' method").build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/components/{componentId}/publish")
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Changes the state of the specified component to published")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response publishRegisteredComponent(
+            @PathParam("componentId") String componentId,
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @FormDataParam(NAME_FORM_FIELD) String name,
+            @FormDataParam(DESCRIPTION_FORM_FIELD) String description,
+            @FormDataParam(GROUP_FORM_FIELD) String group,
+            @FormDataParam(DOMAIN_FORM_FIELD) String domainName) {
+
+        try {
+            Principal principal = checkAndGetUserPrincipal();
+            ComponentRegistry registry = this.getBaseRegistry();
+            ComponentDescription desc = registry.getComponentDescriptionAccessControlled(componentId);
+            if (desc != null) {
+                if (desc.isPublic()) {
+                    return Response.status(Status.CONFLICT).entity("Cannot publish already published omponent.")
+                            .build();
+                }
+                desc.setPublic(true);
+                this.updateDescription(desc, name, description, domainName, group);
+                return this.register(input, desc, new PublishAction(principal), registry);
+            } else {
+                LOG.error("Update of nonexistent id (" + componentId
+                        + ") failed.");
+                return Response
+                        .serverError()
+                        .entity("Invalid id, cannot update nonexistent profile")
+                        .build();
+            }
+        } catch (AuthenticationRequiredException e) {
+            LOG.warn("Could not retrieve component {}", componentId);
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.UNAUTHORIZED)
+                    .build();
+        } catch (ComponentRegistryException e) {
+            LOG.warn("Could not retrieve component {}", componentId);
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (ItemNotFoundException e) {
+            LOG.warn("Could not retrieve component {}", componentId);
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.NOT_FOUND)
+                    .build();
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN).entity(ex.getMessage())
+                    .build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/components/{componentId}/update")
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Updates an already registered (but unpublished) component")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response updateRegisteredComponent(
+            @PathParam("componentId") String componentId,
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @FormDataParam(NAME_FORM_FIELD) String name,
+            @FormDataParam(DESCRIPTION_FORM_FIELD) String description,
+            @FormDataParam(GROUP_FORM_FIELD) String group,
+            @FormDataParam(DOMAIN_FORM_FIELD) String domainName) {
+        try {
+            ComponentRegistry br = this.getBaseRegistry();
+            ComponentDescription desc = br.getComponentDescriptionAccessControlled(componentId);
+            if (desc != null) {
+                if (desc.isPublic()) {
+                    return Response.status(Status.CONFLICT).entity("Cannot update already published component.")
+                            .build();
+                }
+                Number groupId;
+                RegistrySpace space;
+                List<Number> groupIds = br.getItemGroups(componentId);
+                if (groupIds == null || groupIds.isEmpty()) {
+                    groupId = null;
+                    space = RegistrySpace.PRIVATE;
+                } else {
+                    groupId = groupIds.get(0);
+                    space = RegistrySpace.GROUP;
+                }
+
+                this.updateDescription(desc, name, description, domainName, group);
+                ComponentRegistry cr = this.getRegistry(space, groupId);
+                return this.register(input, desc, new UpdateAction(), cr);
+            } else {
+                LOG.error("Update of nonexistent id (" + componentId
+                        + ") failed.");
+                return Response
+                        .serverError()
+                        .entity("Invalid id, cannot update nonexistent component")
+                        .build();
+            }
+        } catch (ComponentRegistryException e) {
+            LOG.warn("Could not retrieve component {}", componentId);
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN).entity(ex.getMessage())
+                    .build();
+        } catch (ItemNotFoundException ex2) {
+            return Response.status(Status.FORBIDDEN).entity(ex2.getMessage())
+                    .build();
+        } catch (AuthenticationRequiredException e1) {
+            return Response.status(Status.UNAUTHORIZED).entity(e1.getMessage())
+                    .build();
+        }
+
+    }
+
+    private void updateDescription(BaseDescription desc, String name,
+            String description, String domainName, String group) {
+        desc.setName(name);
+        desc.setDescription(description);
+        desc.setDomainName(domainName);
+        desc.setGroupName(group);
+        desc.setRegistrationDate(new Date());
+    }
+
+    @Override
+    @DELETE
+    @Path("/components/{componentId}")
+    @ApiOperation(value = "Deletes the component with the specified ID from its registry")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user and user is no administrator"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response deleteRegisteredComponent(
+            @PathParam("componentId") String componentId) {
+        try {
+            ComponentRegistry registry = this.getBaseRegistry();
+            LOG.debug("Component with id {} set for deletion.", componentId);
+            registry.deleteMDComponent(componentId, false);
+        } catch (DeleteFailedException e) {
+            LOG.info("Component with id {} deletion failed. Reason: {}",
+                    componentId, e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (ComponentRegistryException e) {
+            LOG.warn("Component with id " + componentId + " deletion failed.",
+                    e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (ItemNotFoundException e) {
+            LOG.warn("Component with id " + componentId + " is not found.");
+            return Response.serverError().status(Status.NOT_FOUND)
+                    .build();
+        } catch (IOException e) {
+            LOG.error("Component with id " + componentId + " deletion failed.",
+                    e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (UserUnauthorizedException e) {
+            LOG.info("Component with id {} deletion failed: {}", componentId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (AuthenticationRequiredException e1) {
+            return Response.status(Status.UNAUTHORIZED).entity(e1.getMessage())
+                    .build();
+        }
+
+        LOG.info("Component with id: {} deleted.", componentId);
+        return Response.ok("Component with id" + componentId + " deleted.").build();
+    }
+
+    @Override
+    @DELETE
+    @Path("/profiles/{profileId}")
+    @ApiOperation(value = "Deletes the profile with the specified ID from its registry")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user and user is no administrator"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response deleteRegisteredProfile(
+            @PathParam("profileId") String profileId) {
+        try {
+            LOG.debug("Profile with id: {} set for deletion.", profileId);
+            this.getBaseRegistry().deleteMDProfile(profileId);
+        } catch (DeleteFailedException e) {
+            LOG.info("Profile with id: {} deletion failed: {}", profileId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (ComponentRegistryException e) {
+            LOG.warn("Could not retrieve component", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (ItemNotFoundException e) {
+            LOG.warn("Profile with id " + profileId + " is not found.");
+            return Response.serverError().status(Status.NOT_FOUND)
+                    .build();
+        } catch (IOException e) {
+            LOG.error("Profile with id: " + profileId + " deletion failed.", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (UserUnauthorizedException e) {
+            LOG.info("Profile with id: {} deletion failed: {}", profileId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (AuthenticationRequiredException e1) {
+            return Response.status(Status.UNAUTHORIZED).entity(e1.getMessage())
+                    .build();
+        }
+
+        LOG.info("Profile with id: {} deleted.", profileId);
+        return Response.ok().build();
+    }
+
+    @Override
+    @DELETE
+    @Path("/profiles/{profileId}/comments/{commentId}")
+    @ApiOperation(value = "Deletes a comment from a profile")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Comment is not owned by current user and user is no administrator"),
+        @ApiResponse(code = 404, message = "Comment does not exist")
+    })
+    public Response deleteCommentFromProfile(
+            @PathParam("profileId") String profileId,
+            @PathParam("commentId") String commentId) {
+        try {
+            final ComponentRegistry registry = this.getBaseRegistry();
+            try {
+                final Comment comment = registry.getSpecifiedCommentInProfile(profileId, commentId);
+                if (comment != null
+                        && profileId.equals(comment.getComponentId())) {
+                    LOG.debug("Comment with id: {} set for deletion.", commentId);
+                    registry.deleteComment(commentId);
+                } else {
+                    throw new ComponentRegistryException(
+                            "Comment not found for specified profile");
+                }
+            } catch (ItemNotFoundException e1) {
+                LOG.info("Comment with id: {} deletion failed: {}", commentId,
+                        e1.getMessage());
+                LOG.debug("Deletion failure details:", e1);
+                return Response.serverError().status(Status.NOT_FOUND)
+                        .entity("" + e1.getMessage()).build();
+            }
+
+        } catch (DeleteFailedException e) {
+            LOG.info("Comment with id: {} deletion failed: {}", commentId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (ComponentRegistryException e) {
+            LOG.info("Could not find comment " + commentId + " for " + profileId);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (IOException e) {
+            LOG.error("Comment with id: " + commentId + " deletion failed.", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (UserUnauthorizedException e) {
+            LOG.info("Comment with id: {} deletion failed: {}", commentId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (AuthenticationRequiredException e1) {
+            return Response.status(Status.UNAUTHORIZED).entity(e1.getMessage())
+                    .build();
+        }
+
+        LOG.info("Comment with id: {} deleted.", commentId);
+        return Response.ok("Comment with id " + commentId + " deleted.").build();
+    }
+
+    @Override
+    @DELETE
+    @Path("/components/{componentId}/comments/{commentId}")
+    @ApiOperation(value = "Deletes a comment from a component")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Comment is not owned by current user and user is no administrator"),
+        @ApiResponse(code = 404, message = "Comment does not exist")
+    })
+    public Response deleteCommentFromComponent(
+            @PathParam("componentId") String componentId,
+            @PathParam("commentId") String commentId) {
+        try {
+            final ComponentRegistry registry = this.getBaseRegistry();
+            final Comment comment = registry.getSpecifiedCommentInComponent(componentId, commentId);
+            if (comment != null
+                    && componentId.equals(comment.getComponentId())) {
+                LOG.debug("Comment with id: {} set for deletion.", commentId);
+                registry.deleteComment(commentId);
+            } else {
+                throw new ComponentRegistryException(
+                        "Comment not found for specified component");
+            }
+        } catch (ItemNotFoundException e) {
+            LOG.info("Comment with id: {} deletion failed: {}", commentId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.NOT_FOUND)
+                    .entity("" + e.getMessage()).build();
+        } catch (DeleteFailedException e) {
+            LOG.info("Comment with id: {} deletion failed: {}", commentId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (ComponentRegistryException e) {
+            LOG.info("Could not retrieve component " + componentId + " for the component " + componentId);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (IOException e) {
+            LOG.error("Comment with id: " + commentId + " deletion failed.", e);
+            return Response.serverError().status(Status.INTERNAL_SERVER_ERROR)
+                    .build();
+        } catch (UserUnauthorizedException e) {
+            LOG.info("Comment with id: {} deletion failed: {}", commentId,
+                    e.getMessage());
+            LOG.debug("Deletion failure details:", e);
+            return Response.serverError().status(Status.FORBIDDEN)
+                    .entity("" + e.getMessage()).build();
+        } catch (AuthenticationRequiredException e1) {
+            return Response.status(Status.UNAUTHORIZED).entity(e1.getMessage())
+                    .build();
+        }
+
+        LOG.info("Comment with id: {} deleted.", commentId);
+        return Response.ok("Comment with id " + commentId + " deleted.").build();
+    }
+
+    @Override
+    @GET
+    @Path("/profiles/{profileId}/{rawType}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML})
+    @ApiOperation(value = "The expanded XML or XSD represenation of the component specification of a single profile (publicly accessible regardless of state!)")
+    @ApiResponses(value = {
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response getRegisteredProfileRawType(
+            @PathParam("profileId") final String profileId,
+            @PathParam("rawType") String rawType) throws ComponentRegistryException, IllegalArgumentException {
+
+        LOG.debug("Profile with id {} and rawType {} is requested.", profileId,
+                rawType);
+        try {
+            final ComponentRegistry registry = this.getBaseRegistry();
+
+            final ProfileDescription desc = registry.getProfileDescription(profileId);
+            if (desc == null) {
+                return Response.status(Status.NOT_FOUND).build();
+            }
+
+            StreamingOutput result = null;
+            String fileName = desc.getName() + "." + rawType;
+            if ("xml".equalsIgnoreCase(rawType)) {
+                result = new StreamingOutput() {
+                    @Override
+                    public void write(OutputStream output) throws IOException,
+                            WebApplicationException {
+                        try {
+                            registry.getMDProfileAsXml(profileId, output);
+                        } catch (Exception e) {
+                            LOG.warn("Could not retrieve component {}: {}",
+                                    profileId, e.getMessage());
+                            LOG.debug("Details", e);
+                            throw new WebApplicationException(Response
+                                    .serverError()
+                                    .status(Status.INTERNAL_SERVER_ERROR)
+                                    .build());
+                        }
+                    }
+                };
+            } else if ("xsd".equalsIgnoreCase(rawType)) {
+                result = new StreamingOutput() {
+                    @Override
+                    public void write(OutputStream output) throws IOException,
+                            WebApplicationException {
+                        try {
+                            registry.getMDProfileAsXsd(profileId, output);
+                        } catch (Exception e) {
+                            LOG.warn("Could not retrieve component {}: {}",
+                                    profileId, e.getMessage());
+                            LOG.debug("Details", e);
+                            throw new WebApplicationException(Response
+                                    .serverError()
+                                    .status(Status.INTERNAL_SERVER_ERROR)
+                                    .build());
+                        }
+                    }
+                };
+            } else {
+                return Response.status(Status.NOT_FOUND).entity("Unsupported raw type " + rawType).build();
+            }
+            return createDownloadResponse(result, fileName);
+        } catch (ItemNotFoundException e) {
+            return Response.serverError().status(Status.NOT_FOUND)
+                    .entity("" + e.getMessage()).build();
+        } catch (AuthenticationRequiredException e1) {
+            return Response.status(Status.UNAUTHORIZED).entity(e1.getMessage())
+                    .build();
+        }
+
+    }
+
+    private Response createDownloadResponse(StreamingOutput result,
+            String fileName) {
+        // Making response so it triggers browsers native save as dialog.
+        Response response = Response
+                .ok()
+                .type("application/x-download")
+                .header("Content-Disposition",
+                        "attachment; filename=\"" + fileName + "\"")
+                .entity(result).build();
+        return response;
+
+    }
+
+    @Override
+    @POST
+    @Path("/profiles")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Registers a profile specification (data content) with the associated metadata (form content) in the user's private space")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Current user has no access")
+    })
+    public Response registerProfile(
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @FormDataParam(NAME_FORM_FIELD) String name,
+            @FormDataParam(DESCRIPTION_FORM_FIELD) String description,
+            @FormDataParam(GROUP_FORM_FIELD) String group,
+            @FormDataParam(DOMAIN_FORM_FIELD) String domainName) {
+        try {
+            Principal principal = checkAndGetUserPrincipal();
+            UserCredentials userCredentials = getUserCredentials(principal);
+            ProfileDescription desc = this.createNewProfileDescription();
+            desc.setCreatorName(userCredentials.getDisplayName());
+            desc.setUserId(userCredentials.getPrincipalName()); // Hash used to
+            // be created
+            // here, now Id
+            // is
+            // constructed
+            // by impl
+            desc.setName(name);
+            desc.setDescription(description);
+            desc.setGroupName(group);
+            desc.setDomainName(domainName);
+            desc.setPublic(false);
+            LOG.debug("Trying to register Profile: {}", desc);
+            ComponentRegistry cr = this.getRegistry(RegistrySpace.PRIVATE, null);
+            return this.register(input, desc, new NewAction(), cr);
+        } catch (AuthenticationRequiredException e) {
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.UNAUTHORIZED)
+                    .build();
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN).entity(ex.getMessage())
+                    .build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/components")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Registers a component specification (data content) with the associated metadata (form content) in the user's private space")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Current user has no access")
+    })
+    public Response registerComponent(
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @FormDataParam(NAME_FORM_FIELD) String name,
+            @FormDataParam(DESCRIPTION_FORM_FIELD) String description,
+            @FormDataParam(GROUP_FORM_FIELD) String group,
+            @FormDataParam(DOMAIN_FORM_FIELD) String domainName) {
+        try {
+            Principal principal = checkAndGetUserPrincipal();
+            UserCredentials userCredentials = getUserCredentials(principal);
+            ComponentDescription desc = this.createNewComponentDescription();
+            desc.setCreatorName(userCredentials.getDisplayName());
+            desc.setUserId(userCredentials.getPrincipalName()); // Hash used to
+            // be created
+            // here, now Id
+            // is
+            // constructed
+            // by impl
+            desc.setName(name);
+            desc.setDescription(description);
+            desc.setGroupName(group);
+            desc.setDomainName(domainName);
+            desc.setPublic(false);
+            LOG.debug("Trying to register Component: {}", desc);
+            ComponentRegistry cr = this.getRegistry(RegistrySpace.PRIVATE, null);
+            return this.register(input, desc, new NewAction(), cr);
+        } catch (AuthenticationRequiredException e) {
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.UNAUTHORIZED)
+                    .build();
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN).entity(ex.getMessage())
+                    .build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/components/{componentId}/comments")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Publishes a comment on the specified component")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response registerCommentInComponent(
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @PathParam("componentId") String componentId) throws ComponentRegistryException {
+        try {
+            ComponentRegistry registry = this.getBaseRegistry();
+            ComponentDescription description = registry.getComponentDescriptionAccessControlled(componentId);
+
+            LOG.debug("Trying to register comment to {}", componentId);
+
+            return this.registerComment(input, description, registry);
+        } catch (AuthenticationRequiredException e) {
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.UNAUTHORIZED)
+                    .build();
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN)
+                    .build();
+        } catch (ItemNotFoundException e) {
+            return Response.serverError().status(Status.NOT_FOUND)
+                    .entity("" + e.getMessage()).build();
+        }
+    }
+
+    @Override
+    @POST
+    @Path("/profiles/{profileId}/comments")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @Consumes("multipart/form-data")
+    @ApiOperation(value = "Publishes a comment on the specified profile")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "User is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public Response registerCommentInProfile(
+            @FormDataParam(DATA_FORM_FIELD) InputStream input,
+            @PathParam("profileId") String profileId)
+            throws ComponentRegistryException {
+        try {
+            ComponentRegistry registry = this.getBaseRegistry();
+            ProfileDescription description = registry
+                    .getProfileDescriptionAccessControlled(profileId);
+
+            LOG.debug("Trying to register comment to {}", profileId);
+
+            return this.registerComment(input, description, registry);
+        } catch (AuthenticationRequiredException e) {
+            LOG.debug("Details", e);
+            return Response.serverError().status(Status.UNAUTHORIZED)
+                    .build();
+        } catch (UserUnauthorizedException ex) {
+            return Response.status(Status.FORBIDDEN)
+                    .build();
+        } catch (ItemNotFoundException e1) {
+            return Response.serverError().status(Status.NOT_FOUND)
+                    .entity("" + e1.getMessage()).build();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/pingSession")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Keeps the session alive")
+    public Response pingSession() {
+        boolean stillActive = false;
+        Principal userPrincipal = security.getUserPrincipal();
+        if (LOG.isInfoEnabled()) {
+            LOG.debug("ping by <{}>",
+                    (userPrincipal == null ? "unauthorized user"
+                            : userPrincipal.getName()));
+        }
+        if (request != null) {
+            if (userPrincipal != null
+                    && !ComponentRegistryFactory.ANONYMOUS_USER
+                    .equals(userPrincipal.getName())) {
+                stillActive = !((HttpServletRequest) request).getSession()
+                        .isNew();
+            }
+        }
+        return Response
+                .ok()
+                .entity(String.format("<session stillActive=\"%s\"/>",
+                                stillActive)).build();
+    }
+
+    private Response register(InputStream input, BaseDescription desc, RegisterAction action, ComponentRegistry registry) throws UserUnauthorizedException, AuthenticationRequiredException {
+        try {
+
+            DescriptionValidator descriptionValidator = new DescriptionValidator(
+                    desc);
+            MDValidator validator = new MDValidator(input, desc, registry, marshaller);
+            RegisterResponse response = new RegisterResponse();
+            //obsolete. Make it setstatus
+            response.setIsPrivate(!desc.isPublic());
+            this.validate(response, descriptionValidator, validator);
+            if (response.getErrors().isEmpty()) {
+
+                CMDComponentSpec spec = validator.getCMDComponentSpec();
+
+                // removing filename from spec before it gets extended.
+                // recursion over all the components
+                setFileNamesFromListToNull(Collections.singletonList(spec.getCMDComponent()));
+
+                try {
+                    checkForRecursion(validator, registry, desc);
+
+                    // Add profile
+                    int returnCode = action.execute(desc, spec, response,
+                            registry);
+                    if (returnCode == 0) {
+                        response.setRegistered(true);
+                        response.setDescription(desc);
+                    } else {
+                        response.setRegistered(false);
+                        response.addError("Unable to register at this moment. Internal server error.");
+                    }
+                } catch (ComponentRegistryException ex) {
+                    // Recursion detected
+                    response.setRegistered(false);
+                    response.addError("Error while expanding specification. "
+                            + ex.getMessage());
+                } catch (ItemNotFoundException ex) {
+                    // Recursion detected
+                    response.setRegistered(false);
+                    response.addError("Error while expanding specification. "
+                            + ex.getMessage());
+                }
+            } else {
+                LOG.warn("Registration failed with validation errors: {}",
+                        Arrays.toString(response.getErrors().toArray()));
+                response.setRegistered(false);
+            }
+            LOG.info("Registered new {} {}", desc.isProfile() ? "profile"
+                    : "component", desc);
+            response.setIsProfile(desc.isProfile());
+            return Response.ok(response).build();
+        } finally {
+            try {
+                input.close();// either we read the input or there was an
+                // exception, we need to close it.
+            } catch (IOException e) {
+                LOG.error("Error when closing inputstream: ", e);
+            }
+        }
+    }
+
+    /**
+     *
+     * @param validator
+     * @param registry
+     * @param desc
+     * @throws ComponentRegistryException if recursion is detected or something
+     * goes wrong while trying to detect recursion
+     */
+    private void checkForRecursion(MDValidator validator,
+            ComponentRegistry registry, BaseDescription desc)
+            throws ComponentRegistryException {
+        try {
+            // Expand to check for recursion. Operate on copy so that original
+            // does not get expanded.
+            final CMDComponentSpec specCopy = validator
+                    .getCopyOfCMDComponentSpec();
+            // In case of recursion, the following will throw a
+            // ComponentRegistryException
+            registry.getExpander().expandNestedComponent(
+                    Lists.newArrayList(specCopy.getCMDComponent()), desc.getId());
+        } catch (JAXBException ex) {
+            throw new ComponentRegistryException(
+                    "Unmarshalling failed while preparing recursion detection",
+                    ex);
+        }
+    }
+
+    private Response registerComment(InputStream input, BaseDescription description, ComponentRegistry registry) throws UserUnauthorizedException, AuthenticationRequiredException {
+        try {
+            CommentValidator validator = new CommentValidator(input, description, marshaller);
+            CommentResponse responseLocal = new CommentResponse();
+
+            responseLocal.setIsPrivate(!description.isPublic());
+            this.validateComment(responseLocal, validator);
+            if (responseLocal.getErrors().isEmpty()) {
+                Comment com = validator.getCommentSpec();
+                // int returnCode = action.executeComment(com, response,
+                // registry, principal.getName());
+
+                // If user name is left empty, fill it using the user's display
+                // name
+                Principal principal = this.checkAndGetUserPrincipal();
+                UserCredentials userCredentials = this.getUserCredentials(principal);
+                if (null == com.getUserName() || "".equals(com.getUserName())) {
+                    if (userCredentials != null) {
+                        com.setUserName(userCredentials.getDisplayName());
+                    } else {
+                        com.setUserName(principal.getName());
+                    }
+                }
+                try {
+                    int returnCode = registry.registerComment(com,
+                            principal.getName());
+                    if (returnCode == 0) {
+                        responseLocal.setRegistered(true);
+                        responseLocal.setComment(com);
+                    } else {
+                        responseLocal.setRegistered(false);
+                        responseLocal.addError("Unable to post at this moment. Internal server error.");
+                    }
+                    if (com.getComponentId() != null) {
+                        LOG.info("Posted new comment on component {}",
+                                com.getComponentId());
+                    } else {
+                        LOG.info("Posted new comment on profile {}",
+                                com.getComponentId());
+                    }
+                } catch (ItemNotFoundException e) {
+                    return Response.serverError().status(Status.NOT_FOUND)
+                            .entity("" + e.getMessage()).build();
+                }
+            } else {
+                LOG.warn(
+                        "Posting of comment failed with validation errors: {}",
+                        Arrays.toString(responseLocal.getErrors().toArray()));
+                responseLocal.setRegistered(false);
+            }
+            return Response.ok(responseLocal).build();
+        } catch (ComponentRegistryException ex) {
+            LOG.error("Error while inserting comment: ", ex);
+            return Response.serverError().entity(ex.getMessage()).build();
+        } finally {
+            try {
+                input.close();// either we read the input or there was an
+                // exception, we need to close it.
+            } catch (IOException e) {
+                LOG.error("Error when closing inputstream: ", e);
+                return Response.serverError().build();
+            }
+        }
+    }
+
+    private ComponentDescription createNewComponentDescription() {
+        ComponentDescription desc = ComponentDescription.createNewDescription();
+        desc.setHref(createXlink(desc.getId()));
+        return desc;
+    }
+
+    private ProfileDescription createNewProfileDescription() {
+        ProfileDescription desc = ProfileDescription.createNewDescription();
+        desc.setHref(createXlink(desc.getId()));
+        return desc;
+    }
+
+    private String createXlink(String id) {
+        URI uri = uriInfo.getRequestUriBuilder().path(id).build();
+        return uri.toString();
+    }
+
+    /**
+     *
+     * @return The application's base URI as configured in the
+     * {@link #APPLICATION_BASE_URL_PARAM} context parameter. If correctly
+     * configured, it should look something like
+     * "http://catalog.clarin.eu/ds/ComponentRegistry". <em>Be aware that this
+     * can also be null if configured incorrectly!</em>
+     *
+     * @see #APPLICATION_BASE_URL_PARAM
+     */
+    private String getApplicationBaseURI() {
+        return servletContext.getInitParameter(APPLICATION_BASE_URL_PARAM);
+    }
+
+    private void validate(RegisterResponse response, Validator... validators) throws UserUnauthorizedException {
+        for (Validator validator : validators) {
+            if (!validator.validate()) {
+                for (String error : validator.getErrorMessages()) {
+                    response.addError(error);
+                }
+            }
+        }
+    }
+
+    private void validateComment(CommentResponse response,
+            Validator... validators) throws UserUnauthorizedException {
+        for (Validator validator : validators) {
+            if (!validator.validate()) {
+                for (String error : validator.getErrorMessages()) {
+                    response.addError(error);
+                }
+            }
+        }
+    }
+
+    /**
+     * @param componentRegistryFactory the componentRegistryFactory to set
+     */
+    @Override
+    public void setComponentRegistryFactory(
+            ComponentRegistryFactory componentRegistryFactory) {
+        this.componentRegistryFactory = componentRegistryFactory;
+    }
+
+    /**
+     *
+     * @param listofcomponents a list of components whose file-names and whose
+     * childrens' filenames are to be set to null
+     */
+    @Override
+    public void setFileNamesFromListToNull(
+            List<CMDComponentType> listofcomponents) {
+
+        for (CMDComponentType currentcomponent : listofcomponents) {
+            setFileNamesToNullCurrent(currentcomponent);
+        }
+
+    }
+
+    /**
+     *
+     * @param currentcomponent a component whose file-name and whose children
+     * filenames are to be set to null
+     */
+    protected void setFileNamesToNullCurrent(CMDComponentType currentcomponent) {
+        currentcomponent.setFilename(null);
+        setFileNamesFromListToNull(currentcomponent.getCMDComponent());
+    }
+
+    private String helpToMakeTitleForRssDescriptions(String registrySpace, String groupId, String resource, ComponentRegistry cr) throws ItemNotFoundException {
+        if (registrySpace == null || (registrySpace.equalsIgnoreCase(REGISTRY_SPACE_GROUP) && groupId == null)
+                || resource == null) {
+            return "Undefined registry space or uindefined type of resource";
+        }
+        if (registrySpace.equalsIgnoreCase(REGISTRY_SPACE_PUBLISHED)) {
+            return "Published " + resource;
+        }
+        if (registrySpace.equalsIgnoreCase(REGISTRY_SPACE_PRIVATE)) {
+            return "Private " + resource;
+        }
+
+        if (registrySpace.equalsIgnoreCase(REGISTRY_SPACE_GROUP) && groupId != null) {
+            return resource + " of group " + groupId + " '" + cr.getGroupName(Integer.parseInt(groupId)) + "'";
+        }
+
+        return "Undefined registry space or uindefined type of resource";
+    }
+
+    /**
+     *
+     * @param isPublished if "true" then profiles and components from the user's
+     * workspace, otherwise -- public
+     * @param limit the number of items to be displayed
+     * @return rss for the components in the database to which we are currently
+     * connected
+     * @throws ComponentRegistryException
+     * @throws ParseException
+     */
+    @Override
+    @GET
+    @Path("/components/rss")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    public Rss getRssComponent(@QueryParam(GROUPID_PARAM) String groupId,
+            @QueryParam(REGISTRY_SPACE_PARAM) @DefaultValue(REGISTRY_SPACE_PUBLISHED) String registrySpace,
+            @QueryParam(NUMBER_OF_RSSITEMS) @DefaultValue("20") String limit)
+            throws ComponentRegistryException, ParseException, IOException {
+        List<ComponentDescription> components = null;
+        String title = "";
+        try {
+            ComponentRegistry cr = this.initialiseRegistry(registrySpace, groupId);
+            components = cr.getComponentDescriptions();
+            title = this.helpToMakeTitleForRssDescriptions(registrySpace, groupId, "Components", cr);
+        } catch (AuthenticationRequiredException e) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e.toString());
+            return new Rss();
+        } catch (UserUnauthorizedException e) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e.toString());
+            return new Rss();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.toString());
+            return new Rss();
+        }
+
+        final RssCreatorDescriptions instance = new RssCreatorDescriptions(getApplicationBaseURI(), "components",
+                Integer.parseInt(limit), components,
+                BaseDescription.COMPARE_ON_DATE, title);
+        final Rss rss = instance.getRss();
+        LOG.debug("Releasing RSS of {} most recently registered components",
+                limit);
+        return rss;
+    }
+
+    /**
+     *
+     * @param isPublished if "true" then profiles and components from the user's
+     * workspace, otherwise -- public
+     * @param limit the number of items to be displayed
+     * @return rss for the profiles in the database to which we are currently
+     * connected
+     * @throws ComponentRegistryException
+     * @throws ParseException
+     */
+    @Override
+    @GET
+    @Path("/profiles/rss")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    public Rss getRssProfile(@QueryParam(GROUPID_PARAM) String groupId,
+            @QueryParam(REGISTRY_SPACE_PARAM) @DefaultValue(REGISTRY_SPACE_PUBLISHED) String registrySpace,
+            @QueryParam(NUMBER_OF_RSSITEMS) @DefaultValue("20") String limit)
+            throws ComponentRegistryException, ParseException, IOException {
+        List<ProfileDescription> profiles = null;
+        String title = "";
+        try {
+            ComponentRegistry cr = this.initialiseRegistry(registrySpace, groupId);
+            profiles = cr.getProfileDescriptions();
+            title = this.helpToMakeTitleForRssDescriptions(registrySpace, groupId, "Profiles", cr);
+        } catch (AuthenticationRequiredException e) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e.toString());
+            return new Rss();
+        } catch (UserUnauthorizedException e) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), e.toString());
+            return new Rss();
+
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.toString());
+            return new Rss();
+        }
+        final RssCreatorDescriptions instance = new RssCreatorDescriptions(getApplicationBaseURI(), "profiles",
+                Integer.parseInt(limit), profiles,
+                BaseDescription.COMPARE_ON_DATE, title);
+        final Rss rss = instance.getRss();
+        LOG.debug("Releasing RSS of {} most recently registered profiles",
+                limit);
+        return rss;
+    }
+
+    private String helpToMakeTitleForRssComments(String itemId, String resource) {
+        if (itemId == null || resource == null) {
+            return "Undefined description";
+        }
+        return ("Comments for " + resource + " " + itemId);
+    }
+
+    /**
+     *
+     * @param profileId the Id of a profile whose comments are to be rss-ed
+     * @param isPublished if "true" then profiles and components from the user's
+     * workspace, otherwise -- public
+     * @param limit the number of items to be displayed
+     * @return rss of the comments for a chosen profile
+     * @throws ComponentRegistryException
+     * @throws IOException
+     * @throws JAXBException
+     * @throws ParseException
+     */
+    @Override
+    @GET
+    @Path("/profiles/{profileId}/comments/rss")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    public Rss getRssOfCommentsFromProfile(
+            @PathParam("profileId") String profileId,
+            @QueryParam(NUMBER_OF_RSSITEMS) @DefaultValue("20") String limit)
+            throws ComponentRegistryException, IOException, JAXBException,
+            ParseException {
+        try {
+
+            ComponentRegistry cr = this.getBaseRegistry();
+
+            final List<Comment> comments = cr.getCommentsInProfile(profileId);
+            final ProfileDescription pd = cr.getProfileDescriptionAccessControlled(profileId);
+            final String profileName = pd.getName();
+
+            String title = this.helpToMakeTitleForRssComments(profileId, "profile");
+            final RssCreatorComments instance = new RssCreatorComments(
+                    getApplicationBaseURI(), Integer.parseInt(limit), profileId,
+                    profileName, "profile", comments, Comment.COMPARE_ON_DATE, title);
+            final Rss rss = instance.getRss();
+            LOG.debug("Releasing RSS of {} most recent post on profile {}", limit,
+                    profileId);
+            return rss;
+        } catch (UserUnauthorizedException ex) {
+            response.sendError(Status.FORBIDDEN.getStatusCode());
+            return new Rss();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode());
+            return new Rss();
+        } catch (AuthenticationRequiredException e) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e.toString());
+            return new Rss();
+        }
+    }
+
+    /**
+     *
+     * @param componentId the Id of a component whose comments are to be rss-ed
+     * @param isPublished if "true" then profiles and components from the user's
+     * workspace, otherwise -- public
+     * @param limit the number of items to be displayed
+     * @return rss of the comments for a chosen component
+     * @throws ComponentRegistryException
+     * @throws IOException
+     * @throws JAXBException
+     * @throws ParseException
+     */
+    @Override
+    @GET
+    @Path("/components/{componentId}/comments/rss")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    public Rss getRssOfCommentsFromComponent(
+            @PathParam("componentId") String componentId,
+            @QueryParam(NUMBER_OF_RSSITEMS)
+            @DefaultValue("20") String limit)
+            throws ComponentRegistryException, IOException, JAXBException,
+            ParseException {
+        try {
+            ComponentRegistry cr = this.getBaseRegistry();
+            final List<Comment> comments = cr.getCommentsInComponent(componentId);
+            final ComponentDescription cd = cr.getComponentDescriptionAccessControlled(componentId);
+            final String componentName = cd.getName();
+            //oboslete. status must be involved, not boolean isPrivate
+            String title = this.helpToMakeTitleForRssComments(componentId, "component");
+            final RssCreatorComments instance = new RssCreatorComments(
+                    getApplicationBaseURI(), Integer.parseInt(limit), componentId,
+                    componentName, "component", comments, Comment.COMPARE_ON_DATE, title);
+            final Rss rss = instance.getRss();
+            LOG.debug("Releasing RSS of {} most recent post on component {}",
+                    limit, componentId);
+            return rss;
+        } catch (UserUnauthorizedException e) {
+            response.sendError(Status.FORBIDDEN.getStatusCode());
+            return new Rss();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode());
+            return new Rss();
+        } catch (AuthenticationRequiredException e1) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode());
+            return new Rss();
+        }
+
+    }
+
+    @Override
+    @GET
+    @Path("/AllowedTypes")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(
+            value = "A listing of values that are allowed as element or attribute type by the CMDI schema",
+            response = AllowedAttributetypesXML.class)
+    public AllowedAttributetypesXML getAllowedAttributeTypes()
+            throws ComponentRegistryException, IOException, JAXBException,
+            ParseException {
+        return (new AllowedAttributetypesXML());
+    }
+
+    @Override
+    @GET
+    @Path("/groups/usermembership")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Returns a listing of groups the current user is a member of (empty list when unauthenticated)")
+    public List<Group> getGroupsTheCurrentUserIsAMemberOf() {
+        Principal principal = security.getUserPrincipal();
+        if (principal == null) {
+            return new ArrayList<Group>();
+        }
+        List<Group> groups = groupService.getGroupsOfWhichUserIsAMember(principal.getName());
+        return groups;
+    }
+
+    @Override
+    @GET
+    @Path("/items/{itemId}/groups")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Returns a listing of groups to which an item belongs")
+    public List<Group> getGroupsTheItemIsAMemberOf(@PathParam("itemId") String itemId) {
+        return groupService.getGroupsTheItemIsAMemberOf(itemId);
+    }
+
+    @Override
+    @POST
+    @Path("/items/{itemId}/transferownership")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Transfers an item to the specified group (either from the private space or another group)")
+    @ApiResponses(value = {
+        @ApiResponse(code = 403, message = "Current user has no access")
+    })
+    public Response transferItemOwnershipToGroup(@PathParam("itemId") String itemId,
+            @QueryParam(GROUPID_PARAM) long groupId) throws IOException {
+        Principal principal = security.getUserPrincipal();
+        try {
+            groupService.transferItemOwnershipFromUserToGroupId(principal.getName(), groupId, itemId);
+            return Response.ok("Ownership transferred").build();
+        } catch (UserUnauthorizedException e) {
+            return Response.status(Status.FORBIDDEN).build();
+        }
+    }
+
+    @Override
+    @GET
+    @Path("/items/{itemId}")
+    @Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML,
+        MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "The description (metadata) of a single component or profile item")
+    @ApiResponses(value = {
+        @ApiResponse(code = 401, message = "Item requires authorisation and user is not authenticated"),
+        @ApiResponse(code = 403, message = "Non-public item is not owned by current user and user is no administrator"),
+        @ApiResponse(code = 404, message = "Item does not exist")
+    })
+    public BaseDescription getBaseDescription(@PathParam("itemId") String itemId) throws ComponentRegistryException, IOException {
+        LOG.debug("Item with id: {} is requested.", itemId);
+        try {
+            ComponentRegistry cr = this.getBaseRegistry();
+            BaseDescription description;
+            if (itemId.startsWith(ComponentDescription.COMPONENT_PREFIX)) {
+                description = cr.getComponentDescriptionAccessControlled(itemId);
+                return description;
+            };
+            if (itemId.startsWith(ProfileDescription.PROFILE_PREFIX)) {
+                description = cr.getProfileDescriptionAccessControlled(itemId);
+                return description;
+            };
+            response.sendError(Status.BAD_REQUEST.getStatusCode());
+            return new BaseDescription();
+
+        } catch (UserUnauthorizedException ex2) {
+            response.sendError(Status.FORBIDDEN.getStatusCode(), ex2.getMessage());
+            return new BaseDescription();
+        } catch (ItemNotFoundException e) {
+            response.sendError(Status.NOT_FOUND.getStatusCode(), e.getMessage());
+            return new BaseDescription();
+        } catch (AuthenticationRequiredException e) {
+            response.sendError(Status.UNAUTHORIZED.getStatusCode(), e.toString());
+            return new BaseDescription();
+        }
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/DescriptionValidator.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/DescriptionValidator.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/DescriptionValidator.java	(revision 5961)
@@ -0,0 +1,38 @@
+package clarin.cmdi.componentregistry.rest;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+
+public class DescriptionValidator implements Validator {
+
+    private final BaseDescription desc;
+    private List<String> errorMessages = new ArrayList<String>();
+
+    public DescriptionValidator(BaseDescription desc) {
+        this.desc = desc;
+    }
+    
+    public List<String> getErrorMessages() {
+        return errorMessages;
+    }
+
+    public boolean validate() {
+        if (!isOk(desc.getCreatorName(), desc.getDescription(), desc.getName())) {
+            errorMessages.add("Fields are not filled in correctly");
+        }
+        return errorMessages.isEmpty();
+    }
+    
+    private boolean isOk(String... fields) {
+        boolean isOk = true;
+        for (String field : fields) {
+            isOk &= StringUtils.isNotBlank(field);
+        }
+        return isOk;
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/IComponentRegistryRestService.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/IComponentRegistryRestService.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/IComponentRegistryRestService.java	(revision 5961)
@@ -0,0 +1,204 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.util.List;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+import javax.xml.bind.JAXBException;
+
+import org.springframework.transaction.annotation.Transactional;
+
+import clarin.cmdi.componentregistry.AllowedAttributetypesXML;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.rss.Rss;
+
+import com.sun.jersey.spi.resource.Singleton;
+
+/**
+ *
+ * @author twago@mpi.nl
+ * @author olsha@mpi.nl
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+@Path("/registry")
+@Singleton
+@Transactional(rollbackFor = Exception.class)
+public interface IComponentRegistryRestService {
+
+    public static final String APPLICATION_BASE_URL_PARAM = "eu.clarin.cmdi.componentregistry.serviceRootUrl";
+    public static final String DATA_FORM_FIELD = "data";
+    public static final String NAME_FORM_FIELD = "name";
+    public static final String DESCRIPTION_FORM_FIELD = "description";
+    public static final String GROUP_FORM_FIELD = "group";
+    public static final String DOMAIN_FORM_FIELD = "domainName";
+    public static final String REGISTRY_SPACE_PARAM = "registrySpace";
+    public static final String USER_SPACE_PARAM = "userspace";
+    public static final String GROUPID_PARAM = "groupId";
+    public static final String METADATA_EDITOR_PARAM = "mdEditor";
+    public static final String NUMBER_OF_RSSITEMS = "limit";
+
+    public static final String REGISTRY_SPACE_PUBLISHED = "published";
+    public static final String REGISTRY_SPACE_PRIVATE = "private";
+    public static final String REGISTRY_SPACE_GROUP = "group";
+
+    List<ComponentDescription> getRegisteredComponents(String registrySpace, String groupId, String userSpace)
+            throws ComponentRegistryException, IOException, UserUnauthorizedException;
+
+    List<ProfileDescription> getRegisteredProfiles(String registrySpace, boolean metadataEditor, String groupId, String userSpace) throws ComponentRegistryException, IOException, UserUnauthorizedException;
+
+    Response getRegisteredComponent(String componentId) throws IOException;
+
+    Response getRegisteredProfile(String profileId) throws IOException;
+
+    Response getRegisteredComponentRawType(String componentId, String rawType) throws ComponentRegistryException;
+
+//	ComponentRegistry findRegistry(String id,
+//			RegistryClosure<? extends BaseDescription> clos)
+//			throws ComponentRegistryException;
+//
+//	
+    List<BaseDescription> getComponentUsage(String componentId) throws ComponentRegistryException, IOException;
+
+    List<Comment> getCommentsFromProfile(String profileId) throws ComponentRegistryException, IOException;
+
+    List<Comment> getCommentsFromComponent(String componentId) throws ComponentRegistryException, IOException;
+
+    Comment getSpecifiedCommentFromProfile(String profileId, String commentId) throws ComponentRegistryException, IOException;
+
+    Comment getSpecifiedCommentFromComponent(String componentId, String commentId) throws ComponentRegistryException, IOException;
+
+    /**
+     *
+     * Purely helper method for my front-end (FLEX) which only does post/get
+     * requests. The query param is checked and the "proper" method is called.
+     *
+     * @param profileId
+     * @param method
+     * @return
+     */
+    Response manipulateRegisteredProfile(String profileId, String method);
+
+    Response manipulateCommentFromProfile(String profileId, String commentId,
+            String method);
+
+    Response manipulateCommentFromComponent(String componentId,
+            String commentId, String method);
+
+    Response publishRegisteredProfile(String profileId, InputStream input,
+            String name, String description, String group, String domainName);
+
+    Response updateRegisteredProfile(String profileId,
+            InputStream input, String name, String description, String groupId,
+            String domainName);
+
+    /**
+     *
+     * Purely helper method for my front-end (FLEX) which van only do post/get
+     * requests. The query param is checked and the "proper" method is called.
+     *
+     * @param componentId
+     * @param method
+     * @return
+     */
+    Response manipulateRegisteredComponent(String componentId, String method);
+
+    Response publishRegisteredComponent(String componentId, InputStream input,
+            String name, String description, String groupId, String domainName);
+
+    Response updateRegisteredComponent(String componentId,
+            InputStream input, String name, String description, String groupId,
+            String domainName);
+
+    Response deleteRegisteredComponent(String componentId);
+
+    Response deleteRegisteredProfile(String profileId);
+
+    Response deleteCommentFromProfile(String profileId, String commentId);
+
+    Response deleteCommentFromComponent(String componentId, String commentId);
+
+    Response getRegisteredProfileRawType(String profileId, String rawType) throws ComponentRegistryException;
+
+    Response registerProfile(InputStream input, String name,
+            String description, String groupId, String domainName);
+
+    Response registerComponent(InputStream input, String name,
+            String description, String groupId, String domainName);
+
+    Response registerCommentInComponent(InputStream input, String componentId) throws ComponentRegistryException;
+
+    Response registerCommentInProfile(InputStream input, String profileId) throws ComponentRegistryException;
+
+    Response pingSession();
+
+    /**
+     * @param componentRegistryFactory the componentRegistryFactory to set
+     */
+    void setComponentRegistryFactory(ComponentRegistryFactory componentRegistryFactory);
+
+    Rss getRssComponent(String groupId, String registrySpace, String limit)
+            throws ComponentRegistryException, ParseException, IOException;
+
+    Rss getRssProfile(String groupId, String registrySpace, String limit)
+            throws ComponentRegistryException, ParseException, IOException;
+
+    Rss getRssOfCommentsFromProfile(String profileId, String limit) throws ComponentRegistryException,
+            JAXBException, ParseException, IOException;
+
+    Rss getRssOfCommentsFromComponent(String componentId,
+            String limit) throws ComponentRegistryException, IOException,
+            JAXBException, ParseException;
+
+    AllowedAttributetypesXML getAllowedAttributeTypes()
+            throws ComponentRegistryException, IOException, JAXBException,
+            ParseException;
+
+    void setFileNamesFromListToNull(List<CMDComponentType> listofcomponents);
+
+    /**
+     * Get any component (public or private) with the specified ID
+     *
+     * @param componentId
+     * @return
+     */
+    BaseDescription getBaseDescription(String componentId) throws ComponentRegistryException, IOException;
+
+    // Group Service 
+    /**
+     * Get a list of groups the user is a member of
+     *
+     * @return
+     */
+    List<Group> getGroupsTheCurrentUserIsAMemberOf();
+
+    /**
+     * Get a list of groups the item is available to. For all practical reasons,
+     * this will return either 0 or 1 groups
+     *
+     * @param itemId ID of component or profile. This is not the DB id but the
+     * logical ID which is unique across components and profiles
+     * @return List of groups
+     */
+    List<Group> getGroupsTheItemIsAMemberOf(String itemId);
+
+    /**
+     * Transfer ownership of an item (group/profile) to a group
+     *
+     * @param itemId
+     * @param groupId
+     */
+    Response transferItemOwnershipToGroup(String itemId, long groupId) throws IOException;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/MDValidator.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/MDValidator.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/MDValidator.java	(revision 5961)
@@ -0,0 +1,240 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ComponentRegistryResourceResolver;
+import clarin.cmdi.componentregistry.Configuration;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.NullIdException;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import clarin.cmdi.componentregistry.impl.database.GroupService;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.schema.cmd.Validator.Message;
+import clarin.cmdi.schema.cmd.ValidatorException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import javax.xml.bind.JAXBException;
+import javax.xml.transform.stream.StreamSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MDValidator implements Validator {
+
+    private final static Logger LOG = LoggerFactory.getLogger(MDValidator.class);
+    static final String MISMATCH_ERROR = "Cannot register component as a profile or vica versa.";
+    static final String COMPONENT_NOT_REGISTERED_ERROR = "referenced component is not registered or does not have a correct componentId: ";
+    static final String PARSE_ERROR = "Error in validation input file: ";
+    static final String SCHEMA_ERROR = "Error in reading general component schema: ";
+    static final String IO_ERROR = "Error while reading specification or general component schema: ";
+    static final String INTERNAL_ERROR = "Internal error: ";    
+    static final String COMPONENT_NOT_REGISTERED_IN_APPROPRIATE_SPACE_ERROR = "referenced component cannot be found in the appropriate registry components: ";
+    static final String COMPONENT_REGISTRY_EXCEPTION_ERROR = "An exception occurred while accessing the component registry: ";
+    static final String ILLEGAL_ATTRIBUTE_NAME_ERROR = "Illegal attribute name: ";
+    static final String UNKNOWN_VALIDATION_ERROR = "Unknown validation error";
+    static final Collection<String> ILLEGAL_ATTRIBUTE_NAMES = Collections.unmodifiableCollection(Arrays.asList("ref", "ComponentId"));
+    private List<String> errorMessages = new ArrayList<String>();
+    private CMDComponentSpec spec = null;
+    private byte[] originalSpecBytes;
+    private final InputStream input;
+    private final BaseDescription description;
+    private final ComponentRegistry registry;
+    private final MDMarshaller marshaller;
+
+    /**
+     *
+     * @param input In order to validate the input is consumed. So use
+     * @see getCMDComponentSpec to get the parsed CMDComponentSpec.
+     * @param desc
+     * @param registry (registry you currently used)
+     * @param userRegistry can be null, We get user registry as well so we can
+     * give nice error messages if needed. Can be the same as
+     * @param registry
+     */
+    public MDValidator(InputStream input, BaseDescription description, ComponentRegistry registry, MDMarshaller marshaller) {
+        this.input = input;
+        this.description = description;
+        this.registry = registry;
+        this.marshaller = marshaller;
+    }
+
+    @Override
+    public List<String> getErrorMessages() {
+        return errorMessages;
+    }
+
+    @Override
+    public boolean validate() throws UserUnauthorizedException {
+        try {
+            clarin.cmdi.schema.cmd.Validator validator = new clarin.cmdi.schema.cmd.Validator(new URL(Configuration.getInstance().getGeneralComponentSchema()));
+            validator.setResourceResolver(new ComponentRegistryResourceResolver());
+            // We may need to reuse the input stream, so save it to a byte array first
+            originalSpecBytes = getBytesFromInputStream();
+            StreamSource source = new StreamSource(new ByteArrayInputStream(originalSpecBytes));
+            if (!validator.validateProfile(source)) {
+                final List<Message> validatorMessages = validator.getMessages();
+                if (validatorMessages.size() > 0) {
+                    for (Message message : validatorMessages) {
+                        errorMessages.add(PARSE_ERROR + message.getText());
+                    }
+                } else {
+                    errorMessages.add(PARSE_ERROR + UNKNOWN_VALIDATION_ERROR);
+                }
+            } else {
+                spec = unmarshalSpec(originalSpecBytes);
+                if (spec.isIsProfile() != description.isProfile()) {
+                    errorMessages.add(MISMATCH_ERROR);
+                }
+            }
+        } catch (MalformedURLException e) {
+            errorMessages.add(SCHEMA_ERROR + e.getMessage());
+            LOG.error(SCHEMA_ERROR, e);
+        } catch (JAXBException e) {
+            errorMessages.add(PARSE_ERROR + e.getMessage());
+            LOG.error(PARSE_ERROR, e);
+        } catch (ValidatorException e) {
+            errorMessages.add(PARSE_ERROR + e.getMessage());
+            LOG.error(PARSE_ERROR, e);
+        } catch (IOException e) {
+            errorMessages.add(IO_ERROR + e.getMessage());
+            LOG.error(IO_ERROR, e);
+        }
+        if (errorMessages.isEmpty()) {
+            try {
+                validateComponents(spec);
+            } catch (ComponentRegistryException e) {
+                errorMessages.add(COMPONENT_REGISTRY_EXCEPTION_ERROR + e);
+            } catch (ItemNotFoundException e2) {
+                errorMessages.add(COMPONENT_NOT_REGISTERED_ERROR + e2);
+            } catch (NullIdException e3) {
+                errorMessages.add(COMPONENT_NOT_REGISTERED_ERROR + e3);
+            } catch(AuthenticationRequiredException e) {
+                errorMessages.add(INTERNAL_ERROR + e);
+            }
+        }
+        return errorMessages.isEmpty();
+    }
+
+    private byte[] getBytesFromInputStream() throws IOException {
+        int len;
+        byte[] b = new byte[4096];
+        final ByteArrayOutputStream bOS = new ByteArrayOutputStream();
+
+        while ((len = input.read(b)) > 0) {
+            bOS.write(b, 0, len);
+        }
+
+        return bOS.toByteArray();
+    }
+
+    private void validateComponents(CMDComponentSpec componentSpec) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, NullIdException, AuthenticationRequiredException {
+        validateComponents(Collections.singletonList(componentSpec.getCMDComponent()));
+    }
+
+    private void validateComponents(List<CMDComponentType> cmdComponents) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, NullIdException, AuthenticationRequiredException {
+        for (CMDComponentType cmdComponentType : cmdComponents) {
+            this.validateDescribedComponents(cmdComponentType);
+            this.validateComponents(cmdComponentType.getCMDComponent());//Recursion
+        }
+    }
+
+    private void validateDescribedComponents(CMDComponentType cmdComponentType) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, NullIdException, AuthenticationRequiredException {
+        this.checkComponentInSpace(cmdComponentType);
+    }
+
+    private void checkComponentInSpace(CMDComponentType cmdComponentType) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, NullIdException, AuthenticationRequiredException {
+        if (isDefinedInSeparateFile(cmdComponentType)) {
+            String id = cmdComponentType.getComponentId();
+            if (id == null) {
+                String name = (cmdComponentType.getName() == null) ? "null" : cmdComponentType.getName();
+                throw new NullIdException("The component with the name " + name + " has a null id. :(");
+            }
+            CMDComponentSpec registeredComponent = registry.getMDComponent(id);
+            if (registeredComponent != null) {
+                final String componentId = cmdComponentType.getComponentId();
+                if (registry.isItemPublic(id)) {  // if  a component is public, it is available for any registry
+                    return;
+                };
+                // a private component for a private registry is available only if its owner is the owner of the resgitry
+                if (RegistrySpace.PRIVATE.equals(registry.getRegistrySpace())) {
+                    if(registry.canCurrentUserAccessDescription(componentId)) {
+                        return;
+                    }
+                    errorMessages.add(COMPONENT_NOT_REGISTERED_IN_APPROPRIATE_SPACE_ERROR + componentId + " (private registry)");
+                    return;
+
+                } else { // a private component in a group registry is availabe only if it belongs to the group
+                    if (RegistrySpace.GROUP.equals(registry.getRegistrySpace())) {
+                        if (registry.getGroupId() == null) {
+                            errorMessages.add(COMPONENT_REGISTRY_EXCEPTION_ERROR + "in the group space, the group id is null");
+                            return;
+                        }
+                        List<Number> componentGroupIds = registry.getItemGroups(cmdComponentType.getComponentId());
+                        if (componentGroupIds.contains(registry.getGroupId())) {
+                            return;
+                        }
+                        errorMessages.add(COMPONENT_NOT_REGISTERED_IN_APPROPRIATE_SPACE_ERROR + componentId + " (group registry) " + registry.getGroupId());
+                        return;
+                    }
+                    errorMessages.add(COMPONENT_NOT_REGISTERED_IN_APPROPRIATE_SPACE_ERROR + componentId + " (private component in public registry).");
+                    return;
+                }
+
+            };
+            errorMessages.add(COMPONENT_NOT_REGISTERED_ERROR + cmdComponentType.getComponentId());
+        }
+
+    }
+
+    private boolean isDefinedInSeparateFile(CMDComponentType cmdComponentType) {
+        return cmdComponentType.getName() == null;
+    }
+
+    /**
+     * Do not call before having called {@link #validate() }!
+     *
+     * @return the spec unmarshalled during {@link #validate() }. If this has
+     * not been called, returns null.
+     */
+    public CMDComponentSpec getCMDComponentSpec() {
+        return spec;
+    }
+
+    /**
+     * Creates a fresh (re-unmarshalled) copy of the specification this instance
+     * has validated. If you are not going to alter this copy, you can re-use
+     * and share the copy used during validation by getting it from {@link #getCMDComponentSpec()
+     * }. <em>Do not call before having called {@link #validate() }!</em>
+     *
+     * @return a freshly unmarshalled copy of the spec based on the bytes
+     * collected from the input stream passed to {@link #validate() }. If this
+     * has not been called, returns null.
+     * @throws JAXBException exception occurred while marshalling from the input
+     * bytes
+     * @see #validate()
+     * @see #getCMDComponentSpec()
+     */
+    public CMDComponentSpec getCopyOfCMDComponentSpec() throws JAXBException {
+        // Re-unmarshall original bytes
+        return unmarshalSpec(originalSpecBytes);
+
+
+    }
+
+    private CMDComponentSpec unmarshalSpec(byte[] inputBytes) throws JAXBException {
+        return marshaller.unmarshal(CMDComponentSpec.class, new ByteArrayInputStream(inputBytes), null);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/NewAction.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/NewAction.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/NewAction.java	(revision 5961)
@@ -0,0 +1,14 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+
+public class NewAction implements RegisterAction {
+
+    @Override
+    public int execute(BaseDescription desc, CMDComponentSpec spec, RegisterResponse response, ComponentRegistry registry) {
+        return registry.register(desc, spec);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ProfileClosure.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ProfileClosure.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/ProfileClosure.java	(revision 5961)
@@ -0,0 +1,17 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+
+public class ProfileClosure implements RegistryClosure<ProfileDescription> {
+
+    @Override
+    public ProfileDescription getDescription(ComponentRegistry registry, String id) throws ComponentRegistryException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+        return registry.getProfileDescriptionAccessControlled(id);
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/PublishAction.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/PublishAction.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/PublishAction.java	(revision 5961)
@@ -0,0 +1,26 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import java.security.Principal;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+
+public class PublishAction implements RegisterAction {
+    
+    private final Principal principal;
+
+    public PublishAction(Principal principal) {
+        this.principal = principal;
+    }
+
+    @Override
+    public int execute(BaseDescription desc, CMDComponentSpec spec, RegisterResponse response, ComponentRegistry registry) throws UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException{
+        response.setIsPrivate(false);
+        return registry.publish(desc, spec, principal);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/RegisterAction.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/RegisterAction.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/RegisterAction.java	(revision 5961)
@@ -0,0 +1,15 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+
+public interface RegisterAction {
+
+    int execute(BaseDescription desc, CMDComponentSpec spec, RegisterResponse response, ComponentRegistry registry) throws UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/RegistryClosure.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/RegistryClosure.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/RegistryClosure.java	(revision 5961)
@@ -0,0 +1,15 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+
+public interface RegistryClosure<T extends BaseDescription> {
+    
+    T getDescription(ComponentRegistry registry, String id) throws ComponentRegistryException,  UserUnauthorizedException, AuthenticationRequiredException, ItemNotFoundException;
+
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/UpdateAction.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/UpdateAction.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/UpdateAction.java	(revision 5961)
@@ -0,0 +1,26 @@
+package clarin.cmdi.componentregistry.rest;
+
+//import java.security.Principal;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+
+public class UpdateAction implements RegisterAction {
+    
+//    private final Principal principal;
+//
+//    public UpdateAction(Principal principal) {
+//        this.principal = principal;
+//    }
+    
+    @Override
+    public int execute(BaseDescription desc, CMDComponentSpec spec, RegisterResponse response, ComponentRegistry registry)  throws UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException{
+        return registry.update(desc, spec, false);
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/Validator.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/Validator.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rest/Validator.java	(revision 5961)
@@ -0,0 +1,20 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import java.util.List;
+
+public interface Validator {
+
+    
+    /**
+     * 
+     * @return the errormessage that might have been created by the validate().
+     */
+    public List<String> getErrorMessages();
+
+    /**
+     * Validate and create an error message when something is wrong.
+     */
+    public boolean validate()  throws UserUnauthorizedException;
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreator.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreator.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreator.java	(revision 5961)
@@ -0,0 +1,137 @@
+package clarin.cmdi.componentregistry.rss;
+
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ *
+ * @author olhsha
+ */
+public abstract class RssCreator<T> {
+
+    public static final double RSS_VERSION = 2.0;
+    private final String baseURI;
+    private String channelLink;
+    private String channelDescription;
+    private String channelTitle;
+    private Comparator<T> comparator;
+    private List<T> objs;
+    private int limit;
+
+    protected RssCreator(String baseURI, int limit, List<T> objs) {
+        this.baseURI = baseURI;
+        this.limit = limit;
+        this.objs = objs;
+    }
+
+    protected abstract RssItem fromArgToRssItem(T obj);
+
+    /**
+     * Makes a list of items out a list of descriptions, return the pointer to
+     * the list of items
+     *
+     * @param descriptions
+     * @return items out a list of descriptions
+     * @throws ParseException
+     */
+    private List<RssItem> makeListOfRssItems(List<T> objSublist) throws ParseException {
+        List<RssItem> listOfItems = new ArrayList<RssItem>();
+        for (T currentObj : objSublist) {
+            RssItem currentItem = fromArgToRssItem(currentObj);
+            listOfItems.add(currentItem);
+        }
+        return listOfItems;
+    }
+
+    /**
+     *
+     * @param channelLink
+     * @param channelDescription
+     * @param channelTitle
+     * @param obj
+     * @return
+     * @throws ParseException
+     */
+    private Rss makeRssChannel(List<T> objSublist) throws ParseException {
+        final Rss rss = new Rss();
+        rss.setVersion(RSS_VERSION);
+        final RssChannel channel = new RssChannel();
+        channel.setDescription(channelDescription);
+        channel.setLink(channelLink);
+        channel.setTitle(channelTitle);
+        channel.getItem().addAll(makeListOfRssItems(objSublist));
+        rss.setChannel(channel);
+        return rss;
+    }
+
+    /**
+     * Generates RSS feeds for profile and component descriptions
+     *
+     * @param <T> type of the object for which an rss item will be created
+     * (either profile/component description, or a comment)
+     * @param limit number of items to include in the RSS-channel
+     * @param descriptions descriptions to include
+     * @param channelDescription channel description
+     * @param channelTitle channel title
+     * @param channelLink channel link
+     * @return
+     * @throws ComponentRegistryException
+     * @throws ParseException
+     */
+    public Rss getRss() throws ParseException {
+        Collections.sort(objs, comparator);
+        final int length = (objs.size() < limit) ? objs.size() : limit;
+        List<T> sublist = objs.subList(0, length);
+        return (makeRssChannel(sublist));
+    }
+
+    /* Helping stuff
+     * 
+     */
+    protected Guid makeGuid(String href) {
+        Guid result = new Guid();
+        // result.setIsPermaLink(null);
+        result.setValue(href);
+        return result;
+    }
+
+    /**
+     * @param channelLink the channelLink to set
+     */
+    protected void setChannelLink(String channelLink) {
+        this.channelLink = channelLink;
+    }
+
+    /**
+     * @param channelDescription the channelDescription to set
+     */
+    protected void setChannelDescription(String channelDescription) {
+        this.channelDescription = channelDescription;
+    }
+
+    /**
+     * @param channelTitle the channelTitle to set
+     */
+    protected void setChannelTitle(String channelTitle) {
+        this.channelTitle = channelTitle;
+    }
+
+    /**
+     * @param comparator the comparator to set
+     */
+    protected void setComparator(Comparator<T> comparator) {
+        this.comparator = comparator;
+    }
+
+    protected String getChannelLink() {
+        return channelLink;
+    }
+
+    protected String getBaseURI() {
+        return baseURI;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreatorComments.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreatorComments.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreatorComments.java	(revision 5961)
@@ -0,0 +1,49 @@
+package clarin.cmdi.componentregistry.rss;
+
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.model.Comment;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ *
+ * @author olhsha
+ */
+public class RssCreatorComments extends RssCreator<Comment> {
+
+    /**
+     *
+     * @param isPrivate if "true" then profiles and components from the user's
+     * workspace, otherwise -- public (uri-parameter)
+     * @param baseURI where the database is located
+     * @param limit number of items to be displayed (uri-parameter)
+     * @param descriptionId Id of the profile/component whose comments are
+     * considered
+     * @param descriptionName Name of the profile/component whose comments are
+     * considered
+     * @param descriptionType "profile" or "component"
+     * @param comms the list of comments from which the list of rss-items for
+     * the channel will be created
+     * @param comparator compare comments by dates
+     */
+    public RssCreatorComments(String baseURI, int limit,
+            String descriptionId, String descriptionName, String descriptionType, List<Comment> comms, Comparator<Comment> comparator, String title) {
+        super(baseURI, limit, comms);
+        setChannelLink(baseURI + "?item=" + descriptionId + "&browserview=comments");
+        setChannelTitle(title);
+        setChannelDescription(String.format("Comments feed for the %s \"%s\"", descriptionType, descriptionName));
+        setComparator(comparator);
+    }
+
+    @Override
+    protected RssItem fromArgToRssItem(Comment comm) {
+        final String itemLink = getChannelLink() + "&commentId=" + comm.getId();
+        RssItem retval = new RssItem();
+        retval.setDescription(comm.getComment());
+        retval.setGuid(makeGuid(itemLink));
+        retval.setLink(itemLink);
+        retval.setPubDate(DatesHelper.getRFCDateTime(comm.getCommentDate()));
+        retval.setTitle(String.format("Comment %1$s\nby %2$s", comm.getId(), comm.getUserName()));
+        return retval;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreatorDescriptions.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreatorDescriptions.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/rss/RssCreatorDescriptions.java	(revision 5961)
@@ -0,0 +1,57 @@
+package clarin.cmdi.componentregistry.rss;
+
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ *
+ * @author olhsha
+ */
+public class RssCreatorDescriptions<T extends BaseDescription> extends RssCreator<T> {
+
+    /**
+     *
+     * @param isPrivate if "true" then profiles and components from the user's
+     * workspace, otherwise -- public (uri-parameter)
+     * @param baseURI where the database is located
+     * @param descriptionType "profile" or "component"
+     * @param limit number of items to be displayed (uri-parameter)
+     * @param descriptions the list of comments from which the list of rss-items
+     * for the channel will be created
+     * @param comparator compare descriptions by dates
+     */
+    public RssCreatorDescriptions(String baseURI, String descriptionType,
+            int limit, List<T> descriptions, Comparator<T> comparator, String title) {
+        super(baseURI, limit, descriptions);
+        setChannelLink(baseURI + "/");
+        setChannelTitle(title);
+        setChannelDescription(String.format("News feed for the %s", descriptionType));
+        setComparator(comparator);
+    }
+
+    /**
+     * creator method, desc to rssItem, overrides the dummy method of the
+     * RssCreatorClass
+     *
+     * @param desc
+     * @return
+     */
+    @Override
+    protected RssItem fromArgToRssItem(T desc) {
+        String href = getBaseURI() + "?item=" + desc.getId();
+        RssItem retval = new RssItem();
+        retval.setDescription(desc.getDescription());
+        retval.setGuid(makeGuid(href));
+        retval.setLink(href);
+        retval.setPubDate(DatesHelper.getRFCDateTime(desc.getRegistrationDate()));
+        retval.setTitle(makeDescriptionTitle(desc.getName(), desc.getCreatorName(), desc.getGroupName()));
+        return retval;
+    }
+
+    protected String makeDescriptionTitle(String name, String creatorname, String group) {
+        final String help = (group == null) ? "is unspecified" : group;
+        return (name + " by user " + creatorname + ", group " + help);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/CharacterEncodingFilter.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/CharacterEncodingFilter.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/CharacterEncodingFilter.java	(revision 5961)
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package clarin.cmdi.componentregistry.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+/**
+ * <p>
+ * Example filter that sets the character encoding to be used in parsing the incoming request, either unconditionally or only if the client
+ * did not specify a character encoding. Configuration of this filter is based on the following initialization parameters:
+ * </p>
+ * <ul>
+ * <li><strong>encoding</strong> - The character encoding to be configured for this request, either conditionally or unconditionally based
+ * on the <code>ignore</code> initialization parameter. This parameter is required, so there is no default.</li>
+ * <li><strong>ignore</strong> - If set to "true", any character encoding specified by the client is ignored, and the value returned by the
+ * <code>selectEncoding()</code> method is set. If set to "false, <code>selectEncoding()</code> is called <strong>only</strong> if the
+ * client has not already specified an encoding. By default, this parameter is set to "true".</li>
+ * </ul>
+ * 
+ * <p>
+ * Although this filter can be used unchanged, it is also easy to subclass it and make the <code>selectEncoding()</code> method more
+ * intelligent about what encoding to choose, based on characteristics of the incoming request (such as the values of the
+ * <code>Accept-Language</code> and <code>User-Agent</code> headers, or a value stashed in the current user's session.
+ * </p>
+ * 
+ * @author Craig McClanahan
+ * @version $Revision: 466607 $ $Date: 2006-10-21 17:09:50 -0600 (Sat, 21 Oct 2006) $
+ */
+
+public class CharacterEncodingFilter implements Filter {
+
+    // ----------------------------------------------------- Instance Variables
+
+    /**
+     * The default character encoding to set for requests that pass through this filter.
+     */
+    protected String encoding = null;
+
+    /**
+     * The filter configuration object we are associated with. If this value is null, this filter instance is not currently configured.
+     */
+    protected FilterConfig filterConfig = null;
+
+    /**
+     * Should a character encoding specified by the client be ignored?
+     */
+    protected boolean ignore = true;
+
+    // --------------------------------------------------------- Public Methods
+
+    /**
+     * Take this filter out of service.
+     */
+    public void destroy() {
+
+        this.encoding = null;
+        this.filterConfig = null;
+
+    }
+
+    /**
+     * Select and set (if specified) the character encoding to be used to interpret request parameters for this request.
+     * 
+     * @param request The servlet request we are processing
+     * @param result The servlet response we are creating
+     * @param chain The filter chain we are processing
+     * 
+     * @exception IOException if an input/output error occurs
+     * @exception ServletException if a servlet error occurs
+     */
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+
+        // Conditionally select and set the character encoding to be used
+        if (ignore || (request.getCharacterEncoding() == null)) {
+            String encoding = selectEncoding(request);
+            if (encoding != null)
+                request.setCharacterEncoding(encoding);
+        }
+
+        // Pass control on to the next filter
+        chain.doFilter(request, response);
+
+    }
+
+    /**
+     * Place this filter into service.
+     * 
+     * @param filterConfig The filter configuration object
+     */
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+        this.filterConfig = filterConfig;
+        this.encoding = filterConfig.getInitParameter("encoding");
+        String value = filterConfig.getInitParameter("ignore");
+        if (value == null)
+            this.ignore = true;
+        else if (value.equalsIgnoreCase("true"))
+            this.ignore = true;
+        else if (value.equalsIgnoreCase("yes"))
+            this.ignore = true;
+        else
+            this.ignore = false;
+
+    }
+
+    // ------------------------------------------------------ Protected Methods
+
+    /**
+     * Select an appropriate character encoding to be used, based on the characteristics of the current request and/or filter initialization
+     * parameters. If no character encoding should be set, return <code>null</code>.
+     * <p>
+     * The default implementation unconditionally returns the value configured by the <strong>encoding</strong> initialization parameter for
+     * this filter.
+     * 
+     * @param request The servlet request we are processing
+     */
+    protected String selectEncoding(ServletRequest request) {
+
+        return (this.encoding);
+
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/ConceptRegistryServlet.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/ConceptRegistryServlet.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/ConceptRegistryServlet.java	(revision 5961)
@@ -0,0 +1,156 @@
+package clarin.cmdi.componentregistry.servlet;
+
+import clarin.cmdi.componentregistry.Configuration;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.net.URI;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriBuilder;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.XML;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * Servlet responsible for providing a bridge to the CLARIN Concept Registry
+ * (CCR) REST interface. Can be called by the front end to circumvent
+ * cross-scripting and FLASH/Browser limitation in setting the headers of a
+ * request.
+ *
+ */
+public class ConceptRegistryServlet extends HttpServlet {
+
+    private static final long serialVersionUID = 1L;
+    private final static Logger logger = LoggerFactory.getLogger(ConceptRegistryServlet.class);
+    private static final String CCR2DCIF_XSL_RESOURCE = "/ccr2dcif.xsl";
+
+    private transient WebResource service;
+    private Templates ccr2dcifTemplates;
+
+    @Override
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+
+        final URI uri = UriBuilder.fromUri(Configuration.getInstance().getCcrRestUrl()).build();
+        final Client client = Client.create();
+        service = client.resource(uri);
+
+        try {
+            final TransformerFactory transformerFactory = TransformerFactory.newInstance();
+            final Source ccr2dcifSource = new StreamSource(getClass().getResourceAsStream(CCR2DCIF_XSL_RESOURCE));
+            ccr2dcifTemplates = transformerFactory.newTemplates(ccr2dcifSource);
+        } catch (TransformerConfigurationException ex) {
+            throw new ServletException("Could not initialise CCR to DCIF transformation templates", ex);
+        }
+
+        logger.info("Instantiated CCR servlet on URI {}", uri);
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        final MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+
+        // Set keywords
+        String keywords = req.getParameter("keywords");
+        logger.debug("ISOcat request: keywords = {}", keywords);
+        queryParams.add("q", keywords);
+
+        //TODO: Scope by concept scheme?
+        //TODO: Set fields to be returned (fl=...)
+        final WebResource requestResource = service.path("find-concepts").queryParams(queryParams);
+        logger.info("Forwarding CCR request to {}", requestResource.getURI());
+
+        // Send request to CCR
+        final InputStream result = requestResource.accept(MediaType.APPLICATION_XML).get(InputStream.class);
+        logger.debug("CCR result: {}", result);
+
+        final String acceptHeader = req.getHeader("Accept");
+        if (acceptHeader.contains(MediaType.APPLICATION_JSON)) {
+            serveJSON(resp, result);
+        } else {
+            serveDCIF(resp, result);
+        }
+    }
+
+    private void serveDCIF(HttpServletResponse resp, final InputStream ccrResponse) throws IOException, ServletException {
+        // Prepare response
+        resp.setContentType(MediaType.APPLICATION_XML);
+        resp.setCharacterEncoding("UTF-8");
+
+        try {
+            logger.debug("Transforming CCR response to response writer");
+            transformCCRResponse(ccrResponse, new StreamResult(resp.getWriter()));
+        } finally {
+            ccrResponse.close();
+            resp.flushBuffer();
+        }
+    }
+
+    private void serveJSON(HttpServletResponse resp, final InputStream ccrResponse) throws IOException, ServletException {
+        // Prepare response
+        resp.setContentType(MediaType.APPLICATION_JSON);
+        resp.setCharacterEncoding("UTF-8");
+
+        try {
+            logger.debug("Transforming CCR response to JSON");
+            // Make DCIF XML
+            final StringWriter xmlWriter = new StringWriter();
+            transformCCRResponse(ccrResponse, new StreamResult(xmlWriter));
+
+            // convert to JSON
+            logger.debug("Converting DCIF XML to JSON");
+            final JSONObject dcifJson = XML.toJSONObject(xmlWriter.toString());
+            
+            // extract Concept objects (strip off envelope)
+            final JSONObject dcSelection = dcifJson.getJSONObject("dcif:dataCategorySelection");
+            final JSONArray dcArray;
+            if (dcSelection.has("dcif:dataCategory")) {
+                dcArray = dcSelection.getJSONArray("dcif:dataCategory");
+            } else {
+                // no DCs, return an empty array
+                dcArray = new JSONArray();
+            }
+            // send back to client
+            resp.getWriter().write(dcArray.toString(4));
+        } catch (JSONException ex) {
+            throw new ServletException("Could not create JSON object", ex);
+        } finally {
+            ccrResponse.close();
+            resp.flushBuffer();
+        }
+    }
+
+    private void transformCCRResponse(final InputStream ccrResponse, final Result result) throws IOException, ServletException {
+        try {
+            final Transformer transformer = ccr2dcifTemplates.newTransformer();
+            final Source source = new StreamSource(ccrResponse);
+            transformer.transform(source, result);
+        } catch (TransformerConfigurationException ex) {
+            throw new ServletException("Could not configure transformer for converting CCR output to DCIF", ex);
+        } catch (TransformerException ex) {
+            throw new ServletException("Could not transform CCR output to DCIF", ex);
+        }
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/DontCacheFilter.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/DontCacheFilter.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/servlet/DontCacheFilter.java	(revision 5961)
@@ -0,0 +1,41 @@
+/**
+ * 
+ */
+package clarin.cmdi.componentregistry.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Adds no-cache HTTP headers to each response
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class DontCacheFilter implements Filter{
+
+	@Override
+	public void init(FilterConfig filterConfig) throws ServletException {
+	}
+
+	@Override
+	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
+			ServletException {
+		HttpServletResponse httpResponse = (HttpServletResponse)response;
+		httpResponse.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
+		httpResponse.addHeader("Pragma", "no-cache");
+		httpResponse.addHeader("Expires", "0");
+		chain.doFilter(request, response);
+	}
+
+	@Override
+	public void destroy() {
+	}
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/util/XmlDateAdapter.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/util/XmlDateAdapter.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/util/XmlDateAdapter.java	(revision 5961)
@@ -0,0 +1,33 @@
+package clarin.cmdi.componentregistry.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import clarin.cmdi.componentregistry.DatesHelper;
+
+/**
+ * Formats dates for XML (de)serialization into XML date time (with timezones) format
+ * http://www.w3schools.com/schema/schema_dtypes_date.asp
+ * 
+ * Timezone is always GMT
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+public class XmlDateAdapter extends XmlAdapter<String, Date> {
+
+    @Override
+    public String marshal(Date v) throws Exception {
+	return DatesHelper.formatXmlDateTime(v);
+    }
+
+    @Override
+    public Date unmarshal(String v) throws Exception {
+	return DatesHelper.parseXmlDateTime(v);
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/CatalogManager.properties
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/CatalogManager.properties	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/CatalogManager.properties	(revision 5961)
@@ -0,0 +1,5 @@
+catalogs=catalog.cat
+relative-catalogs=false
+static-catalog=yes
+catalog-class-name=org.apache.xml.resolver.Resolver
+verbosity=0
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/META-INF/persistence.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/META-INF/persistence.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/META-INF/persistence.xml	(revision 5961)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="2.0"
+	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
+	<persistence-unit name="clarin.cmdi.componentregistry">
+	</persistence-unit>
+</persistence>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/catalog.cat
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/catalog.cat	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/catalog.cat	(revision 5961)
@@ -0,0 +1,1 @@
+REWRITE_SYSTEM "http://www.w3.org/2005/08/" "."
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/ccr2dcif.xsl
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/ccr2dcif.xsl	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/ccr2dcif.xsl	(revision 5961)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	exclude-result-prefixes="xs rdf openskos skos"
+	version="2.0"
+	xmlns:dcif="http://www.isocat.org/ns/dcif"
+	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+	xmlns:openskos="http://openskos.org/xmlns#"
+	xmlns:skos="http://www.w3.org/2004/02/skos/core#"
+>
+	
+	<xsl:output method="xml" encoding="UTF-8"/>
+	
+	<xsl:template match="rdf:RDF">
+		<dcif:dataCategorySelection dcif-version="1.3" name="search">
+			<dcif:globalInformation>CLARIN Concept Registry, Meertens Institute, Amsterdam, The Netherlands</dcif:globalInformation>
+			<xsl:apply-templates/>
+		</dcif:dataCategorySelection>
+	</xsl:template>
+	
+	<xsl:template match="skos:Concept">
+		<dcif:dataCategory
+			definition="{(skos:definition[@xml:lang='en'])[1]}"
+			identifier="{(skos:notation)[1]}"
+			name="{(skos:prefLabel[@xml:lang='en'])[1]}"
+			owner="CLARIN"
+			pid="{@rdf:resource}"
+			type="concept"
+			version="1:0">
+		</dcif:dataCategory>
+	</xsl:template>
+	
+</xsl:stylesheet>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/findbugs-exclude.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/findbugs-exclude.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/findbugs-exclude.xml	(revision 5961)
@@ -0,0 +1,9 @@
+
+<FindBugsFilter>
+    <!-- Exclude filter for ComponentRegistry Java classes) -->
+    <Match>
+    <!-- Injection in wicket pages -->
+	<Package name="clarin.cmdi.componentregistry.frontend" />
+	<Bug pattern="SE_BAD_FIELD" />
+    </Match>
+</FindBugsFilter>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/log4j.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/log4j.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/log4j.xml	(revision 5961)
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+    <appender class="org.apache.log4j.DailyRollingFileAppender" name="FILE">
+        <param value="${catalina.base}/logs/componentRegistry.log" name="File"/>
+        <layout class="org.apache.log4j.PatternLayout">
+            <param value="%d %p [%c#%M:%L] - %m%n" name="ConversionPattern"/>
+        </layout>
+    </appender>
+    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
+        <param name="Target" value="System.out"/> 
+        <layout class="org.apache.log4j.PatternLayout">
+            <param value="%d %p [%c#%M:%L] - %m%n" name="ConversionPattern"/>
+        </layout>
+    </appender> 
+    <logger name="clarin.cmdi.componentregistry.Configuration">
+        <level value="${logging.level}"/>
+    </logger>
+    <logger name="clarin.cmdi.componentregistry.impl.database">
+        <level value="${logging.level}"/>
+    </logger>
+    <logger name="clarin.cmdi.componentregistry.rest">
+        <level value="${logging.level}"/>
+    </logger>
+    <logger name="clarin.cmdi.componentregistry.servlet.ConceptRegistryServlet">
+        <level value="${logging.level}"/>
+    </logger>
+    <logger name="com.sun.jersey">
+        <level value="warn"/>
+    </logger>
+    <logger name="org.apache.wicket">
+        <level value="warn"/>
+    </logger>
+<!--    <logger name="org.springframework">
+        <level value="info"/>
+    </logger>
+    <logger name="org.springframework.transaction">
+        <level value="info"/>
+    </logger>
+    <logger name="org.springframework.web.context.ContextLoader">
+        <level value="info"/>
+    </logger>-->
+    <root>
+        <level value="info"/>
+        <appender-ref ref="${logging.appender}"/> <!-- filtered through Maven -->   
+    </root>
+</log4j:configuration>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/logging.properties
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/logging.properties	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/logging.properties	(revision 5961)
@@ -0,0 +1,3 @@
+# register SLF4JBridgeHandler as handler for the j.u.l. root logger
+# so all logging gets handled by SLF4j
+handlers = org.slf4j.bridge.SLF4JBridgeHandler
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/spring-config/applicationContext.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/spring-config/applicationContext.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/spring-config/applicationContext.xml	(revision 5961)
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
+	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+	xsi:schemaLocation="
+     http://www.springframework.org/schema/beans
+     http://www.springframework.org/schema/beans/spring-beans.xsd
+     http://www.springframework.org/schema/aop
+     http://www.springframework.org/schema/aop/spring-aop.xsd
+     http://www.springframework.org/schema/tx 
+     http://www.springframework.org/schema/tx/spring-tx.xsd
+     http://www.springframework.org/schema/context
+     http://www.springframework.org/schema/context/spring-context.xsd
+     http://www.springframework.org/schema/data/jpa
+	 http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
+     ">
+
+	<context:annotation-config />
+	<context:component-scan base-package="clarin.cmdi.componentregistry" />
+	<!-- target class proxying must be enabled, otherwise Jersey won't find 
+		the @path annotations on ComponentRegistryRestService -->
+	<tx:annotation-driven proxy-target-class="true" />
+	<jpa:repositories base-package="clarin.cmdi.componentregistry.persistence.jpa" />
+
+	<!-- Load properties from context.xml via servlet container -->
+	<bean
+		class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
+		<property name="ignoreUnresolvablePlaceholders" value="true" />
+	</bean>
+
+	<!-- Fallback properties for unit tests, loads properties from /test/Î³ -->
+	<bean
+		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+		<property name="location"
+			value="classpath:spring-config/component-registry.properties" />
+		<property name="ignoreResourceNotFound" value="true" />
+	</bean>
+
+	<bean id="mdMarshaller" class="clarin.cmdi.componentregistry.MDMarshaller" />
+
+	<bean id="configuration" class="clarin.cmdi.componentregistry.Configuration"
+		factory-method="getInstance">
+		<!-- Read admin users from init param -->
+		<property name="adminUsersList"
+			value="${eu.clarin.cmdi.componentregistry.adminUsers}" />
+		<property name="generalComponentSchema"
+			value="${eu.clarin.cmdi.componentregistry.generalComponentSchemaUrl}" />
+		<property name="component2SchemaXsl"
+			value="${eu.clarin.cmdi.componentregistry.component2SchemaXslUrl}" />
+		<property name="componentSpecSchemaLocation"
+			value="${eu.clarin.cmdi.componentregistry.componentSpecSchemaLocation}" />
+		<property name="ccrRestUrl"
+			value="${eu.clarin.cmdi.componentregistry.ccrRestUrl}" />
+		<!-- Extra attribute keys that are passed in a shibboleth authenticated 
+			request principal. You need to configure the shhaa.xml file to enable the 
+			extra attributes. -->
+		<property name="displayNameShibbolethKeys">
+			<list>
+				<value>displayName</value>
+				<value>commonName</value>
+			</list>
+		</property>
+	</bean>
+
+	<bean id="componentsCache"
+		class="clarin.cmdi.componentregistry.impl.database.CMDComponentSpecCache" />
+	<bean id="profilesCache"
+		class="clarin.cmdi.componentregistry.impl.database.CMDComponentSpecCache" />
+
+	<!-- Prototype bean for component registry (service) -->
+	<bean id="componentRegistryDbImpl"
+		class="clarin.cmdi.componentregistry.impl.database.ComponentRegistryDbImpl"
+		scope="prototype" />
+
+	<!-- Factory that will create component registries for us (and autowire 
+		them), to be used by actual ComponentRegistryFactory -->
+	<bean id="componentRegistryBeanFactory"
+		class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean">
+		<property name="serviceLocatorInterface"
+			value="clarin.cmdi.componentregistry.impl.database.ComponentRegistryBeanFactory" />
+	</bean>
+
+	<!-- Component registry factory that will be used by rest service to get 
+		user and public registries -->
+	<bean id="componentRegistryFactory"
+		class="clarin.cmdi.componentregistry.impl.database.ComponentRegistryFactoryDbImpl"></bean>
+
+
+	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+		<property name="dataSource" ref="applicationServerDataSource"/>
+	</bean>
+	
+	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+		<property name="dataSource" ref="dataSource" />
+	</bean>
+
+	<bean id="entityManagerFactory"
+		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+		<property name="dataSource" ref="dataSource" />
+		<property name="jpaVendorAdapter">
+			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
+				<property name="generateDdl" value="true" />
+			</bean>
+		</property>
+		<property name="jpaDialect">
+		<bean class="clarin.cmdi.componentregistry.impl.database.PostgresJpaDialect"/>
+		</property>
+		<property name="persistenceUnitName" value="clarin.cmdi.componentregistry" />
+		<property name="jpaProperties">
+			<props>
+				<prop key="hibernate.dialect">${eu.clarin.cmdi.componentregistry.jpaDialect}</prop>
+				<prop key="hibernate.show_sql">false</prop>
+                                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
+				<!-- prop key="hibernate.hbm2ddl.auto">update</prop -->
+			</props>
+
+		</property>
+	</bean>
+
+	<!-- Unit tests reload the same beans over and over -->
+	<context:mbean-export registration="replaceExisting" />
+
+</beans>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/spring-config/container-environment.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/spring-config/container-environment.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/spring-config/container-environment.xml	(revision 5961)
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="
+     http://www.springframework.org/schema/beans
+     http://www.springframework.org/schema/beans/spring-beans.xsd
+     http://www.springframework.org/schema/aop
+     http://www.springframework.org/schema/aop/spring-aop.xsd
+     http://www.springframework.org/schema/context
+     http://www.springframework.org/schema/context/spring-context.xsd
+     ">
+
+	<!-- Using the Datasource JNDI defined in the servlet container. See below 
+		for a sample Tomcat datasource configuration. We need TransactionAwareDataSourceProxy 
+		because of the mixed access of plain JDBC and JPA. JDBCTemplate will close 
+		the database connection otherwise. -->
+
+	<bean id="dataSource"
+		class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
+		<property name="targetDataSource" ref="applicationServerDataSource"/>
+	</bean>
+
+
+	<bean id="applicationServerDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
+		<property name="jndiName" value="java:comp/env/jdbc/ComponentRegistry" />
+		<property name="resourceRef" value="true" />
+	</bean>
+
+	<!-- SAMPLE TOMCAT DATASOURCE CONFIGURATION: -->
+	<!-- <Context> ... <Resource name="jdbc/ComponentRegistry" auth="Container" 
+		type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" url="jdbc:postgresql:component_registry" 
+		username="compreg" password="compreg" maxActive="10" maxIdle="5" maxWait="4000" 
+		removeAbandoned="false" removeAbandonedTimeout="10" logAbandoned="true" /> 
+		... </Context> -->
+
+	<!-- To define an ad hoc datasource, use something like the following: -->
+	<!-- <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> 
+		<property name="driverClassName" value="org.postgresql.Driver"/> <property 
+		name="url" value="jdbc:postgresql:component_registry"/> <property name="username" 
+		value="compreg"/> <property name="password" value="p4ssw0rd"/> </bean> -->
+
+</beans>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/version.properties
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/version.properties	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/version.properties	(revision 5961)
@@ -0,0 +1,2 @@
+ComponentRegistry=${version}
+ComponentBrowserGui=${ComponentBrowserGuiVersion}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/xml.xsd
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/xml.xsd	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/resources/xml.xsd	(revision 5961)
@@ -0,0 +1,146 @@
+<?xml version='1.0'?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   See http://www.w3.org/XML/1998/namespace.html and
+   http://www.w3.org/TR/REC-xml for information about this namespace.
+
+    This schema document describes the XML namespace, in a form
+    suitable for import by other schema documents.  
+
+    Note that local names in this namespace are intended to be defined
+    only by the World Wide Web Consortium or its subgroups.  The
+    following names are currently defined in this namespace and should
+    not be used with conflicting semantics by any Working Group,
+    specification, or document instance:
+
+    base (as an attribute name): denotes an attribute whose value
+         provides a URI to be used as the base for interpreting any
+         relative URIs in the scope of the element on which it
+         appears; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML Base specification.
+
+    id   (as an attribute name): denotes an attribute whose value
+         should be interpreted as if declared to be of type ID.
+         The xml:id specification is not yet a W3C Recommendation,
+         but this attribute is included here to facilitate experimentation
+         with the mechanisms it proposes.  Note that it is _not_ included
+         in the specialAttrs attribute group.
+
+    lang (as an attribute name): denotes an attribute whose value
+         is a language code for the natural language of the content of
+         any element; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML specification.
+  
+    space (as an attribute name): denotes an attribute whose
+         value is a keyword indicating what whitespace processing
+         discipline is intended for the content of the element; its
+         value is inherited.  This name is reserved by virtue of its
+         definition in the XML specification.
+
+    Father (in any context at all): denotes Jon Bosak, the chair of 
+         the original XML Working Group.  This name is reserved by 
+         the following decision of the W3C XML Plenary and 
+         XML Coordination groups:
+
+             In appreciation for his vision, leadership and dedication
+             the W3C XML Plenary on this 10th day of February, 2000
+             reserves for Jon Bosak in perpetuity the XML name
+             xml:Father
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>This schema defines attributes and an attribute group
+        suitable for use by
+        schemas wishing to allow xml:base, xml:lang, xml:space or xml:id
+        attributes on elements they define.
+
+        To enable this, such a schema must import this schema
+        for the XML namespace, e.g. as follows:
+        &lt;schema . . .>
+         . . .
+         &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                    schemaLocation="http://www.w3.org/2005/08/xml.xsd"/>
+
+        Subsequently, qualified reference to any of the attributes
+        or the group defined below will have the desired effect, e.g.
+
+        &lt;type . . .>
+         . . .
+         &lt;attributeGroup ref="xml:specialAttrs"/>
+ 
+         will define a type which will schema-validate an instance
+         element with any of those attributes</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>In keeping with the XML Schema WG's standard versioning
+   policy, this schema document will persist at
+   http://www.w3.org/2005/08/xml.xsd.
+   At the date of issue it can also be found at
+   http://www.w3.org/2001/xml.xsd.
+   The schema document at that URI may however change in the future,
+   in order to remain compatible with the latest version of XML Schema
+   itself, or with the XML namespace itself.  In other words, if the XML
+   Schema or XML namespaces change, the version of this document at
+   http://www.w3.org/2001/xml.xsd will change
+   accordingly; the version at
+   http://www.w3.org/2005/08/xml.xsd will not change.
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>Attempting to install the relevant ISO 2- and 3-letter
+         codes as the enumerated possible values is probably never
+         going to be a realistic possibility.  See
+         RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry
+         at http://www.iana.org/assignments/lang-tag-apps.htm for
+         further information.
+
+         The union allows for the 'un-declaration' of xml:lang with
+         the empty string.</xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>    
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xmlbase/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+ 
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xml-id/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+ </xs:attributeGroup>
+
+</xs:schema>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/clearDatabase.sql
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/clearDatabase.sql	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/clearDatabase.sql	(revision 5961)
@@ -0,0 +1,10 @@
+delete from component_description cascade;
+delete from profile_description cascade;
+delete from xml_content cascade;
+delete from comments cascade;
+delete from registry_user cascade;
+alter sequence registry_user_id_seq RESTART WITH 1;
+alter sequence xml_content_id_seq RESTART WITH 1;
+alter sequence profile_description_id_seq RESTART WITH 1;
+alter sequence component_description_id_seq RESTART WITH 1;
+alter sequence comments_id_seq RESTART WITH 1;
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/create.sql
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/create.sql	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/create.sql	(revision 5961)
@@ -0,0 +1,248 @@
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = off;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET escape_string_warning = off;
+
+SET search_path = public, pg_catalog;
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: comments; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE comments
+(
+  id SERIAL NOT NULL,
+  comments text NOT NULL,
+  comment_date timestamp with time zone,
+  profile_description_id character varying,
+  component_description_id character varying,
+  user_id integer NOT NULL
+);
+
+
+--
+-- Name: component_description; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE component_description (
+    id SERIAL NOT NULL,
+    user_id integer,
+    content_id integer NOT NULL,
+    is_public boolean NOT NULL,
+    is_deleted boolean DEFAULT false NOT NULL,
+    component_id character varying NOT NULL,
+    name character varying NOT NULL,
+    description character varying NOT NULL,
+    registration_date timestamp with time zone,
+    creator_name character varying,
+    domain_name character varying,
+    group_name character varying,
+    href character varying,
+    UNIQUE(component_id)
+);
+
+--
+-- Name: xml_content; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE xml_content (
+    id SERIAL NOT NULL,
+    content text NOT NULL
+);
+
+--
+-- Name: profile_description; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE profile_description (
+    id SERIAL NOT NULL,
+    user_id integer,
+    content_id integer NOT NULL,
+    is_public boolean NOT NULL,
+    is_deleted boolean DEFAULT false NOT NULL,
+    profile_id character varying NOT NULL,
+    name character varying NOT NULL,
+    description character varying NOT NULL,
+    registration_date timestamp with time zone,
+    creator_name character varying,
+    domain_name character varying,
+    group_name character varying,
+    href character varying,
+    show_in_editor boolean DEFAULT true NOT NULL,
+    UNIQUE(profile_id)
+);
+
+--
+-- Name: registry_user; Type: TABLE; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE TABLE registry_user (
+    id SERIAL NOT NULL,
+    name character varying,
+    principal_name character varying,
+    UNIQUE(principal_name)
+);
+
+--
+-- Name: comments_id_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY comments 
+    ADD CONSTRAINT comments_id_pkey PRIMARY KEY(id);
+
+--
+-- Name: component_description_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY component_description
+    ADD CONSTRAINT component_description_pkey PRIMARY KEY (id);
+
+--
+-- Name: profile_description_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY profile_description
+    ADD CONSTRAINT profile_description_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: user_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: 
+--
+
+ALTER TABLE ONLY registry_user
+    ADD CONSTRAINT user_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY xml_content
+    ADD CONSTRAINT content_pkey PRIMARY KEY (id);
+
+
+
+--
+-- Name: fki_comments_fk_user; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX fki_comments_fk_user ON comments USING btree (user_id);
+
+
+--
+-- Name: fki_comments_profile_id; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX fki_comments_profile_id ON comments USING btree (profile_description_id);
+
+--
+-- Name: fki_comments_component_id; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX fki_comments_component_id ON comments USING btree (component_description_id);
+
+
+--
+-- Name: fki_component_content; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX fki_component_content ON component_description USING btree (content_id);
+
+
+--
+-- Name: fki_component_user; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX fki_component_user ON component_description USING btree (user_id);
+
+
+--
+-- Name: fki_profile_content; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX fki_profile_content ON profile_description USING btree (content_id);
+
+
+--
+-- Name: fki_profile_user; Type: INDEX; Schema: public; Owner: -; Tablespace: 
+--
+
+CREATE INDEX fki_profile_user ON profile_description USING btree (user_id);
+
+
+--
+-- Name: comments_profile_id; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY comments
+    ADD CONSTRAINT comments_profile_id FOREIGN KEY (profile_description_id) REFERENCES profile_description(profile_id);
+
+
+--
+-- Name: comments_user; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY comments
+    ADD CONSTRAINT comments_user FOREIGN KEY (user_id) REFERENCES registry_user(id);
+
+
+--
+-- Name: comments_component_id; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY comments
+    ADD CONSTRAINT comments_component_id FOREIGN KEY (component_description_id) REFERENCES component_description(component_id);
+
+
+--
+-- Name: component_content; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY component_description
+    ADD CONSTRAINT component_content FOREIGN KEY (content_id) REFERENCES xml_content(id);
+
+
+--
+-- Name: component_user; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY component_description
+    ADD CONSTRAINT component_user FOREIGN KEY (user_id) REFERENCES registry_user(id);
+
+
+--
+-- Name: profile_content; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY profile_description
+    ADD CONSTRAINT profile_content FOREIGN KEY (content_id) REFERENCES xml_content(id);
+
+
+--
+-- Name: profile_user; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY profile_description
+    ADD CONSTRAINT profile_user FOREIGN KEY (user_id) REFERENCES registry_user(id);
+
+
+--
+-- Name: public; Type: ACL; Schema: -; Owner: -
+--
+
+-- REVOKE ALL ON SCHEMA public FROM PUBLIC;
+-- REVOKE ALL ON SCHEMA public FROM postgres;
+-- GRANT ALL ON SCHEMA public TO postgres;
+-- GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
+grant all on comments, component_description, profile_description, registry_user, xml_content, comments_id_seq, component_description_id_seq, profile_description_id_seq, registry_user_id_seq, xml_content_id_seq  to compreg;
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/dumpxml.sh
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/dumpxml.sh	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/dumpxml.sh	(revision 5961)
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+####################################################################################
+# This script dumps all xml content from the component registry
+# database into separate files.
+#
+# THIS WILL INCLUDE PRIVATE AND DELETED COMPONENTS AND PROFILES
+#
+# Use with care...
+#
+####################################################################################
+
+DB_NAME=component_registry
+DB_USER=compreg
+OUTPUTDIR=/tmp/compregxml
+
+mkdir ${OUTPUTDIR}
+
+echo getting xml from database...
+
+psql -U ${DB_USER} ${DB_NAME} << EOF
+\copy xml_content (content) TO '/tmp/xmls.tmp'
+EOF
+
+echo processing into files
+
+# sed to strip out explicit newline characters
+# split to move into separate files
+cat /tmp/xmls.tmp | sed -e 's/\\n//g' | split -a 5 -l 1 - ${OUTPUTDIR}/compreg.xml.
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.10.sql
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.10.sql	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.10.sql	(revision 5961)
@@ -0,0 +1,8 @@
+---
+--- This scripts adds columns to the database that are required for
+--- the component registry REST service versions 1.10 and up.
+---
+--- Apply only when upgrading from an existing version lower than 1.10
+---
+
+alter table profile_description add column show_in_editor boolean DEFAULT true NOT NULL;
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.11.sql
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.11.sql	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.11.sql	(revision 5961)
@@ -0,0 +1,27 @@
+---
+--- This scripts adds columns to the database that are required for
+--- the component registry REST service versions 1.10 and up.
+---
+--- Apply only when upgrading from an existing version lower than 1.11
+
+DROP TABLE comments;
+
+CREATE TABLE comments
+(
+  id SERIAL NOT NULL,
+  comments text NOT NULL,
+  comment_date timestamp with time zone NOT NULL,
+  profile_description_id character varying,
+  component_description_id character varying,
+  user_id integer NOT NULL,
+  user_name character varying
+);
+
+
+CREATE INDEX fki_comments_fk_user ON comments USING btree (user_id);
+CREATE INDEX fki_comments_profile_id ON comments USING btree (profile_description_id);
+CREATE INDEX fki_comments_component_id ON comments USING btree (component_description_id);
+ALTER TABLE ONLY comments ADD CONSTRAINT comments_id_pkey PRIMARY KEY(id);
+ALTER TABLE ONLY comments ADD CONSTRAINT comments_user FOREIGN KEY (user_id) REFERENCES registry_user(id);
+ALTER TABLE ONLY comments ADD CONSTRAINT comments_profile_id FOREIGN KEY (profile_description_id) REFERENCES profile_description(profile_id);
+ALTER TABLE ONLY comments ADD CONSTRAINT comments_component_id FOREIGN KEY (component_description_id) REFERENCES component_description(component_id);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.14.sql
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.14.sql	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/sql/upgrade-1.14.sql	(revision 5961)
@@ -0,0 +1,102 @@
+CREATE TABLE usergroup
+(
+  id serial,
+  ownerId integer NOT NULL,
+  name varchar(255) NOT NULL,
+  CONSTRAINT usergroup_pkey PRIMARY KEY (id)
+)
+WITH (
+  OIDS=FALSE
+);
+GRANT ALL ON TABLE usergroup TO postgres;
+GRANT ALL ON TABLE usergroup TO compreg;
+grant all on usergroup_id_seq to compreg;
+
+CREATE TABLE ownership
+(
+  id serial,
+  profileId varchar(255),
+  componentId varchar(255),
+  groupId integer,
+  userId integer,
+  CONSTRAINT ownership_pkey PRIMARY KEY (id)
+)
+WITH (
+  OIDS=FALSE
+);
+GRANT ALL ON TABLE ownership TO postgres;
+GRANT ALL ON TABLE ownership TO compreg;
+grant all on ownership_id_seq to compreg;
+
+
+CREATE TABLE groupmembership
+(
+  id serial,
+  groupId integer,
+  userId integer,
+  CONSTRAINT groupmembership_pkey PRIMARY KEY (id)
+)
+WITH (
+  OIDS=FALSE
+);
+GRANT ALL ON TABLE groupmembership TO postgres;
+GRANT ALL ON TABLE groupmembership TO compreg;
+grant all on groupmembership_id_seq to compreg;
+
+
+-- originally from upgrade-1.15.sql, was merged back into 1.14 (November 2014)
+
+ALTER TABLE profile_description RENAME TO persistentcomponents;
+
+alter table persistentcomponents
+ rename column profile_id to component_id;
+
+insert into persistentcomponents(user_id, content_id, is_public, is_deleted, component_id, name, description, registration_date, 
+ creator_name, domain_name, group_name, href, show_in_editor)
+ select user_id, content_id,is_public, is_deleted, component_id, name, description, registration_date, 
+ creator_name, domain_name,  group_name, href, true
+ from component_description;
+
+alter table comments drop constraint comments_component_id;
+
+update comments set component_description_id = profile_description_id where component_description_id is null;
+
+alter table comments rename column component_description_id to component_id;
+alter table comments drop profile_description_id;
+
+drop table component_description cascade;
+
+update ownership set componentid = profileid where componentid is null;
+
+alter table ownership drop column profileid;
+
+alter table persistentcomponents
+add column content text NOT NULL default '';
+
+update persistentcomponents set content = 
+(select content 
+ from xml_content
+ where xml_content.id = persistentcomponents.content_id
+ );
+
+drop table xml_content cascade;
+
+alter table persistentcomponents
+drop column content_id;
+
+-- originally from upgrade-1.15.1.sql, was merged back into 1.14 (November 2014)
+
+alter table persistentcomponents rename to basedescription;
+alter sequence profile_description_id_seq rename to basedescription_id_seq;
+ALTER INDEX profile_description_pkey RENAME TO basedescription_pkey;
+alter table basedescription add constraint constraint_basedescription_unique_id unique(id);
+alter table basedescription drop constraint profile_description_profile_id_key;
+alter table basedescription add constraint fk_basedescription_user_id foreign key(user_id) references registry_user (id) match full;
+alter table basedescription drop constraint profile_user;
+drop index fki_profile_user;
+
+create index idx_basedescription_id on basedescription(id);
+create index idx_user_id on basedescription(user_id);
+create index idx_is_deleted on basedescription(is_deleted);
+create index idx_is_public on basedescription(is_public);
+create index idx_component_id on basedescription(component_id);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/AC_OETags.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/AC_OETags.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/AC_OETags.js	(revision 5961)
@@ -0,0 +1,292 @@
+// Flash Player Version Detection - Rev 1.6
+// Detect Client Browser type
+// Copyright(c) 2005-2006 Adobe Macromedia Software, LLC. All rights reserved.
+var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
+var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
+var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
+
+function ControlVersion()
+{
+	var version;
+	var axo;
+	var e;
+
+	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
+
+	try {
+		// version will be set for 7.X or greater players
+		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+		version = axo.GetVariable("$version");
+	} catch (e) {
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 6.X players only
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+			
+			// installed player is some revision of 6.0
+			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
+			// so we have to be careful. 
+			
+			// default to the first public version
+			version = "WIN 6,0,21,0";
+
+			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
+			axo.AllowScriptAccess = "always";
+
+			// safe to call for 6.0r47 or greater
+			version = axo.GetVariable("$version");
+
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 4.X or 5.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+			version = axo.GetVariable("$version");
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 3.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+			version = "WIN 3,0,18,0";
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 2.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+			version = "WIN 2,0,0,11";
+		} catch (e) {
+			version = -1;
+		}
+	}
+	
+	return version;
+}
+
+// JavaScript helper required to detect Flash Player PlugIn version information
+function GetSwfVer(){
+	// NS/Opera version >= 3 check for Flash plugin in plugin array
+	var flashVer = -1;
+	
+	if (navigator.plugins != null && navigator.plugins.length > 0) {
+		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
+			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
+			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
+			var descArray = flashDescription.split(" ");
+			var tempArrayMajor = descArray[2].split(".");			
+			var versionMajor = tempArrayMajor[0];
+			var versionMinor = tempArrayMajor[1];
+			var versionRevision = descArray[3];
+			if (versionRevision == "") {
+				versionRevision = descArray[4];
+			}
+			if (versionRevision[0] == "d") {
+				versionRevision = versionRevision.substring(1);
+			} else if (versionRevision[0] == "r") {
+				versionRevision = versionRevision.substring(1);
+				if (versionRevision.indexOf("d") > 0) {
+					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
+				}
+			} else if (versionRevision[0] == "b") {
+				versionRevision = versionRevision.substring(1);
+			}
+			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
+		}
+	}
+	// MSN/WebTV 2.6 supports Flash 4
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
+	// WebTV 2.5 supports Flash 3
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
+	// older WebTV supports Flash 2
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
+	else if ( isIE && isWin && !isOpera ) {
+		flashVer = ControlVersion();
+	}
+	return flashVer;
+}
+
+// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
+function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
+{
+	versionStr = GetSwfVer();
+	if (versionStr == -1 ) {
+		return false;
+	} else if (versionStr != 0) {
+		if(isIE && isWin && !isOpera) {
+			// Given "WIN 2,0,0,11"
+			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
+			tempString        = tempArray[1];			// "2,0,0,11"
+			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
+		} else {
+			versionArray      = versionStr.split(".");
+		}
+		var versionMajor      = versionArray[0];
+		var versionMinor      = versionArray[1];
+		var versionRevision   = versionArray[2];
+
+        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
+		if (versionMajor > parseFloat(reqMajorVer)) {
+			return true;
+		} else if (versionMajor == parseFloat(reqMajorVer)) {
+			if (versionMinor > parseFloat(reqMinorVer))
+				return true;
+			else if (versionMinor == parseFloat(reqMinorVer)) {
+				if (versionRevision >= parseFloat(reqRevision))
+					return true;
+			}
+		}
+		return false;
+	}
+}
+
+function AC_AddExtension(src, ext)
+{
+  var qIndex = src.indexOf('?');
+  if ( qIndex != -1)
+  {
+    // Add the extention (if needed) before the query params
+    var path = src.substring(0, qIndex);
+    if (path.length >= ext.length && path.lastIndexOf(ext) == (path.length - ext.length))
+      return src;
+    else
+      return src.replace(/\?/, ext+'?'); 
+  }
+  else
+  {
+    // Add the extension (if needed) to the end of the URL
+    if (src.length >= ext.length && src.lastIndexOf(ext) == (src.length - ext.length))
+      return src;  // Already have extension
+    else
+      return src + ext;
+  }
+}
+
+function AC_Generateobj(objAttrs, params, embedAttrs) 
+{ 
+    var str = '';
+    if (isIE && isWin && !isOpera)
+    {
+  		str += '<object ';
+  		for (var i in objAttrs)
+  			str += i + '="' + objAttrs[i] + '" ';
+  		str += '>';
+  		for (var i in params)
+  			str += '<param name="' + i + '" value="' + params[i] + '" /> ';
+  		str += '</object>';
+    } else {
+  		str += '<embed ';
+  		for (var i in embedAttrs)
+  			str += i + '="' + embedAttrs[i] + '" ';
+  		str += '> </embed>';
+    }
+
+    document.write(str);
+}
+
+function AC_FL_RunContent(){
+  var ret = 
+    AC_GetArgs
+    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
+     , "application/x-shockwave-flash"
+    );
+  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
+}
+
+function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
+  var ret = new Object();
+  ret.embedAttrs = new Object();
+  ret.params = new Object();
+  ret.objAttrs = new Object();
+  for (var i=0; i < args.length; i=i+2){
+    var currArg = args[i].toLowerCase();    
+
+    switch (currArg){	
+      case "classid":
+        break;
+      case "pluginspage":
+        ret.embedAttrs[args[i]] = args[i+1];
+        break;
+      case "src":
+      case "movie":	
+        args[i+1] = AC_AddExtension(args[i+1], ext);
+        ret.embedAttrs["src"] = args[i+1];
+        ret.params[srcParamName] = args[i+1];
+        break;
+      case "onafterupdate":
+      case "onbeforeupdate":
+      case "onblur":
+      case "oncellchange":
+      case "onclick":
+      case "ondblClick":
+      case "ondrag":
+      case "ondragend":
+      case "ondragenter":
+      case "ondragleave":
+      case "ondragover":
+      case "ondrop":
+      case "onfinish":
+      case "onfocus":
+      case "onhelp":
+      case "onmousedown":
+      case "onmouseup":
+      case "onmouseover":
+      case "onmousemove":
+      case "onmouseout":
+      case "onkeypress":
+      case "onkeydown":
+      case "onkeyup":
+      case "onload":
+      case "onlosecapture":
+      case "onpropertychange":
+      case "onreadystatechange":
+      case "onrowsdelete":
+      case "onrowenter":
+      case "onrowexit":
+      case "onrowsinserted":
+      case "onstart":
+      case "onscroll":
+      case "onbeforeeditfocus":
+      case "onactivate":
+      case "onbeforedeactivate":
+      case "ondeactivate":
+      case "type":
+      case "codebase":
+        ret.objAttrs[args[i]] = args[i+1];
+        break;
+      case "id":
+      case "width":
+      case "height":
+      case "align":
+      case "vspace": 
+      case "hspace":
+      case "class":
+      case "title":
+      case "accesskey":
+      case "name":
+      case "tabindex":
+        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
+        break;
+      default:
+        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
+    }
+  }
+  ret.objAttrs["classid"] = classid;
+  if (mimeType) ret.embedAttrs["type"] = mimeType;
+  return ret;
+}
+
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/META-INF/context.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/META-INF/context.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/META-INF/context.xml	(revision 5961)
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Component Registry context.xml
+    Twan Goosen <twan.goosen@mpi.nl>, 21/9/2011
+
+    This file contains configuration options for the ComponentRegistry 
+    package which includes both the REST service and the Flex UI.
+    
+    For information about the component registry, see 
+    <http://www.clarin.eu/cmdi> and 
+    <http://trac.clarin.eu/wiki/ComponentRegistry>.
+    
+    == DATABASE CONNECTION ==
+    
+    By default, the application assumes a named (JNDI) datasource 
+    jdbc/ComponentRegistry that provides access to the ComponentRegistry
+    database.
+    
+    For more information, or configuring a custom datasource Spring bean,
+    see WEB-INF/spring-config/datasource-jdbc.xml
+    
+    A database creation script can be found at 
+    <http://svn.clarin.eu/ComponentRegistry/tags/ComponentRegistry-${project.version}/ComponentRegistry/src/main/sql/create.sql>
+    
+    == SPRING CONFIGURATION ==
+    
+    This application uses the Spring framework <http://www.springsource.org/>,
+    version 2.5. Part of its configuration is handled through Spring beans. 
+    These are defined in WEB-INF/applicationContext.xml and the files in 
+    WEB-INF/spring-config.
+        
+    == SHIBBOLETH ==
+    
+    This application uses Shibboleth authentication. Make sure that the URIs
+    for login/logout are set correctly in WEB-INF/shhaa.xml. 
+-->
+<Context antiJARLocking="true" path="/ComponentRegistry">
+  <!-- 
+	Passed to the Flex UI via index.jsp so that it can locate the 
+	ComponentRegistry REST service. Just supply the application root:
+	the '/rest/registry' part will be added by the application.
+    -->
+  <Parameter name="eu.clarin.cmdi.componentregistry.serviceRootUrl" value="${serviceRootUrl}"/>
+  <!--
+	Location that gets redirected to from /documentation.jsp, which in turn is linked to
+	from the Flex application through the 'Help' link button.
+    -->
+  <Parameter name="eu.clarin.cmdi.componentregistry.documentationUrl" value="http://www.clarin.eu/cmdi"/>
+  <!--
+	Space-separated list of users (getRemoteUser()) that should have access to the admin area of the ComponentRegistry
+    -->
+  <Parameter name="eu.clarin.cmdi.componentregistry.adminUsers" value="twagoo@mpi.nl olhsha@mpi.nl daan.broeder@mpi.nl dietuyt@mpi.nl Menzo.Windhouwer@mpi.nl"/>
+  <!--
+	Location of the CMDI general component schema that validates component specifications
+    -->
+  <Parameter name="eu.clarin.cmdi.componentregistry.generalComponentSchemaUrl" value="https://infra.clarin.eu/cmd/general-component-schema.xsd"/>
+  <!--
+	Location of the stylesheet that transforms component specifications into XML schema documents
+    -->
+  <Parameter name="eu.clarin.cmdi.componentregistry.component2SchemaXslUrl" value="https://infra.clarin.eu/cmd/xslt/comp2schema-v2/comp2schema.xsl"/>
+  <!-- 
+        Schema location that will go into xsi:schemaLocation attribute of component specification. Beware this should follow
+        XML standards and have a namespace component (URI) and schema location component (URL) separated by a space
+    -->
+  <Parameter name="eu.clarin.cmdi.componentregistry.componentSpecSchemaLocation" value="http://www.clarin.eu/cmd https://infra.clarin.eu/cmd/general-component-schema.xsd"/>
+  <!--
+	Base location of the ISOcat service
+    -->
+  <Parameter name="eu.clarin.cmdi.componentregistry.ccrRestUrl" value="https://openskos.meertens.knaw.nl/ccr/api/"/>
+  <Parameter name="eu.clarin.cmdi.componentregistry.jpaDialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
+</Context>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/shhaa.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/shhaa.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/shhaa.xml	(revision 5961)
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<ROOT>
+    <shhaa>
+
+	<authentication>
+	    <shibheader>
+		<username>oid-eduPersonPrincipalName</username>
+		<username>mace-eduPersonPrincipalName</username>
+		<username>eduPersonPrincipalName</username>
+		
+		<username>oid-eduPersonTargetedID</username>
+		<username>mace-eduPersonTargetedID</username>
+		<username>eduPersonTargetedID</username>
+
+		<session>Shib-Session-ID</session>
+		<idp>Shib-Identity-Provider</idp>
+		<timestamp>Shib-Authentication-Instant</timestamp>
+	    </shibheader>
+	    <fallback>
+		<username>anonymous</username>
+	    </fallback>
+	    <sso action="lI">${shibLI}</sso> 
+	    <slo action="lO">${shibLO}</slo>     
+	</authentication>
+	
+	
+	<composition action="rF">
+	    <shibheader>
+		<attribute>displayName</attribute>
+		<attribute>commonName</attribute>
+	    </shibheader>
+	</composition>
+
+	
+	<authorization>
+	    <location  target="/admin/*" />
+        </authorization>
+	
+	
+	<handler>
+	    <ignore>
+		<location target="/css/*" />
+		<location target="/img/*" />
+	    </ignore>
+		
+	    <!-- configures the view-control targets -->
+	    <pages>
+		<!--  <info action="dI">/protected/info.jsp</info> -->
+		<denied action="dD">pages/noaccess.jsp</denied> 
+	    </pages>
+		
+	</handler>
+	
+    </shhaa>
+</ROOT>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/web-shib.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/web-shib.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/web-shib.xml	(revision 5961)
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- 
+        Configuration file for ComponentRegistry in shibbolized context, which
+        any production environment should be.
+-->
+
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+    <display-name>ComponentRegistry</display-name>
+    <description>Clarin Metadata Component Registry</description>
+
+
+    <context-param>
+        <param-name>ShhaaConfigLocation</param-name>
+        <param-value>/WEB-INF/shhaa.xml</param-value>
+    </context-param>
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>classpath:spring-config/applicationContext.xml,classpath:spring-config/container-environment.xml
+        </param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+    
+    
+
+    <filter>
+        <filter-name>characterEncodingFilter</filter-name>
+        <filter-class>clarin.cmdi.componentregistry.servlet.CharacterEncodingFilter</filter-class>
+        <init-param>
+            <param-name>encoding</param-name>
+            <param-value>UTF-8</param-value>
+        </init-param>
+    </filter>
+    <filter>
+        <filter-name>NoCachingFilter</filter-name>
+        <filter-class>clarin.cmdi.componentregistry.servlet.DontCacheFilter</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>NoCachingFilter</filter-name>
+        <url-pattern>/rest/registry/*</url-pattern>
+    </filter-mapping>
+    
+    
+    <filter-mapping>
+        <filter-name>characterEncodingFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+  
+    <!-- Make sure this one is declared before the wicket filter, the order matters. Shibboleth should trigger the login, before continuing with the wicket filter.-->
+    <filter>
+        <filter-name>AAIFilter</filter-name>
+        <filter-class>de.mpg.aai.shhaa.AuthFilter</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>AAIFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+  
+    <listener>
+        <listener-class>de.mpg.aai.shhaa.config.ConfigContextListener</listener-class>
+    </listener>
+
+    <filter>
+        <filter-name>wicket.componentregistry</filter-name>
+        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
+        <init-param>
+            <param-name>applicationClassName</param-name>
+            <param-value>clarin.cmdi.componentregistry.frontend.AdminApp</param-value>
+        </init-param>
+        <init-param>
+            <param-name>configuration</param-name>
+            <!--      <param-value>development</param-value>-->
+            <param-value>deployment</param-value>
+            <!-- you can override with -Dwicket.configuration=development -->
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <filter-name>wicket.componentregistry</filter-name>
+        <url-pattern>/admin/*</url-pattern>
+    </filter-mapping>
+    <servlet>
+        <servlet-name>ComponentRegistry Web Application</servlet-name>
+        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
+        <init-param> 
+            <param-name>com.sun.jersey.config.property.classnames</param-name> 
+            <param-value>com.sun.jersey.multipart.impl.FormDataMultiPartDispatchProvider</param-value> 
+        </init-param>
+        <init-param>
+            <param-name>com.sun.jersey.config.property.packages</param-name>
+            <param-value>com.wordnik.swagger.jersey.listing</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>ComponentRegistry Web Application</servlet-name>
+        <url-pattern>/rest/*</url-pattern>
+    </servlet-mapping>
+
+    <servlet>
+        <servlet-name>Concept Registry Servlet</servlet-name>
+        <servlet-class>clarin.cmdi.componentregistry.servlet.ConceptRegistryServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>Concept Registry Servlet</servlet-name>
+        <url-pattern>/ccr/*</url-pattern>
+    </servlet-mapping>
+    <servlet>
+        <servlet-name>JerseyJaxrsConfig</servlet-name>
+        <servlet-class>com.wordnik.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
+        <init-param>
+            <param-name>api.version</param-name>
+            <param-value>1.0.0</param-value>
+        </init-param>
+        <init-param>
+            <param-name>swagger.api.basepath</param-name>
+            <param-value>https://catalog.clarin.eu/ds/ComponentRegistry/rest</param-value>
+        </init-param>
+        <load-on-startup>2</load-on-startup>
+    </servlet>
+
+</web-app>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/web-test.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/web-test.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/WEB-INF/web-test.xml	(revision 5961)
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Configuration file for ComponentRegistry in NON-SHIBBOLIZED context, 
+i.e. development or testing environments. -->
+
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+    <display-name>ComponentRegistry</display-name>
+    <description>Clarin Metadata Component Registry</description>
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener
+        </listener-class>
+    </listener>
+
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>classpath:spring-config/applicationContext.xml,classpath:spring-config/container-environment.xml
+        </param-value>
+    </context-param>
+
+    <filter>
+        <filter-name>characterEncodingFilter</filter-name>
+        <filter-class>clarin.cmdi.componentregistry.servlet.CharacterEncodingFilter
+        </filter-class>
+        <init-param>
+            <param-name>encoding</param-name>
+            <param-value>UTF-8</param-value>
+        </init-param>
+    </filter>
+    <filter>
+        <filter-name>NoCachingFilter</filter-name>
+        <filter-class>clarin.cmdi.componentregistry.servlet.DontCacheFilter</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>NoCachingFilter</filter-name>
+        <url-pattern>/rest/registry/*</url-pattern>
+    </filter-mapping>
+    <filter-mapping>
+        <filter-name>characterEncodingFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    <filter>
+        <filter-name>wicket.componentregistry</filter-name>
+        <filter-class>org.apache.wicket.protocol.http.WicketFilter
+        </filter-class>
+        <init-param>
+            <param-name>applicationClassName</param-name>
+            <param-value>clarin.cmdi.componentregistry.frontend.AdminApp
+            </param-value>
+        </init-param>
+        <init-param>
+            <param-name>configuration</param-name>
+            <!-- <param-value>development</param-value> -->
+            <param-value>deployment</param-value>
+            <!-- you can override with -Dwicket.configuration=development -->
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <filter-name>wicket.componentregistry</filter-name>
+        <url-pattern>/admin/*</url-pattern>
+    </filter-mapping>
+    <servlet>
+        <servlet-name>ComponentRegistry Web Application</servlet-name>
+        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
+        <init-param> 
+            <param-name>com.sun.jersey.config.property.classnames</param-name> 
+            <param-value>com.sun.jersey.multipart.impl.FormDataMultiPartDispatchProvider</param-value> 
+        </init-param>
+        <init-param>
+            <param-name>com.sun.jersey.config.property.packages</param-name>
+            <param-value>com.wordnik.swagger.jersey.listing</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>ComponentRegistry Web Application</servlet-name>
+        <url-pattern>/rest/*</url-pattern>
+    </servlet-mapping>    
+    
+    <servlet>
+        <servlet-name>Concept Registry Servlet</servlet-name>
+        <servlet-class>clarin.cmdi.componentregistry.servlet.ConceptRegistryServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>Concept Registry Servlet</servlet-name>
+        <url-pattern>/ccr/*</url-pattern>
+    </servlet-mapping>
+    
+    <servlet>
+        <servlet-name>JerseyJaxrsConfig</servlet-name>
+        <servlet-class>com.wordnik.swagger.jersey.config.JerseyJaxrsConfig</servlet-class>
+        <init-param>
+            <param-name>api.version</param-name>
+            <param-value>1.0.0</param-value>
+        </init-param>
+        <init-param>
+            <param-name>swagger.api.basepath</param-name>
+            <param-value>http://localhost:8080/ComponentRegistry/rest</param-value>
+        </init-param>
+        <load-on-startup>2</load-on-startup>
+    </servlet>
+    <security-constraint>
+        <display-name>ComponentRegistry web service</display-name>
+        <web-resource-collection>
+            <web-resource-name>ComponentRegistry edit</web-resource-name>
+            <description />
+            <url-pattern>/rest/*</url-pattern>
+            <http-method>DELETE</http-method>
+            <http-method>PUT</http-method>
+            <http-method>POST</http-method>
+        </web-resource-collection>
+        <auth-constraint>
+            <role-name>tomcat</role-name>
+        </auth-constraint>
+    </security-constraint>
+    <security-constraint>
+        <display-name>ComponentRegistry SWF GET</display-name>
+        <web-resource-collection>
+            <web-resource-name>ComponentRegistry access</web-resource-name>
+            <description />
+            <url-pattern>/*</url-pattern>
+            <http-method>GET</http-method>
+        </web-resource-collection>
+        <auth-constraint>
+            <role-name>tomcat</role-name>
+        </auth-constraint>
+    </security-constraint>
+    <login-config>
+        <auth-method>BASIC</auth-method>
+    </login-config>
+    <security-role>
+        <description> The role that is required to log in to the Application
+        </description>
+        <role-name>tomcat</role-name>
+    </security-role>
+	
+    <welcome-file-list>
+        <welcome-file>index.jsp</welcome-file>
+    </welcome-file-list>
+	
+</web-app>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/css/reset.css
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/css/reset.css	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/css/reset.css	(revision 5961)
@@ -0,0 +1,125 @@
+/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+b,
+u,
+i,
+center,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+embed,
+figure,
+figcaption,
+footer,
+header,
+hgroup,
+menu,
+nav,
+output,
+ruby,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+  display: block;
+}
+body {
+  line-height: 1;
+}
+ol,
+ul {
+  list-style: none;
+}
+blockquote,
+q {
+  quotes: none;
+}
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+  content: '';
+  content: none;
+}
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/css/screen.css
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/css/screen.css	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/css/screen.css	(revision 5961)
@@ -0,0 +1,1224 @@
+/* Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org> */
+.swagger-section pre code {
+  display: block;
+  padding: 0.5em;
+  background: #F0F0F0;
+}
+.swagger-section pre code,
+.swagger-section pre .subst,
+.swagger-section pre .tag .title,
+.swagger-section pre .lisp .title,
+.swagger-section pre .clojure .built_in,
+.swagger-section pre .nginx .title {
+  color: black;
+}
+.swagger-section pre .string,
+.swagger-section pre .title,
+.swagger-section pre .constant,
+.swagger-section pre .parent,
+.swagger-section pre .tag .value,
+.swagger-section pre .rules .value,
+.swagger-section pre .rules .value .number,
+.swagger-section pre .preprocessor,
+.swagger-section pre .ruby .symbol,
+.swagger-section pre .ruby .symbol .string,
+.swagger-section pre .aggregate,
+.swagger-section pre .template_tag,
+.swagger-section pre .django .variable,
+.swagger-section pre .smalltalk .class,
+.swagger-section pre .addition,
+.swagger-section pre .flow,
+.swagger-section pre .stream,
+.swagger-section pre .bash .variable,
+.swagger-section pre .apache .tag,
+.swagger-section pre .apache .cbracket,
+.swagger-section pre .tex .command,
+.swagger-section pre .tex .special,
+.swagger-section pre .erlang_repl .function_or_atom,
+.swagger-section pre .markdown .header {
+  color: #800;
+}
+.swagger-section pre .comment,
+.swagger-section pre .annotation,
+.swagger-section pre .template_comment,
+.swagger-section pre .diff .header,
+.swagger-section pre .chunk,
+.swagger-section pre .markdown .blockquote {
+  color: #888;
+}
+.swagger-section pre .number,
+.swagger-section pre .date,
+.swagger-section pre .regexp,
+.swagger-section pre .literal,
+.swagger-section pre .smalltalk .symbol,
+.swagger-section pre .smalltalk .char,
+.swagger-section pre .go .constant,
+.swagger-section pre .change,
+.swagger-section pre .markdown .bullet,
+.swagger-section pre .markdown .link_url {
+  color: #080;
+}
+.swagger-section pre .label,
+.swagger-section pre .javadoc,
+.swagger-section pre .ruby .string,
+.swagger-section pre .decorator,
+.swagger-section pre .filter .argument,
+.swagger-section pre .localvars,
+.swagger-section pre .array,
+.swagger-section pre .attr_selector,
+.swagger-section pre .important,
+.swagger-section pre .pseudo,
+.swagger-section pre .pi,
+.swagger-section pre .doctype,
+.swagger-section pre .deletion,
+.swagger-section pre .envvar,
+.swagger-section pre .shebang,
+.swagger-section pre .apache .sqbracket,
+.swagger-section pre .nginx .built_in,
+.swagger-section pre .tex .formula,
+.swagger-section pre .erlang_repl .reserved,
+.swagger-section pre .prompt,
+.swagger-section pre .markdown .link_label,
+.swagger-section pre .vhdl .attribute,
+.swagger-section pre .clojure .attribute,
+.swagger-section pre .coffeescript .property {
+  color: #8888ff;
+}
+.swagger-section pre .keyword,
+.swagger-section pre .id,
+.swagger-section pre .phpdoc,
+.swagger-section pre .title,
+.swagger-section pre .built_in,
+.swagger-section pre .aggregate,
+.swagger-section pre .css .tag,
+.swagger-section pre .javadoctag,
+.swagger-section pre .phpdoc,
+.swagger-section pre .yardoctag,
+.swagger-section pre .smalltalk .class,
+.swagger-section pre .winutils,
+.swagger-section pre .bash .variable,
+.swagger-section pre .apache .tag,
+.swagger-section pre .go .typename,
+.swagger-section pre .tex .command,
+.swagger-section pre .markdown .strong,
+.swagger-section pre .request,
+.swagger-section pre .status {
+  font-weight: bold;
+}
+.swagger-section pre .markdown .emphasis {
+  font-style: italic;
+}
+.swagger-section pre .nginx .built_in {
+  font-weight: normal;
+}
+.swagger-section pre .coffeescript .javascript,
+.swagger-section pre .javascript .xml,
+.swagger-section pre .tex .formula,
+.swagger-section pre .xml .javascript,
+.swagger-section pre .xml .vbscript,
+.swagger-section pre .xml .css,
+.swagger-section pre .xml .cdata {
+  opacity: 0.5;
+}
+.swagger-section .swagger-ui-wrap {
+  line-height: 1;
+  font-family: "Droid Sans", sans-serif;
+  max-width: 960px;
+  margin-left: auto;
+  margin-right: auto;
+}
+.swagger-section .swagger-ui-wrap b,
+.swagger-section .swagger-ui-wrap strong {
+  font-family: "Droid Sans", sans-serif;
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap q,
+.swagger-section .swagger-ui-wrap blockquote {
+  quotes: none;
+}
+.swagger-section .swagger-ui-wrap p {
+  line-height: 1.4em;
+  padding: 0 0 10px;
+  color: #333333;
+}
+.swagger-section .swagger-ui-wrap q:before,
+.swagger-section .swagger-ui-wrap q:after,
+.swagger-section .swagger-ui-wrap blockquote:before,
+.swagger-section .swagger-ui-wrap blockquote:after {
+  content: none;
+}
+.swagger-section .swagger-ui-wrap .heading_with_menu h1,
+.swagger-section .swagger-ui-wrap .heading_with_menu h2,
+.swagger-section .swagger-ui-wrap .heading_with_menu h3,
+.swagger-section .swagger-ui-wrap .heading_with_menu h4,
+.swagger-section .swagger-ui-wrap .heading_with_menu h5,
+.swagger-section .swagger-ui-wrap .heading_with_menu h6 {
+  display: block;
+  clear: none;
+  float: left;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 60%;
+}
+.swagger-section .swagger-ui-wrap table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.swagger-section .swagger-ui-wrap table thead tr th {
+  padding: 5px;
+  font-size: 0.9em;
+  color: #666666;
+  border-bottom: 1px solid #999999;
+}
+.swagger-section .swagger-ui-wrap table tbody tr:last-child td {
+  border-bottom: none;
+}
+.swagger-section .swagger-ui-wrap table tbody tr.offset {
+  background-color: #f0f0f0;
+}
+.swagger-section .swagger-ui-wrap table tbody tr td {
+  padding: 6px;
+  font-size: 0.9em;
+  border-bottom: 1px solid #cccccc;
+  vertical-align: top;
+  line-height: 1.3em;
+}
+.swagger-section .swagger-ui-wrap ol {
+  margin: 0px 0 10px;
+  padding: 0 0 0 18px;
+  list-style-type: decimal;
+}
+.swagger-section .swagger-ui-wrap ol li {
+  padding: 5px 0px;
+  font-size: 0.9em;
+  color: #333333;
+}
+.swagger-section .swagger-ui-wrap ol,
+.swagger-section .swagger-ui-wrap ul {
+  list-style: none;
+}
+.swagger-section .swagger-ui-wrap h1 a,
+.swagger-section .swagger-ui-wrap h2 a,
+.swagger-section .swagger-ui-wrap h3 a,
+.swagger-section .swagger-ui-wrap h4 a,
+.swagger-section .swagger-ui-wrap h5 a,
+.swagger-section .swagger-ui-wrap h6 a {
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap h1 a:hover,
+.swagger-section .swagger-ui-wrap h2 a:hover,
+.swagger-section .swagger-ui-wrap h3 a:hover,
+.swagger-section .swagger-ui-wrap h4 a:hover,
+.swagger-section .swagger-ui-wrap h5 a:hover,
+.swagger-section .swagger-ui-wrap h6 a:hover {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap h1 span.divider,
+.swagger-section .swagger-ui-wrap h2 span.divider,
+.swagger-section .swagger-ui-wrap h3 span.divider,
+.swagger-section .swagger-ui-wrap h4 span.divider,
+.swagger-section .swagger-ui-wrap h5 span.divider,
+.swagger-section .swagger-ui-wrap h6 span.divider {
+  color: #aaaaaa;
+}
+.swagger-section .swagger-ui-wrap a {
+  color: #547f00;
+}
+.swagger-section .swagger-ui-wrap a img {
+  border: none;
+}
+.swagger-section .swagger-ui-wrap article,
+.swagger-section .swagger-ui-wrap aside,
+.swagger-section .swagger-ui-wrap details,
+.swagger-section .swagger-ui-wrap figcaption,
+.swagger-section .swagger-ui-wrap figure,
+.swagger-section .swagger-ui-wrap footer,
+.swagger-section .swagger-ui-wrap header,
+.swagger-section .swagger-ui-wrap hgroup,
+.swagger-section .swagger-ui-wrap menu,
+.swagger-section .swagger-ui-wrap nav,
+.swagger-section .swagger-ui-wrap section,
+.swagger-section .swagger-ui-wrap summary {
+  display: block;
+}
+.swagger-section .swagger-ui-wrap pre {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  background-color: #fcf6db;
+  border: 1px solid #e5e0c6;
+  padding: 10px;
+}
+.swagger-section .swagger-ui-wrap pre code {
+  line-height: 1.6em;
+  background: none;
+}
+.swagger-section .swagger-ui-wrap .content > .content-type > div > label {
+  clear: both;
+  display: block;
+  color: #0F6AB4;
+  font-size: 1.1em;
+  margin: 0;
+  padding: 15px 0 5px;
+}
+.swagger-section .swagger-ui-wrap .content pre {
+  font-size: 12px;
+  margin-top: 5px;
+  padding: 5px;
+}
+.swagger-section .swagger-ui-wrap .icon-btn {
+  cursor: pointer;
+}
+.swagger-section .swagger-ui-wrap .info_title {
+  padding-bottom: 10px;
+  font-weight: bold;
+  font-size: 25px;
+}
+.swagger-section .swagger-ui-wrap p.big,
+.swagger-section .swagger-ui-wrap div.big p {
+  font-size: 1em;
+  margin-bottom: 10px;
+}
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.string input,
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.url input,
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.text textarea,
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.numeric input {
+  width: 500px !important;
+}
+.swagger-section .swagger-ui-wrap .info_license {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .info_tos {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .message-fail {
+  color: #cc0000;
+}
+.swagger-section .swagger-ui-wrap .info_contact {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .info_description {
+  padding-bottom: 10px;
+  font-size: 15px;
+}
+.swagger-section .swagger-ui-wrap .markdown ol li,
+.swagger-section .swagger-ui-wrap .markdown ul li {
+  padding: 3px 0px;
+  line-height: 1.4em;
+  color: #333333;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input {
+  display: block;
+  padding: 4px;
+  width: auto;
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input.title,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input.title,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input.title {
+  font-size: 1.3em;
+}
+.swagger-section .swagger-ui-wrap table.fullwidth {
+  width: 100%;
+}
+.swagger-section .swagger-ui-wrap .model-signature {
+  font-family: "Droid Sans", sans-serif;
+  font-size: 1em;
+  line-height: 1.5em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-nav a {
+  text-decoration: none;
+  color: #AAA;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover {
+  text-decoration: underline;
+  color: black;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected {
+  color: black;
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propType {
+  color: #5555aa;
+}
+.swagger-section .swagger-ui-wrap .model-signature pre:hover {
+  background-color: #ffffdd;
+}
+.swagger-section .swagger-ui-wrap .model-signature pre {
+  font-size: .85em;
+  line-height: 1.2em;
+  overflow: auto;
+  max-height: 200px;
+  cursor: pointer;
+}
+.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav {
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li:last-child {
+  padding-right: 0;
+  border-right: none;
+}
+.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li {
+  float: left;
+  margin: 0 5px 5px 0;
+  padding: 2px 5px 2px 0;
+  border-right: 1px solid #ddd;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propOpt {
+  color: #555;
+}
+.swagger-section .swagger-ui-wrap .model-signature .snippet small {
+  font-size: 0.75em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propOptKey {
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description .strong {
+  font-weight: bold;
+  color: #000;
+  font-size: .9em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description div {
+  font-size: 0.9em;
+  line-height: 1.5em;
+  margin-left: 1em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description .stronger {
+  font-weight: bold;
+  color: #000;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propName {
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-container {
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap .body-textarea {
+  width: 300px;
+  height: 100px;
+  border: 1px solid #aaa;
+}
+.swagger-section .swagger-ui-wrap .markdown p code,
+.swagger-section .swagger-ui-wrap .markdown li code {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  background-color: #f0f0f0;
+  color: black;
+  padding: 1px 3px;
+}
+.swagger-section .swagger-ui-wrap .required {
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap input.parameter {
+  width: 300px;
+  border: 1px solid #aaa;
+}
+.swagger-section .swagger-ui-wrap h1 {
+  color: black;
+  font-size: 1.5em;
+  line-height: 1.3em;
+  padding: 10px 0 10px 0;
+  font-family: "Droid Sans", sans-serif;
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap .heading_with_menu {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap .heading_with_menu ul {
+  display: block;
+  clear: none;
+  float: right;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+  margin-top: 10px;
+}
+.swagger-section .swagger-ui-wrap h2 {
+  color: black;
+  font-size: 1.3em;
+  padding: 10px 0 10px 0;
+}
+.swagger-section .swagger-ui-wrap h2 a {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap h2 span.sub {
+  font-size: 0.7em;
+  color: #999999;
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap h2 span.sub a {
+  color: #777777;
+}
+.swagger-section .swagger-ui-wrap span.weak {
+  color: #666666;
+}
+.swagger-section .swagger-ui-wrap .message-success {
+  color: #89BF04;
+}
+.swagger-section .swagger-ui-wrap caption,
+.swagger-section .swagger-ui-wrap th,
+.swagger-section .swagger-ui-wrap td {
+  text-align: left;
+  font-weight: normal;
+  vertical-align: middle;
+}
+.swagger-section .swagger-ui-wrap .code {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.text textarea {
+  font-family: "Droid Sans", sans-serif;
+  height: 250px;
+  padding: 4px;
+  display: block;
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.select select {
+  display: block;
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean label {
+  display: block;
+  float: left;
+  clear: none;
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean input {
+  display: block;
+  float: left;
+  clear: none;
+  margin: 0 5px 0 0;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.required label {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label {
+  display: block;
+  clear: both;
+  width: auto;
+  padding: 0 0 3px;
+  color: #666666;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label abbr {
+  padding-left: 3px;
+  color: #888888;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li p.inline-hints {
+  margin-left: 0;
+  font-style: italic;
+  font-size: 0.9em;
+  margin: 0;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.buttons {
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap span.blank,
+.swagger-section .swagger-ui-wrap span.empty {
+  color: #888888;
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap .markdown h3 {
+  color: #547f00;
+}
+.swagger-section .swagger-ui-wrap .markdown h4 {
+  color: #666666;
+}
+.swagger-section .swagger-ui-wrap .markdown pre {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  background-color: #fcf6db;
+  border: 1px solid #e5e0c6;
+  padding: 10px;
+  margin: 0 0 10px 0;
+}
+.swagger-section .swagger-ui-wrap .markdown pre code {
+  line-height: 1.6em;
+}
+.swagger-section .swagger-ui-wrap div.gist {
+  margin: 20px 0 25px 0 !important;
+}
+.swagger-section .swagger-ui-wrap ul#resources {
+  font-family: "Droid Sans", sans-serif;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource {
+  border-bottom: 1px solid #dddddd;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a,
+.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a,
+.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a {
+  color: #555555;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource:last-child {
+  border-bottom: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading {
+  border: 1px solid transparent;
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options {
+  overflow: hidden;
+  padding: 0;
+  display: block;
+  clear: none;
+  float: right;
+  margin: 14px 10px 0 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li {
+  float: left;
+  clear: none;
+  margin: 0;
+  padding: 2px 10px;
+  border-right: 1px solid #dddddd;
+  color: #666666;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a {
+  color: #aaaaaa;
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover {
+  text-decoration: underline;
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:active,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a.active {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.last {
+  padding-right: 0;
+  border-right: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 {
+  color: #999999;
+  padding-left: 0;
+  display: block;
+  clear: none;
+  float: left;
+  font-family: "Droid Sans", sans-serif;
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a {
+  color: #999999;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+  margin: 0 0 10px;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 {
+  display: block;
+  clear: none;
+  float: left;
+  width: auto;
+  margin: 0;
+  padding: 0;
+  line-height: 1.1em;
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path {
+  padding-left: 10px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a {
+  color: black;
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a:hover {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a {
+  text-transform: uppercase;
+  text-decoration: none;
+  color: white;
+  display: inline-block;
+  width: 50px;
+  font-size: 0.7em;
+  text-align: center;
+  padding: 7px 0 4px;
+  -moz-border-radius: 2px;
+  -webkit-border-radius: 2px;
+  -o-border-radius: 2px;
+  -ms-border-radius: 2px;
+  -khtml-border-radius: 2px;
+  border-radius: 2px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span {
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options {
+  overflow: hidden;
+  padding: 0;
+  display: block;
+  clear: none;
+  float: right;
+  margin: 6px 10px 0 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li {
+  float: left;
+  clear: none;
+  margin: 0;
+  padding: 2px 10px;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a {
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li.access {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content {
+  border-top: none;
+  padding: 10px;
+  -moz-border-radius-bottomleft: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+  -o-border-bottom-left-radius: 6px;
+  -ms-border-bottom-left-radius: 6px;
+  -khtml-border-bottom-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+  -moz-border-radius-bottomright: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+  -o-border-bottom-right-radius: 6px;
+  -ms-border-bottom-right-radius: 6px;
+  -khtml-border-bottom-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+  margin: 0 0 20px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h4 {
+  font-size: 1.1em;
+  margin: 0;
+  padding: 15px 0 5px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header a {
+  padding: 4px 0 0 10px;
+  display: inline-block;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit {
+  display: block;
+  clear: none;
+  float: left;
+  padding: 6px 8px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber {
+  background-image: url('../images/throbber.gif');
+  width: 128px;
+  height: 16px;
+  display: block;
+  clear: none;
+  float: right;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type='text'].error {
+  outline: 2px solid black;
+  outline-color: #cc0000;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.response div.block pre {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  padding: 10px;
+  font-size: 0.9em;
+  max-height: 400px;
+  overflow-y: auto;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading {
+  background-color: #f9f2e9;
+  border: 1px solid #f0e0ca;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a {
+  background-color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #f0e0ca;
+  color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a {
+  color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content {
+  background-color: #faf5ee;
+  border: 1px solid #f0e0ca;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 {
+  color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a {
+  color: #dcb67f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading {
+  background-color: #fcffcd;
+  border: 1px solid black;
+  border-color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a {
+  text-transform: uppercase;
+  background-color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #ffd20f;
+  color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a {
+  color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content {
+  background-color: #fcffcd;
+  border: 1px solid black;
+  border-color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4 {
+  color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a {
+  color: #6fc992;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading {
+  background-color: #f5e8e8;
+  border: 1px solid #e8c6c7;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a {
+  text-transform: uppercase;
+  background-color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #e8c6c7;
+  color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a {
+  color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content {
+  background-color: #f7eded;
+  border: 1px solid #e8c6c7;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4 {
+  color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a {
+  color: #c8787a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading {
+  background-color: #e7f6ec;
+  border: 1px solid #c3e8d1;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a {
+  background-color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #c3e8d1;
+  color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a {
+  color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content {
+  background-color: #ebf7f0;
+  border: 1px solid #c3e8d1;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4 {
+  color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a {
+  color: #6fc992;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading {
+  background-color: #FCE9E3;
+  border: 1px solid #F5D5C3;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a {
+  background-color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #f0cecb;
+  color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a {
+  color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content {
+  background-color: #faf0ef;
+  border: 1px solid #f0cecb;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4 {
+  color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a {
+  color: #dcb67f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading {
+  background-color: #e7f0f7;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a {
+  background-color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #c3d9ec;
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content {
+  background-color: #ebf3f9;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4 {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a {
+  color: #6fa5d2;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading {
+  background-color: #e7f0f7;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading h3 span.http_method a {
+  background-color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #c3d9ec;
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li a {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content {
+  background-color: #ebf3f9;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content h4 {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content div.sandbox_header a {
+  color: #6fa5d2;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content {
+  border-top: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last {
+  padding-right: 0;
+  border-right: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:hover,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:active,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a.active {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap p#colophon {
+  margin: 0 15px 40px 15px;
+  padding: 10px 0;
+  font-size: 0.8em;
+  border-top: 1px solid #dddddd;
+  font-family: "Droid Sans", sans-serif;
+  color: #999999;
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap p#colophon a {
+  text-decoration: none;
+  color: #547f00;
+}
+.swagger-section .swagger-ui-wrap h3 {
+  color: black;
+  font-size: 1.1em;
+  padding: 10px 0 10px 0;
+}
+.swagger-section .swagger-ui-wrap .markdown ol,
+.swagger-section .swagger-ui-wrap .markdown ul {
+  font-family: "Droid Sans", sans-serif;
+  margin: 5px 0 10px;
+  padding: 0 0 0 18px;
+  list-style-type: disc;
+}
+.swagger-section .swagger-ui-wrap form.form_box {
+  background-color: #ebf3f9;
+  border: 1px solid #c3d9ec;
+  padding: 10px;
+}
+.swagger-section .swagger-ui-wrap form.form_box label {
+  color: #0f6ab4 !important;
+}
+.swagger-section .swagger-ui-wrap form.form_box input[type=submit] {
+  display: block;
+  padding: 10px;
+}
+.swagger-section .swagger-ui-wrap form.form_box p.weak {
+  font-size: 0.8em;
+}
+.swagger-section .swagger-ui-wrap form.form_box p {
+  font-size: 0.9em;
+  padding: 0 0 15px;
+  color: #7e7b6d;
+}
+.swagger-section .swagger-ui-wrap form.form_box p a {
+  color: #646257;
+}
+.swagger-section .swagger-ui-wrap form.form_box p strong {
+  color: black;
+}
+.swagger-section .title {
+  font-style: bold;
+}
+.swagger-section .secondary_form {
+  display: none;
+}
+.swagger-section .main_image {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+.swagger-section .oauth_body {
+  margin-left: 100px;
+  margin-right: 100px;
+}
+.swagger-section .oauth_submit {
+  text-align: center;
+}
+.swagger-section .api-popup-dialog {
+  z-index: 10000;
+  position: absolute;
+  width: 500px;
+  background: #FFF;
+  padding: 20px;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+  display: none;
+  font-size: 13px;
+  color: #777;
+}
+.swagger-section .api-popup-dialog .api-popup-title {
+  font-size: 24px;
+  padding: 10px 0;
+}
+.swagger-section .api-popup-dialog .api-popup-title {
+  font-size: 24px;
+  padding: 10px 0;
+}
+.swagger-section .api-popup-dialog p.error-msg {
+  padding-left: 5px;
+  padding-bottom: 5px;
+}
+.swagger-section .api-popup-dialog button.api-popup-authbtn {
+  height: 30px;
+}
+.swagger-section .api-popup-dialog button.api-popup-cancel {
+  height: 30px;
+}
+.swagger-section .api-popup-scopes {
+  padding: 10px 20px;
+}
+.swagger-section .api-popup-scopes li {
+  padding: 5px 0;
+  line-height: 20px;
+}
+.swagger-section .api-popup-scopes .api-scope-desc {
+  padding-left: 20px;
+  font-style: italic;
+}
+.swagger-section .api-popup-scopes li input {
+  position: relative;
+  top: 2px;
+}
+.swagger-section .api-popup-actions {
+  padding-top: 10px;
+}
+.swagger-section .access {
+  float: right;
+}
+.swagger-section .auth {
+  float: right;
+}
+.swagger-section #api_information_panel {
+  position: absolute;
+  background: #FFF;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+  display: none;
+  font-size: 13px;
+  max-width: 300px;
+  line-height: 30px;
+  color: black;
+  padding: 5px;
+}
+.swagger-section #api_information_panel p .api-msg-enabled {
+  color: green;
+}
+.swagger-section #api_information_panel p .api-msg-disabled {
+  color: red;
+}
+.swagger-section .api-ic {
+  height: 18px;
+  vertical-align: middle;
+  display: inline-block;
+  background: url(../images/explorer_icons.png) no-repeat;
+}
+.swagger-section .ic-info {
+  background-position: 0 0;
+  width: 18px;
+  margin-top: -7px;
+  margin-left: 4px;
+}
+.swagger-section .ic-warning {
+  background-position: -60px 0;
+  width: 18px;
+  margin-top: -7px;
+  margin-left: 4px;
+}
+.swagger-section .ic-error {
+  background-position: -30px 0;
+  width: 18px;
+  margin-top: -7px;
+  margin-left: 4px;
+}
+.swagger-section .ic-off {
+  background-position: -90px 0;
+  width: 58px;
+  margin-top: -4px;
+  cursor: pointer;
+}
+.swagger-section .ic-on {
+  background-position: -160px 0;
+  width: 58px;
+  margin-top: -4px;
+  cursor: pointer;
+}
+.swagger-section #header {
+  background-color: #89bf04;
+  padding: 14px;
+}
+.swagger-section #header a#logo {
+  font-size: 1.5em;
+  font-weight: bold;
+  text-decoration: none;
+  background: transparent url(../images/logo_small.png) no-repeat left center;
+  padding: 20px 0 20px 40px;
+  color: white;
+}
+.swagger-section #header form#api_selector {
+  display: block;
+  clear: none;
+  float: right;
+}
+.swagger-section #header form#api_selector .input {
+  display: block;
+  clear: none;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.swagger-section #header form#api_selector .input input#input_apiKey {
+  width: 200px;
+}
+.swagger-section #header form#api_selector .input input#input_baseUrl {
+  width: 400px;
+}
+.swagger-section #header form#api_selector .input a#explore {
+  display: block;
+  text-decoration: none;
+  font-weight: bold;
+  padding: 6px 8px;
+  font-size: 0.9em;
+  color: white;
+  background-color: #547f00;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  -o-border-radius: 4px;
+  -ms-border-radius: 4px;
+  -khtml-border-radius: 4px;
+  border-radius: 4px;
+}
+.swagger-section #header form#api_selector .input a#explore:hover {
+  background-color: #547f00;
+}
+.swagger-section #header form#api_selector .input input {
+  font-size: 0.9em;
+  padding: 3px;
+  margin: 0;
+}
+.swagger-section #content_message {
+  margin: 10px 15px;
+  font-style: italic;
+  color: #999999;
+}
+.swagger-section #message-bar {
+  min-height: 30px;
+  text-align: center;
+  padding-top: 10px;
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/index.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/index.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/index.html	(revision 5961)
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Swagger UI</title>
+  <link href='//fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'/>
+  <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
+  <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
+  <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
+  <link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>
+  <script type="text/javascript" src="lib/shred.bundle.js"></script>
+  <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
+  <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
+  <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
+  <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
+  <script src='lib/handlebars-1.0.0.js' type='text/javascript'></script>
+  <script src='lib/underscore-min.js' type='text/javascript'></script>
+  <script src='lib/backbone-min.js' type='text/javascript'></script>
+  <script src='lib/swagger.js' type='text/javascript'></script>
+  <script src='lib/swagger-client.js' type='text/javascript'></script>
+  <script src='swagger-ui.js' type='text/javascript'></script>
+  <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
+
+  <!-- enabling this will enable oauth2 implicit scope support -->
+  <script src='lib/swagger-oauth.js' type='text/javascript'></script>
+  <script type="text/javascript">
+    $(function () {
+      var url = window.location.search.match(/url=([^&]+)/);
+      if (url && url.length > 1) {
+        url = url[1];
+      } else {
+        url = "../../rest/api-docs";
+      }
+      window.swaggerUi = new SwaggerUi({
+        url: url,
+        dom_id: "swagger-ui-container",
+        supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
+        onComplete: function(swaggerApi, swaggerUi){
+          log("Loaded SwaggerUI");
+          if(typeof initOAuth == "function") {
+            /*
+            initOAuth({
+              clientId: "your-client-id",
+              realm: "your-realms",
+              appName: "your-app-name"
+            });
+            */
+          }
+          $('pre code').each(function(i, e) {
+            hljs.highlightBlock(e)
+          });
+        },
+        onFailure: function(data) {
+          log("Unable to Load SwaggerUI");
+        },
+        docExpansion: "none",
+        sorter : "alpha"
+      });
+
+      function addApiKeyAuthorization() {
+        var key = $('#input_apiKey')[0].value;
+        log("key: " + key);
+        if(key && key.trim() != "") {
+            log("added key " + key);
+            window.authorizations.add("api_key", new ApiKeyAuthorization("api_key", key, "query"));
+        }
+      }
+
+      $('#input_apiKey').change(function() {
+        addApiKeyAuthorization();
+      });
+
+      // if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
+      /*
+        var apiKey = "myApiKeyXXXX123456789";
+        $('#input_apiKey').val(apiKey);
+        addApiKeyAuthorization();
+      */
+
+      window.swaggerUi.load();
+  });
+  </script>
+</head>
+
+<body class="swagger-section">
+<div id='header'>
+  <div class="swagger-ui-wrap">
+    <a id="logo" href="http://swagger.io">Component Registry REST service</a>
+<!--    <form id='api_selector'>
+      <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
+      <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
+      <div class='input'><a id="explore" href="#">Explore</a></div>
+    </form>-->
+  </div>
+</div>
+
+<div id="message-bar" class="swagger-ui-wrap">&nbsp;</div>
+<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
+</body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/backbone-min.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/backbone-min.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/backbone-min.js	(revision 5961)
@@ -0,0 +1,38 @@
+// Backbone.js 0.9.2
+
+// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Backbone may be freely distributed under the MIT license.
+// For all details and documentation:
+// http://backbonejs.org
+(function(){var l=this,y=l.Backbone,z=Array.prototype.slice,A=Array.prototype.splice,g;g="undefined"!==typeof exports?exports:l.Backbone={};g.VERSION="0.9.2";var f=l._;!f&&"undefined"!==typeof require&&(f=require("underscore"));var i=l.jQuery||l.Zepto||l.ender;g.setDomLibrary=function(a){i=a};g.noConflict=function(){l.Backbone=y;return this};g.emulateHTTP=!1;g.emulateJSON=!1;var p=/\s+/,k=g.Events={on:function(a,b,c){var d,e,f,g,j;if(!b)return this;a=a.split(p);for(d=this._callbacks||(this._callbacks=
+{});e=a.shift();)f=(j=d[e])?j.tail:{},f.next=g={},f.context=c,f.callback=b,d[e]={tail:g,next:j?j.next:f};return this},off:function(a,b,c){var d,e,h,g,j,q;if(e=this._callbacks){if(!a&&!b&&!c)return delete this._callbacks,this;for(a=a?a.split(p):f.keys(e);d=a.shift();)if(h=e[d],delete e[d],h&&(b||c))for(g=h.tail;(h=h.next)!==g;)if(j=h.callback,q=h.context,b&&j!==b||c&&q!==c)this.on(d,j,q);return this}},trigger:function(a){var b,c,d,e,f,g;if(!(d=this._callbacks))return this;f=d.all;a=a.split(p);for(g=
+z.call(arguments,1);b=a.shift();){if(c=d[b])for(e=c.tail;(c=c.next)!==e;)c.callback.apply(c.context||this,g);if(c=f){e=c.tail;for(b=[b].concat(g);(c=c.next)!==e;)c.callback.apply(c.context||this,b)}}return this}};k.bind=k.on;k.unbind=k.off;var o=g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=n(this,"defaults"))a=f.extend({},c,a);b&&b.collection&&(this.collection=b.collection);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.changed={};this._silent=
+{};this._pending={};this.set(a,{silent:!0});this.changed={};this._silent={};this._pending={};this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(o.prototype,k,{changed:null,_silent:null,_pending:null,idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.get(a);return this._escapedAttributes[a]=f.escape(null==
+b?"":""+b)},has:function(a){return null!=this.get(a)},set:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;d instanceof o&&(d=d.attributes);if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return!1;this.idAttribute in d&&(this.id=d[this.idAttribute]);var b=c.changes={},h=this.attributes,g=this._escapedAttributes,j=this._previousAttributes||{};for(e in d){a=d[e];if(!f.isEqual(h[e],a)||c.unset&&f.has(h,e))delete g[e],(c.silent?this._silent:
+b)[e]=!0;c.unset?delete h[e]:h[e]=a;!f.isEqual(j[e],a)||f.has(h,e)!=f.has(j,e)?(this.changed[e]=a,c.silent||(this._pending[e]=!0)):(delete this.changed[e],delete this._pending[e])}c.silent||this.change(c);return this},unset:function(a,b){(b||(b={})).unset=!0;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=!0;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=a?f.clone(a):{},b=this,c=a.success;a.success=function(d,e,f){if(!b.set(b.parse(d,f),a))return!1;c&&c(b,d)};
+a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};if(c.wait){if(!this._validate(d,c))return!1;e=f.clone(this.attributes)}a=f.extend({},c,{silent:!0});if(d&&!this.set(d,c.wait?a:c))return!1;var h=this,i=c.success;c.success=function(a,b,e){b=h.parse(a,e);if(c.wait){delete c.wait;b=f.extend(d||{},b)}if(!h.set(b,c))return false;i?i(h,a):h.trigger("sync",h,a,c)};c.error=g.wrapError(c.error,
+h,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d(),!1;a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=n(this,"urlRoot")||n(this.collection,"url")||t();
+return this.isNew()?a:a+("/"==a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return null==this.id},change:function(a){a||(a={});var b=this._changing;this._changing=!0;for(var c in this._silent)this._pending[c]=!0;var d=f.extend({},a.changes,this._silent);this._silent={};for(c in d)this.trigger("change:"+c,this,this.get(c),a);if(b)return this;for(;!f.isEmpty(this._pending);){this._pending=
+{};this.trigger("change",this,a);for(c in this.changed)!this._pending[c]&&!this._silent[c]&&delete this.changed[c];this._previousAttributes=f.clone(this.attributes)}this._changing=!1;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this.changed):f.has(this.changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this.changed):!1;var b,c=!1,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||
+!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return!0;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return!0;b&&b.error?b.error(this,c,b):this.trigger("error",this,c,b);return!1}});var r=g.Collection=function(a,b){b||(b={});b.model&&(this.model=b.model);b.comparator&&(this.comparator=b.comparator);
+this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:!0,parse:b.parse})};f.extend(r.prototype,k,{model:o,initialize:function(){},toJSON:function(a){return this.map(function(b){return b.toJSON(a)})},add:function(a,b){var c,d,e,g,i,j={},k={},l=[];b||(b={});a=f.isArray(a)?a.slice():[a];c=0;for(d=a.length;c<d;c++){if(!(e=a[c]=this._prepareModel(a[c],b)))throw Error("Can't add an invalid model to a collection");g=e.cid;i=e.id;j[g]||this._byCid[g]||null!=i&&(k[i]||this._byId[i])?
+l.push(c):j[g]=k[i]=e}for(c=l.length;c--;)a.splice(l[c],1);c=0;for(d=a.length;c<d;c++)(e=a[c]).on("all",this._onModelEvent,this),this._byCid[e.cid]=e,null!=e.id&&(this._byId[e.id]=e);this.length+=d;A.apply(this.models,[null!=b.at?b.at:this.models.length,0].concat(a));this.comparator&&this.sort({silent:!0});if(b.silent)return this;c=0;for(d=this.models.length;c<d;c++)if(j[(e=this.models[c]).cid])b.index=c,e.trigger("add",e,this,b);return this},remove:function(a,b){var c,d,e,g;b||(b={});a=f.isArray(a)?
+a.slice():[a];c=0;for(d=a.length;c<d;c++)if(g=this.getByCid(a[c])||this.get(a[c]))delete this._byId[g.id],delete this._byCid[g.cid],e=this.indexOf(g),this.models.splice(e,1),this.length--,b.silent||(b.index=e,g.trigger("remove",g,this,b)),this._removeReference(g);return this},push:function(a,b){a=this._prepareModel(a,b);this.add(a,b);return a},pop:function(a){var b=this.at(this.length-1);this.remove(b,a);return b},unshift:function(a,b){a=this._prepareModel(a,b);this.add(a,f.extend({at:0},b));return a},
+shift:function(a){var b=this.at(0);this.remove(b,a);return b},get:function(a){return null==a?void 0:this._byId[null!=a.id?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},where:function(a){return f.isEmpty(a)?[]:this.filter(function(b){for(var c in a)if(a[c]!==b.get(c))return!1;return!0})},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");var b=f.bind(this.comparator,this);1==this.comparator.length?
+this.models=this.sortBy(b):this.models.sort(b);a.silent||this.trigger("reset",this,a);return this},pluck:function(a){return f.map(this.models,function(b){return b.get(a)})},reset:function(a,b){a||(a=[]);b||(b={});for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);this._reset();this.add(a,f.extend({silent:!0},b));b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=this,c=a.success;a.success=function(d,
+e,f){b[a.add?"add":"reset"](b.parse(d,f),a);c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},create:function(a,b){var c=this,b=b?f.clone(b):{},a=this._prepareModel(a,b);if(!a)return!1;b.wait||c.add(a,b);var d=b.success;b.success=function(e,f){b.wait&&c.add(e,b);d?d(e,f):e.trigger("sync",a,f,b)};a.save(null,b);return a},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId=
+{};this._byCid={}},_prepareModel:function(a,b){b||(b={});a instanceof o?a.collection||(a.collection=this):(b.collection=this,a=new this.model(a,b),a._validate(a.attributes,b)||(a=!1));return a},_removeReference:function(a){this==a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,b,c,d){("add"==a||"remove"==a)&&c!=this||("destroy"==a&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],this._byId[b.id]=b),this.trigger.apply(this,
+arguments))}});f.each("forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split(","),function(a){r.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});var u=g.Router=function(a){a||(a={});a.routes&&(this.routes=a.routes);this._bindRoutes();this.initialize.apply(this,arguments)},B=/:\w+/g,
+C=/\*\w+/g,D=/[-[\]{}()+?.,\\^$|#\s]/g;f.extend(u.prototype,k,{initialize:function(){},route:function(a,b,c){g.history||(g.history=new m);f.isRegExp(a)||(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d));g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b)},_bindRoutes:function(){if(this.routes){var a=[],b;for(b in this.routes)a.unshift([b,
+this.routes[b]]);b=0;for(var c=a.length;b<c;b++)this.route(a[b][0],a[b][1],this[a[b][1]])}},_routeToRegExp:function(a){a=a.replace(D,"\\$&").replace(B,"([^/]+)").replace(C,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});var m=g.History=function(){this.handlers=[];f.bindAll(this,"checkUrl")},s=/^[#\/]/,E=/msie [\w.]+/;m.started=!1;f.extend(m.prototype,k,{interval:50,getHash:function(a){return(a=(a?a.location:window.location).href.match(/#(.*)$/))?a[1]:
+""},getFragment:function(a,b){if(null==a)if(this._hasPushState||b){var a=window.location.pathname,c=window.location.search;c&&(a+=c)}else a=this.getHash();a.indexOf(this.options.root)||(a=a.substr(this.options.root.length));return a.replace(s,"")},start:function(a){if(m.started)throw Error("Backbone.history has already been started");m.started=!0;this.options=f.extend({},{root:"/"},this.options,a);this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=
+!(!this.options.pushState||!window.history||!window.history.pushState);var a=this.getFragment(),b=document.documentMode;if(b=E.exec(navigator.userAgent.toLowerCase())&&(!b||7>=b))this.iframe=i('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a);this._hasPushState?i(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!b?i(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,
+this.interval));this.fragment=a;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),window.location.replace(this.options.root+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&b&&a.hash&&(this.fragment=this.getHash().replace(s,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment));if(!this.options.silent)return this.loadUrl()},
+stop:function(){i(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);m.started=!1},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.getHash(this.iframe)));if(a==this.fragment)return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,
+function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){if(!m.started)return!1;if(!b||!0===b)b={trigger:b};var c=(a||"").replace(s,"");this.fragment!=c&&(this._hasPushState?(0!=c.indexOf(this.options.root)&&(c=this.options.root+c),this.fragment=c,window.history[b.replace?"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.getHash(this.iframe))&&(b.replace||
+this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a))},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,"")+"#"+b):a.hash=b}});var v=g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},F=/^(\S+)\s*(.*)$/,w="model,collection,el,id,attributes,className,tagName".split(",");
+f.extend(v.prototype,k,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);b&&i(a).attr(b);c&&i(a).html(c);return a},setElement:function(a,b){this.$el&&this.undelegateEvents();this.$el=a instanceof i?a:i(a);this.el=this.$el[0];!1!==b&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=n(this,"events"))){this.undelegateEvents();
+for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Method "'+a[b]+'" does not exist');var d=b.match(F),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);""===d?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=w.length;b<c;b++){var d=w[b];a[d]&&(this[d]=a[d])}this.options=a},_ensureElement:function(){if(this.el)this.setElement(this.el,
+!1);else{var a=n(this,"attributes")||{};this.id&&(a.id=this.id);this.className&&(a["class"]=this.className);this.setElement(this.make(this.tagName,a),!1)}}});o.extend=r.extend=u.extend=v.extend=function(a,b){var c=G(this,a,b);c.extend=this.extend;return c};var H={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=H[a];c||(c={});var e={type:d,dataType:"json"};c.url||(e.url=n(b,"url")||t());if(!c.data&&b&&("create"==a||"update"==a))e.contentType="application/json",
+e.data=JSON.stringify(b.toJSON());g.emulateJSON&&(e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{});if(g.emulateHTTP&&("PUT"===d||"DELETE"===d))g.emulateJSON&&(e.data._method=d),e.type="POST",e.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",d)};"GET"!==e.type&&!g.emulateJSON&&(e.processData=!1);return i.ajax(f.extend(e,c))};g.wrapError=function(a,b,c){return function(d,e){e=d===b?e:d;a?a(b,e,c):b.trigger("error",b,e,c)}};var x=function(){},G=function(a,
+b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};f.extend(d,a);x.prototype=a.prototype;d.prototype=new x;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},n=function(a,b){return!a||!a[b]?null:f.isFunction(a[b])?a[b]():a[b]},t=function(){throw Error('A "url" property or function must be specified');}}).call(this);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/handlebars-1.0.0.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/handlebars-1.0.0.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/handlebars-1.0.0.js	(revision 5961)
@@ -0,0 +1,2278 @@
+/*
+
+Copyright (C) 2011 by Yehuda Katz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+
+// lib/handlebars/browser-prefix.js
+var Handlebars = {};
+
+(function(Handlebars, undefined) {
+;
+// lib/handlebars/base.js
+
+Handlebars.VERSION = "1.0.0";
+Handlebars.COMPILER_REVISION = 4;
+
+Handlebars.REVISION_CHANGES = {
+  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
+  2: '== 1.0.0-rc.3',
+  3: '== 1.0.0-rc.4',
+  4: '>= 1.0.0'
+};
+
+Handlebars.helpers  = {};
+Handlebars.partials = {};
+
+var toString = Object.prototype.toString,
+    functionType = '[object Function]',
+    objectType = '[object Object]';
+
+Handlebars.registerHelper = function(name, fn, inverse) {
+  if (toString.call(name) === objectType) {
+    if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
+    Handlebars.Utils.extend(this.helpers, name);
+  } else {
+    if (inverse) { fn.not = inverse; }
+    this.helpers[name] = fn;
+  }
+};
+
+Handlebars.registerPartial = function(name, str) {
+  if (toString.call(name) === objectType) {
+    Handlebars.Utils.extend(this.partials,  name);
+  } else {
+    this.partials[name] = str;
+  }
+};
+
+Handlebars.registerHelper('helperMissing', function(arg) {
+  if(arguments.length === 2) {
+    return undefined;
+  } else {
+    throw new Error("Missing helper: '" + arg + "'");
+  }
+});
+
+Handlebars.registerHelper('blockHelperMissing', function(context, options) {
+  var inverse = options.inverse || function() {}, fn = options.fn;
+
+  var type = toString.call(context);
+
+  if(type === functionType) { context = context.call(this); }
+
+  if(context === true) {
+    return fn(this);
+  } else if(context === false || context == null) {
+    return inverse(this);
+  } else if(type === "[object Array]") {
+    if(context.length > 0) {
+      return Handlebars.helpers.each(context, options);
+    } else {
+      return inverse(this);
+    }
+  } else {
+    return fn(context);
+  }
+});
+
+Handlebars.K = function() {};
+
+Handlebars.createFrame = Object.create || function(object) {
+  Handlebars.K.prototype = object;
+  var obj = new Handlebars.K();
+  Handlebars.K.prototype = null;
+  return obj;
+};
+
+Handlebars.logger = {
+  DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,
+
+  methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'},
+
+  // can be overridden in the host environment
+  log: function(level, obj) {
+    if (Handlebars.logger.level <= level) {
+      var method = Handlebars.logger.methodMap[level];
+      if (typeof console !== 'undefined' && console[method]) {
+        console[method].call(console, obj);
+      }
+    }
+  }
+};
+
+Handlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); };
+
+Handlebars.registerHelper('each', function(context, options) {
+  var fn = options.fn, inverse = options.inverse;
+  var i = 0, ret = "", data;
+
+  var type = toString.call(context);
+  if(type === functionType) { context = context.call(this); }
+
+  if (options.data) {
+    data = Handlebars.createFrame(options.data);
+  }
+
+  if(context && typeof context === 'object') {
+    if(context instanceof Array){
+      for(var j = context.length; i<j; i++) {
+        if (data) { data.index = i; }
+        ret = ret + fn(context[i], { data: data });
+      }
+    } else {
+      for(var key in context) {
+        if(context.hasOwnProperty(key)) {
+          if(data) { data.key = key; }
+          ret = ret + fn(context[key], {data: data});
+          i++;
+        }
+      }
+    }
+  }
+
+  if(i === 0){
+    ret = inverse(this);
+  }
+
+  return ret;
+});
+
+Handlebars.registerHelper('if', function(conditional, options) {
+  var type = toString.call(conditional);
+  if(type === functionType) { conditional = conditional.call(this); }
+
+  if(!conditional || Handlebars.Utils.isEmpty(conditional)) {
+    return options.inverse(this);
+  } else {
+    return options.fn(this);
+  }
+});
+
+Handlebars.registerHelper('unless', function(conditional, options) {
+  return Handlebars.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn});
+});
+
+Handlebars.registerHelper('with', function(context, options) {
+  var type = toString.call(context);
+  if(type === functionType) { context = context.call(this); }
+
+  if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
+});
+
+Handlebars.registerHelper('log', function(context, options) {
+  var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
+  Handlebars.log(level, context);
+});
+;
+// lib/handlebars/compiler/parser.js
+/* Jison generated parser */
+var handlebars = (function(){
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"root":3,"program":4,"EOF":5,"simpleInverse":6,"statements":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"CLOSE_UNESCAPED":24,"OPEN_PARTIAL":25,"partialName":26,"params":27,"hash":28,"dataName":29,"param":30,"STRING":31,"INTEGER":32,"BOOLEAN":33,"hashSegments":34,"hashSegment":35,"ID":36,"EQUALS":37,"DATA":38,"pathSegments":39,"SEP":40,"$accept":0,"$end":1},
+terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"CLOSE_UNESCAPED",25:"OPEN_PARTIAL",31:"STRING",32:"INTEGER",33:"BOOLEAN",36:"ID",37:"EQUALS",38:"DATA",40:"SEP"},
+productions_: [0,[3,2],[4,2],[4,3],[4,2],[4,1],[4,1],[4,0],[7,1],[7,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[6,2],[17,3],[17,2],[17,2],[17,1],[17,1],[27,2],[27,1],[30,1],[30,1],[30,1],[30,1],[30,1],[28,1],[34,2],[34,1],[35,3],[35,3],[35,3],[35,3],[35,3],[26,1],[26,1],[26,1],[29,2],[21,1],[39,3],[39,1]],
+performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1: return $$[$0-1]; 
+break;
+case 2: this.$ = new yy.ProgramNode([], $$[$0]); 
+break;
+case 3: this.$ = new yy.ProgramNode($$[$0-2], $$[$0]); 
+break;
+case 4: this.$ = new yy.ProgramNode($$[$0-1], []); 
+break;
+case 5: this.$ = new yy.ProgramNode($$[$0]); 
+break;
+case 6: this.$ = new yy.ProgramNode([], []); 
+break;
+case 7: this.$ = new yy.ProgramNode([]); 
+break;
+case 8: this.$ = [$$[$0]]; 
+break;
+case 9: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; 
+break;
+case 10: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1].inverse, $$[$0-1], $$[$0]); 
+break;
+case 11: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0-1].inverse, $$[$0]); 
+break;
+case 12: this.$ = $$[$0]; 
+break;
+case 13: this.$ = $$[$0]; 
+break;
+case 14: this.$ = new yy.ContentNode($$[$0]); 
+break;
+case 15: this.$ = new yy.CommentNode($$[$0]); 
+break;
+case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]); 
+break;
+case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]); 
+break;
+case 18: this.$ = $$[$0-1]; 
+break;
+case 19:
+    // Parsing out the '&' escape token at this level saves ~500 bytes after min due to the removal of one parser node.
+    this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], $$[$0-2][2] === '&');
+  
+break;
+case 20: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true); 
+break;
+case 21: this.$ = new yy.PartialNode($$[$0-1]); 
+break;
+case 22: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1]); 
+break;
+case 23: 
+break;
+case 24: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]]; 
+break;
+case 25: this.$ = [[$$[$0-1]].concat($$[$0]), null]; 
+break;
+case 26: this.$ = [[$$[$0-1]], $$[$0]]; 
+break;
+case 27: this.$ = [[$$[$0]], null]; 
+break;
+case 28: this.$ = [[$$[$0]], null]; 
+break;
+case 29: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; 
+break;
+case 30: this.$ = [$$[$0]]; 
+break;
+case 31: this.$ = $$[$0]; 
+break;
+case 32: this.$ = new yy.StringNode($$[$0]); 
+break;
+case 33: this.$ = new yy.IntegerNode($$[$0]); 
+break;
+case 34: this.$ = new yy.BooleanNode($$[$0]); 
+break;
+case 35: this.$ = $$[$0]; 
+break;
+case 36: this.$ = new yy.HashNode($$[$0]); 
+break;
+case 37: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; 
+break;
+case 38: this.$ = [$$[$0]]; 
+break;
+case 39: this.$ = [$$[$0-2], $$[$0]]; 
+break;
+case 40: this.$ = [$$[$0-2], new yy.StringNode($$[$0])]; 
+break;
+case 41: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])]; 
+break;
+case 42: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])]; 
+break;
+case 43: this.$ = [$$[$0-2], $$[$0]]; 
+break;
+case 44: this.$ = new yy.PartialNameNode($$[$0]); 
+break;
+case 45: this.$ = new yy.PartialNameNode(new yy.StringNode($$[$0])); 
+break;
+case 46: this.$ = new yy.PartialNameNode(new yy.IntegerNode($$[$0])); 
+break;
+case 47: this.$ = new yy.DataNode($$[$0]); 
+break;
+case 48: this.$ = new yy.IdNode($$[$0]); 
+break;
+case 49: $$[$0-2].push({part: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2]; 
+break;
+case 50: this.$ = [{part: $$[$0]}]; 
+break;
+}
+},
+table: [{3:1,4:2,5:[2,7],6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],22:[1,14],23:[1,15],25:[1,16]},{1:[3]},{5:[1,17]},{5:[2,6],7:18,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,6],22:[1,14],23:[1,15],25:[1,16]},{5:[2,5],6:20,8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,5],22:[1,14],23:[1,15],25:[1,16]},{17:23,18:[1,22],21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],25:[2,8]},{4:29,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{4:30,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],25:[2,12]},{5:[2,13],14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],25:[2,13]},{5:[2,14],14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],25:[2,14]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],25:[2,15]},{17:31,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:32,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:33,21:24,29:25,36:[1,28],38:[1,27],39:26},{21:35,26:34,31:[1,36],32:[1,37],36:[1,28],39:26},{1:[2,1]},{5:[2,2],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,2],22:[1,14],23:[1,15],25:[1,16]},{17:23,21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,4],7:38,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,4],22:[1,14],23:[1,15],25:[1,16]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],25:[2,9]},{5:[2,23],14:[2,23],15:[2,23],16:[2,23],19:[2,23],20:[2,23],22:[2,23],23:[2,23],25:[2,23]},{18:[1,39]},{18:[2,27],21:44,24:[2,27],27:40,28:41,29:48,30:42,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,28],24:[2,28]},{18:[2,48],24:[2,48],31:[2,48],32:[2,48],33:[2,48],36:[2,48],38:[2,48],40:[1,51]},{21:52,36:[1,28],39:26},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],38:[2,50],40:[2,50]},{10:53,20:[1,54]},{10:55,20:[1,54]},{18:[1,56]},{18:[1,57]},{24:[1,58]},{18:[1,59],21:60,36:[1,28],39:26},{18:[2,44],36:[2,44]},{18:[2,45],36:[2,45]},{18:[2,46],36:[2,46]},{5:[2,3],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,3],22:[1,14],23:[1,15],25:[1,16]},{14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],25:[2,17]},{18:[2,25],21:44,24:[2,25],28:61,29:48,30:62,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,26],24:[2,26]},{18:[2,30],24:[2,30],31:[2,30],32:[2,30],33:[2,30],36:[2,30],38:[2,30]},{18:[2,36],24:[2,36],35:63,36:[1,64]},{18:[2,31],24:[2,31],31:[2,31],32:[2,31],33:[2,31],36:[2,31],38:[2,31]},{18:[2,32],24:[2,32],31:[2,32],32:[2,32],33:[2,32],36:[2,32],38:[2,32]},{18:[2,33],24:[2,33],31:[2,33],32:[2,33],33:[2,33],36:[2,33],38:[2,33]},{18:[2,34],24:[2,34],31:[2,34],32:[2,34],33:[2,34],36:[2,34],38:[2,34]},{18:[2,35],24:[2,35],31:[2,35],32:[2,35],33:[2,35],36:[2,35],38:[2,35]},{18:[2,38],24:[2,38],36:[2,38]},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],37:[1,65],38:[2,50],40:[2,50]},{36:[1,66]},{18:[2,47],24:[2,47],31:[2,47],32:[2,47],33:[2,47],36:[2,47],38:[2,47]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],25:[2,10]},{21:67,36:[1,28],39:26},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],25:[2,11]},{14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],25:[2,16]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],25:[2,19]},{5:[2,20],14:[2,20],15:[2,20],16:[2,20],19:[2,20],20:[2,20],22:[2,20],23:[2,20],25:[2,20]},{5:[2,21],14:[2,21],15:[2,21],16:[2,21],19:[2,21],20:[2,21],22:[2,21],23:[2,21],25:[2,21]},{18:[1,68]},{18:[2,24],24:[2,24]},{18:[2,29],24:[2,29],31:[2,29],32:[2,29],33:[2,29],36:[2,29],38:[2,29]},{18:[2,37],24:[2,37],36:[2,37]},{37:[1,65]},{21:69,29:73,31:[1,70],32:[1,71],33:[1,72],36:[1,28],38:[1,27],39:26},{18:[2,49],24:[2,49],31:[2,49],32:[2,49],33:[2,49],36:[2,49],38:[2,49],40:[2,49]},{18:[1,74]},{5:[2,22],14:[2,22],15:[2,22],16:[2,22],19:[2,22],20:[2,22],22:[2,22],23:[2,22],25:[2,22]},{18:[2,39],24:[2,39],36:[2,39]},{18:[2,40],24:[2,40],36:[2,40]},{18:[2,41],24:[2,41],36:[2,41]},{18:[2,42],24:[2,42],36:[2,42]},{18:[2,43],24:[2,43],36:[2,43]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],25:[2,18]}],
+defaultActions: {17:[2,1]},
+parseError: function parseError(str, hash) {
+    throw new Error(str);
+},
+parse: function parse(input) {
+    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    this.lexer.setInput(input);
+    this.lexer.yy = this.yy;
+    this.yy.lexer = this.lexer;
+    this.yy.parser = this;
+    if (typeof this.lexer.yylloc == "undefined")
+        this.lexer.yylloc = {};
+    var yyloc = this.lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = this.lexer.options && this.lexer.options.ranges;
+    if (typeof this.yy.parseError === "function")
+        this.parseError = this.yy.parseError;
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+    function lex() {
+        var token;
+        token = self.lexer.lex() || 1;
+        if (typeof token !== "number") {
+            token = self.symbols_[token] || token;
+        }
+        return token;
+    }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == "undefined") {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === "undefined" || !action.length || !action[0]) {
+            var errStr = "";
+            if (!recovering) {
+                expected = [];
+                for (p in table[state])
+                    if (this.terminals_[p] && p > 2) {
+                        expected.push("'" + this.terminals_[p] + "'");
+                    }
+                if (this.lexer.showPosition) {
+                    errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
+                } else {
+                    errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
+                }
+                this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
+            }
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(this.lexer.yytext);
+            lstack.push(this.lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = this.lexer.yyleng;
+                yytext = this.lexer.yytext;
+                yylineno = this.lexer.yylineno;
+                yyloc = this.lexer.yylloc;
+                if (recovering > 0)
+                    recovering--;
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
+            if (ranges) {
+                yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+            }
+            r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
+            if (typeof r !== "undefined") {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}
+};
+/* Jison generated lexer */
+var lexer = (function(){
+var lexer = ({EOF:1,
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+setInput:function (input) {
+        this._input = input;
+        this._more = this._less = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
+        if (this.options.ranges) this.yylloc.range = [0,0];
+        this.offset = 0;
+        return this;
+    },
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) this.yylloc.range[1]++;
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length-len-1);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length-1);
+        this.matched = this.matched.substr(0, this.matched.length-1);
+
+        if (lines.length-1) this.yylineno -= lines.length-1;
+        var r = this.yylloc.range;
+
+        this.yylloc = {first_line: this.yylloc.first_line,
+          last_line: this.yylineno+1,
+          first_column: this.yylloc.first_column,
+          last_column: lines ?
+              (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length:
+              this.yylloc.first_column - len
+          };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        return this;
+    },
+more:function () {
+        this._more = true;
+        return this;
+    },
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
+    },
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c+"^";
+    },
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) this.done = true;
+
+        var token,
+            match,
+            tempMatch,
+            index,
+            col,
+            lines;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i=0;i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (!this.options.flex) break;
+            }
+        }
+        if (match) {
+            lines = match[0].match(/(?:\r\n?|\n).*/g);
+            if (lines) this.yylineno += lines.length;
+            this.yylloc = {first_line: this.yylloc.last_line,
+                           last_line: this.yylineno+1,
+                           first_column: this.yylloc.last_column,
+                           last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length};
+            this.yytext += match[0];
+            this.match += match[0];
+            this.matches = match;
+            this.yyleng = this.yytext.length;
+            if (this.options.ranges) {
+                this.yylloc.range = [this.offset, this.offset += this.yyleng];
+            }
+            this._more = false;
+            this._input = this._input.slice(match[0].length);
+            this.matched += match[0];
+            token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
+            if (this.done && this._input) this.done = false;
+            if (token) return token;
+            else return;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
+                    {text: "", token: null, line: this.yylineno});
+        }
+    },
+lex:function lex() {
+        var r = this.next();
+        if (typeof r !== 'undefined') {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+popState:function popState() {
+        return this.conditionStack.pop();
+    },
+_currentRules:function _currentRules() {
+        return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
+    },
+topState:function () {
+        return this.conditionStack[this.conditionStack.length-2];
+    },
+pushState:function begin(condition) {
+        this.begin(condition);
+    }});
+lexer.options = {};
+lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+
+var YYSTATE=YY_START
+switch($avoiding_name_collisions) {
+case 0: yy_.yytext = "\\"; return 14; 
+break;
+case 1:
+                                   if(yy_.yytext.slice(-1) !== "\\") this.begin("mu");
+                                   if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu");
+                                   if(yy_.yytext) return 14;
+                                 
+break;
+case 2: return 14; 
+break;
+case 3:
+                                   if(yy_.yytext.slice(-1) !== "\\") this.popState();
+                                   if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1);
+                                   return 14;
+                                 
+break;
+case 4: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15; 
+break;
+case 5: return 25; 
+break;
+case 6: return 16; 
+break;
+case 7: return 20; 
+break;
+case 8: return 19; 
+break;
+case 9: return 19; 
+break;
+case 10: return 23; 
+break;
+case 11: return 22; 
+break;
+case 12: this.popState(); this.begin('com'); 
+break;
+case 13: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; 
+break;
+case 14: return 22; 
+break;
+case 15: return 37; 
+break;
+case 16: return 36; 
+break;
+case 17: return 36; 
+break;
+case 18: return 40; 
+break;
+case 19: /*ignore whitespace*/ 
+break;
+case 20: this.popState(); return 24; 
+break;
+case 21: this.popState(); return 18; 
+break;
+case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 31; 
+break;
+case 23: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 31; 
+break;
+case 24: return 38; 
+break;
+case 25: return 33; 
+break;
+case 26: return 33; 
+break;
+case 27: return 32; 
+break;
+case 28: return 36; 
+break;
+case 29: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 36; 
+break;
+case 30: return 'INVALID'; 
+break;
+case 31: return 5; 
+break;
+}
+};
+lexer.rules = [/^(?:\\\\(?=(\{\{)))/,/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[}\/ ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:-?[0-9]+(?=[}\s]))/,/^(?:[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
+lexer.conditions = {"mu":{"rules":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],"inclusive":false},"emu":{"rules":[3],"inclusive":false},"com":{"rules":[4],"inclusive":false},"INITIAL":{"rules":[0,1,2,31],"inclusive":true}};
+return lexer;})()
+parser.lexer = lexer;
+function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();;
+// lib/handlebars/compiler/base.js
+
+Handlebars.Parser = handlebars;
+
+Handlebars.parse = function(input) {
+
+  // Just return if an already-compile AST was passed in.
+  if(input.constructor === Handlebars.AST.ProgramNode) { return input; }
+
+  Handlebars.Parser.yy = Handlebars.AST;
+  return Handlebars.Parser.parse(input);
+};
+;
+// lib/handlebars/compiler/ast.js
+Handlebars.AST = {};
+
+Handlebars.AST.ProgramNode = function(statements, inverse) {
+  this.type = "program";
+  this.statements = statements;
+  if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); }
+};
+
+Handlebars.AST.MustacheNode = function(rawParams, hash, unescaped) {
+  this.type = "mustache";
+  this.escaped = !unescaped;
+  this.hash = hash;
+
+  var id = this.id = rawParams[0];
+  var params = this.params = rawParams.slice(1);
+
+  // a mustache is an eligible helper if:
+  // * its id is simple (a single part, not `this` or `..`)
+  var eligibleHelper = this.eligibleHelper = id.isSimple;
+
+  // a mustache is definitely a helper if:
+  // * it is an eligible helper, and
+  // * it has at least one parameter or hash segment
+  this.isHelper = eligibleHelper && (params.length || hash);
+
+  // if a mustache is an eligible helper but not a definite
+  // helper, it is ambiguous, and will be resolved in a later
+  // pass or at runtime.
+};
+
+Handlebars.AST.PartialNode = function(partialName, context) {
+  this.type         = "partial";
+  this.partialName  = partialName;
+  this.context      = context;
+};
+
+Handlebars.AST.BlockNode = function(mustache, program, inverse, close) {
+  var verifyMatch = function(open, close) {
+    if(open.original !== close.original) {
+      throw new Handlebars.Exception(open.original + " doesn't match " + close.original);
+    }
+  };
+
+  verifyMatch(mustache.id, close);
+  this.type = "block";
+  this.mustache = mustache;
+  this.program  = program;
+  this.inverse  = inverse;
+
+  if (this.inverse && !this.program) {
+    this.isInverse = true;
+  }
+};
+
+Handlebars.AST.ContentNode = function(string) {
+  this.type = "content";
+  this.string = string;
+};
+
+Handlebars.AST.HashNode = function(pairs) {
+  this.type = "hash";
+  this.pairs = pairs;
+};
+
+Handlebars.AST.IdNode = function(parts) {
+  this.type = "ID";
+
+  var original = "",
+      dig = [],
+      depth = 0;
+
+  for(var i=0,l=parts.length; i<l; i++) {
+    var part = parts[i].part;
+    original += (parts[i].separator || '') + part;
+
+    if (part === ".." || part === "." || part === "this") {
+      if (dig.length > 0) { throw new Handlebars.Exception("Invalid path: " + original); }
+      else if (part === "..") { depth++; }
+      else { this.isScoped = true; }
+    }
+    else { dig.push(part); }
+  }
+
+  this.original = original;
+  this.parts    = dig;
+  this.string   = dig.join('.');
+  this.depth    = depth;
+
+  // an ID is simple if it only has one part, and that part is not
+  // `..` or `this`.
+  this.isSimple = parts.length === 1 && !this.isScoped && depth === 0;
+
+  this.stringModeValue = this.string;
+};
+
+Handlebars.AST.PartialNameNode = function(name) {
+  this.type = "PARTIAL_NAME";
+  this.name = name.original;
+};
+
+Handlebars.AST.DataNode = function(id) {
+  this.type = "DATA";
+  this.id = id;
+};
+
+Handlebars.AST.StringNode = function(string) {
+  this.type = "STRING";
+  this.original =
+    this.string =
+    this.stringModeValue = string;
+};
+
+Handlebars.AST.IntegerNode = function(integer) {
+  this.type = "INTEGER";
+  this.original =
+    this.integer = integer;
+  this.stringModeValue = Number(integer);
+};
+
+Handlebars.AST.BooleanNode = function(bool) {
+  this.type = "BOOLEAN";
+  this.bool = bool;
+  this.stringModeValue = bool === "true";
+};
+
+Handlebars.AST.CommentNode = function(comment) {
+  this.type = "comment";
+  this.comment = comment;
+};
+;
+// lib/handlebars/utils.js
+
+var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
+
+Handlebars.Exception = function(message) {
+  var tmp = Error.prototype.constructor.apply(this, arguments);
+
+  // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
+  for (var idx = 0; idx < errorProps.length; idx++) {
+    this[errorProps[idx]] = tmp[errorProps[idx]];
+  }
+};
+Handlebars.Exception.prototype = new Error();
+
+// Build out our basic SafeString type
+Handlebars.SafeString = function(string) {
+  this.string = string;
+};
+Handlebars.SafeString.prototype.toString = function() {
+  return this.string.toString();
+};
+
+var escape = {
+  "&": "&amp;",
+  "<": "&lt;",
+  ">": "&gt;",
+  '"': "&quot;",
+  "'": "&#x27;",
+  "`": "&#x60;"
+};
+
+var badChars = /[&<>"'`]/g;
+var possible = /[&<>"'`]/;
+
+var escapeChar = function(chr) {
+  return escape[chr] || "&amp;";
+};
+
+Handlebars.Utils = {
+  extend: function(obj, value) {
+    for(var key in value) {
+      if(value.hasOwnProperty(key)) {
+        obj[key] = value[key];
+      }
+    }
+  },
+
+  escapeExpression: function(string) {
+    // don't escape SafeStrings, since they're already safe
+    if (string instanceof Handlebars.SafeString) {
+      return string.toString();
+    } else if (string == null || string === false) {
+      return "";
+    }
+
+    // Force a string conversion as this will be done by the append regardless and
+    // the regex test will do this transparently behind the scenes, causing issues if
+    // an object's to string has escaped characters in it.
+    string = string.toString();
+
+    if(!possible.test(string)) { return string; }
+    return string.replace(badChars, escapeChar);
+  },
+
+  isEmpty: function(value) {
+    if (!value && value !== 0) {
+      return true;
+    } else if(toString.call(value) === "[object Array]" && value.length === 0) {
+      return true;
+    } else {
+      return false;
+    }
+  }
+};
+;
+// lib/handlebars/compiler/compiler.js
+
+/*jshint eqnull:true*/
+var Compiler = Handlebars.Compiler = function() {};
+var JavaScriptCompiler = Handlebars.JavaScriptCompiler = function() {};
+
+// the foundHelper register will disambiguate helper lookup from finding a
+// function in a context. This is necessary for mustache compatibility, which
+// requires that context functions in blocks are evaluated by blockHelperMissing,
+// and then proceed as if the resulting value was provided to blockHelperMissing.
+
+Compiler.prototype = {
+  compiler: Compiler,
+
+  disassemble: function() {
+    var opcodes = this.opcodes, opcode, out = [], params, param;
+
+    for (var i=0, l=opcodes.length; i<l; i++) {
+      opcode = opcodes[i];
+
+      if (opcode.opcode === 'DECLARE') {
+        out.push("DECLARE " + opcode.name + "=" + opcode.value);
+      } else {
+        params = [];
+        for (var j=0; j<opcode.args.length; j++) {
+          param = opcode.args[j];
+          if (typeof param === "string") {
+            param = "\"" + param.replace("\n", "\\n") + "\"";
+          }
+          params.push(param);
+        }
+        out.push(opcode.opcode + " " + params.join(" "));
+      }
+    }
+
+    return out.join("\n");
+  },
+  equals: function(other) {
+    var len = this.opcodes.length;
+    if (other.opcodes.length !== len) {
+      return false;
+    }
+
+    for (var i = 0; i < len; i++) {
+      var opcode = this.opcodes[i],
+          otherOpcode = other.opcodes[i];
+      if (opcode.opcode !== otherOpcode.opcode || opcode.args.length !== otherOpcode.args.length) {
+        return false;
+      }
+      for (var j = 0; j < opcode.args.length; j++) {
+        if (opcode.args[j] !== otherOpcode.args[j]) {
+          return false;
+        }
+      }
+    }
+
+    len = this.children.length;
+    if (other.children.length !== len) {
+      return false;
+    }
+    for (i = 0; i < len; i++) {
+      if (!this.children[i].equals(other.children[i])) {
+        return false;
+      }
+    }
+
+    return true;
+  },
+
+  guid: 0,
+
+  compile: function(program, options) {
+    this.children = [];
+    this.depths = {list: []};
+    this.options = options;
+
+    // These changes will propagate to the other compiler components
+    var knownHelpers = this.options.knownHelpers;
+    this.options.knownHelpers = {
+      'helperMissing': true,
+      'blockHelperMissing': true,
+      'each': true,
+      'if': true,
+      'unless': true,
+      'with': true,
+      'log': true
+    };
+    if (knownHelpers) {
+      for (var name in knownHelpers) {
+        this.options.knownHelpers[name] = knownHelpers[name];
+      }
+    }
+
+    return this.program(program);
+  },
+
+  accept: function(node) {
+    return this[node.type](node);
+  },
+
+  program: function(program) {
+    var statements = program.statements, statement;
+    this.opcodes = [];
+
+    for(var i=0, l=statements.length; i<l; i++) {
+      statement = statements[i];
+      this[statement.type](statement);
+    }
+    this.isSimple = l === 1;
+
+    this.depths.list = this.depths.list.sort(function(a, b) {
+      return a - b;
+    });
+
+    return this;
+  },
+
+  compileProgram: function(program) {
+    var result = new this.compiler().compile(program, this.options);
+    var guid = this.guid++, depth;
+
+    this.usePartial = this.usePartial || result.usePartial;
+
+    this.children[guid] = result;
+
+    for(var i=0, l=result.depths.list.length; i<l; i++) {
+      depth = result.depths.list[i];
+
+      if(depth < 2) { continue; }
+      else { this.addDepth(depth - 1); }
+    }
+
+    return guid;
+  },
+
+  block: function(block) {
+    var mustache = block.mustache,
+        program = block.program,
+        inverse = block.inverse;
+
+    if (program) {
+      program = this.compileProgram(program);
+    }
+
+    if (inverse) {
+      inverse = this.compileProgram(inverse);
+    }
+
+    var type = this.classifyMustache(mustache);
+
+    if (type === "helper") {
+      this.helperMustache(mustache, program, inverse);
+    } else if (type === "simple") {
+      this.simpleMustache(mustache);
+
+      // now that the simple mustache is resolved, we need to
+      // evaluate it by executing `blockHelperMissing`
+      this.opcode('pushProgram', program);
+      this.opcode('pushProgram', inverse);
+      this.opcode('emptyHash');
+      this.opcode('blockValue');
+    } else {
+      this.ambiguousMustache(mustache, program, inverse);
+
+      // now that the simple mustache is resolved, we need to
+      // evaluate it by executing `blockHelperMissing`
+      this.opcode('pushProgram', program);
+      this.opcode('pushProgram', inverse);
+      this.opcode('emptyHash');
+      this.opcode('ambiguousBlockValue');
+    }
+
+    this.opcode('append');
+  },
+
+  hash: function(hash) {
+    var pairs = hash.pairs, pair, val;
+
+    this.opcode('pushHash');
+
+    for(var i=0, l=pairs.length; i<l; i++) {
+      pair = pairs[i];
+      val  = pair[1];
+
+      if (this.options.stringParams) {
+        if(val.depth) {
+          this.addDepth(val.depth);
+        }
+        this.opcode('getContext', val.depth || 0);
+        this.opcode('pushStringParam', val.stringModeValue, val.type);
+      } else {
+        this.accept(val);
+      }
+
+      this.opcode('assignToHash', pair[0]);
+    }
+    this.opcode('popHash');
+  },
+
+  partial: function(partial) {
+    var partialName = partial.partialName;
+    this.usePartial = true;
+
+    if(partial.context) {
+      this.ID(partial.context);
+    } else {
+      this.opcode('push', 'depth0');
+    }
+
+    this.opcode('invokePartial', partialName.name);
+    this.opcode('append');
+  },
+
+  content: function(content) {
+    this.opcode('appendContent', content.string);
+  },
+
+  mustache: function(mustache) {
+    var options = this.options;
+    var type = this.classifyMustache(mustache);
+
+    if (type === "simple") {
+      this.simpleMustache(mustache);
+    } else if (type === "helper") {
+      this.helperMustache(mustache);
+    } else {
+      this.ambiguousMustache(mustache);
+    }
+
+    if(mustache.escaped && !options.noEscape) {
+      this.opcode('appendEscaped');
+    } else {
+      this.opcode('append');
+    }
+  },
+
+  ambiguousMustache: function(mustache, program, inverse) {
+    var id = mustache.id,
+        name = id.parts[0],
+        isBlock = program != null || inverse != null;
+
+    this.opcode('getContext', id.depth);
+
+    this.opcode('pushProgram', program);
+    this.opcode('pushProgram', inverse);
+
+    this.opcode('invokeAmbiguous', name, isBlock);
+  },
+
+  simpleMustache: function(mustache) {
+    var id = mustache.id;
+
+    if (id.type === 'DATA') {
+      this.DATA(id);
+    } else if (id.parts.length) {
+      this.ID(id);
+    } else {
+      // Simplified ID for `this`
+      this.addDepth(id.depth);
+      this.opcode('getContext', id.depth);
+      this.opcode('pushContext');
+    }
+
+    this.opcode('resolvePossibleLambda');
+  },
+
+  helperMustache: function(mustache, program, inverse) {
+    var params = this.setupFullMustacheParams(mustache, program, inverse),
+        name = mustache.id.parts[0];
+
+    if (this.options.knownHelpers[name]) {
+      this.opcode('invokeKnownHelper', params.length, name);
+    } else if (this.options.knownHelpersOnly) {
+      throw new Error("You specified knownHelpersOnly, but used the unknown helper " + name);
+    } else {
+      this.opcode('invokeHelper', params.length, name);
+    }
+  },
+
+  ID: function(id) {
+    this.addDepth(id.depth);
+    this.opcode('getContext', id.depth);
+
+    var name = id.parts[0];
+    if (!name) {
+      this.opcode('pushContext');
+    } else {
+      this.opcode('lookupOnContext', id.parts[0]);
+    }
+
+    for(var i=1, l=id.parts.length; i<l; i++) {
+      this.opcode('lookup', id.parts[i]);
+    }
+  },
+
+  DATA: function(data) {
+    this.options.data = true;
+    if (data.id.isScoped || data.id.depth) {
+      throw new Handlebars.Exception('Scoped data references are not supported: ' + data.original);
+    }
+
+    this.opcode('lookupData');
+    var parts = data.id.parts;
+    for(var i=0, l=parts.length; i<l; i++) {
+      this.opcode('lookup', parts[i]);
+    }
+  },
+
+  STRING: function(string) {
+    this.opcode('pushString', string.string);
+  },
+
+  INTEGER: function(integer) {
+    this.opcode('pushLiteral', integer.integer);
+  },
+
+  BOOLEAN: function(bool) {
+    this.opcode('pushLiteral', bool.bool);
+  },
+
+  comment: function() {},
+
+  // HELPERS
+  opcode: function(name) {
+    this.opcodes.push({ opcode: name, args: [].slice.call(arguments, 1) });
+  },
+
+  declare: function(name, value) {
+    this.opcodes.push({ opcode: 'DECLARE', name: name, value: value });
+  },
+
+  addDepth: function(depth) {
+    if(isNaN(depth)) { throw new Error("EWOT"); }
+    if(depth === 0) { return; }
+
+    if(!this.depths[depth]) {
+      this.depths[depth] = true;
+      this.depths.list.push(depth);
+    }
+  },
+
+  classifyMustache: function(mustache) {
+    var isHelper   = mustache.isHelper;
+    var isEligible = mustache.eligibleHelper;
+    var options    = this.options;
+
+    // if ambiguous, we can possibly resolve the ambiguity now
+    if (isEligible && !isHelper) {
+      var name = mustache.id.parts[0];
+
+      if (options.knownHelpers[name]) {
+        isHelper = true;
+      } else if (options.knownHelpersOnly) {
+        isEligible = false;
+      }
+    }
+
+    if (isHelper) { return "helper"; }
+    else if (isEligible) { return "ambiguous"; }
+    else { return "simple"; }
+  },
+
+  pushParams: function(params) {
+    var i = params.length, param;
+
+    while(i--) {
+      param = params[i];
+
+      if(this.options.stringParams) {
+        if(param.depth) {
+          this.addDepth(param.depth);
+        }
+
+        this.opcode('getContext', param.depth || 0);
+        this.opcode('pushStringParam', param.stringModeValue, param.type);
+      } else {
+        this[param.type](param);
+      }
+    }
+  },
+
+  setupMustacheParams: function(mustache) {
+    var params = mustache.params;
+    this.pushParams(params);
+
+    if(mustache.hash) {
+      this.hash(mustache.hash);
+    } else {
+      this.opcode('emptyHash');
+    }
+
+    return params;
+  },
+
+  // this will replace setupMustacheParams when we're done
+  setupFullMustacheParams: function(mustache, program, inverse) {
+    var params = mustache.params;
+    this.pushParams(params);
+
+    this.opcode('pushProgram', program);
+    this.opcode('pushProgram', inverse);
+
+    if(mustache.hash) {
+      this.hash(mustache.hash);
+    } else {
+      this.opcode('emptyHash');
+    }
+
+    return params;
+  }
+};
+
+var Literal = function(value) {
+  this.value = value;
+};
+
+JavaScriptCompiler.prototype = {
+  // PUBLIC API: You can override these methods in a subclass to provide
+  // alternative compiled forms for name lookup and buffering semantics
+  nameLookup: function(parent, name /* , type*/) {
+    if (/^[0-9]+$/.test(name)) {
+      return parent + "[" + name + "]";
+    } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
+      return parent + "." + name;
+    }
+    else {
+      return parent + "['" + name + "']";
+    }
+  },
+
+  appendToBuffer: function(string) {
+    if (this.environment.isSimple) {
+      return "return " + string + ";";
+    } else {
+      return {
+        appendToBuffer: true,
+        content: string,
+        toString: function() { return "buffer += " + string + ";"; }
+      };
+    }
+  },
+
+  initializeBuffer: function() {
+    return this.quotedString("");
+  },
+
+  namespace: "Handlebars",
+  // END PUBLIC API
+
+  compile: function(environment, options, context, asObject) {
+    this.environment = environment;
+    this.options = options || {};
+
+    Handlebars.log(Handlebars.logger.DEBUG, this.environment.disassemble() + "\n\n");
+
+    this.name = this.environment.name;
+    this.isChild = !!context;
+    this.context = context || {
+      programs: [],
+      environments: [],
+      aliases: { }
+    };
+
+    this.preamble();
+
+    this.stackSlot = 0;
+    this.stackVars = [];
+    this.registers = { list: [] };
+    this.compileStack = [];
+    this.inlineStack = [];
+
+    this.compileChildren(environment, options);
+
+    var opcodes = environment.opcodes, opcode;
+
+    this.i = 0;
+
+    for(l=opcodes.length; this.i<l; this.i++) {
+      opcode = opcodes[this.i];
+
+      if(opcode.opcode === 'DECLARE') {
+        this[opcode.name] = opcode.value;
+      } else {
+        this[opcode.opcode].apply(this, opcode.args);
+      }
+    }
+
+    return this.createFunctionContext(asObject);
+  },
+
+  nextOpcode: function() {
+    var opcodes = this.environment.opcodes;
+    return opcodes[this.i + 1];
+  },
+
+  eat: function() {
+    this.i = this.i + 1;
+  },
+
+  preamble: function() {
+    var out = [];
+
+    if (!this.isChild) {
+      var namespace = this.namespace;
+
+      var copies = "helpers = this.merge(helpers, " + namespace + ".helpers);";
+      if (this.environment.usePartial) { copies = copies + " partials = this.merge(partials, " + namespace + ".partials);"; }
+      if (this.options.data) { copies = copies + " data = data || {};"; }
+      out.push(copies);
+    } else {
+      out.push('');
+    }
+
+    if (!this.environment.isSimple) {
+      out.push(", buffer = " + this.initializeBuffer());
+    } else {
+      out.push("");
+    }
+
+    // track the last context pushed into place to allow skipping the
+    // getContext opcode when it would be a noop
+    this.lastContext = 0;
+    this.source = out;
+  },
+
+  createFunctionContext: function(asObject) {
+    var locals = this.stackVars.concat(this.registers.list);
+
+    if(locals.length > 0) {
+      this.source[1] = this.source[1] + ", " + locals.join(", ");
+    }
+
+    // Generate minimizer alias mappings
+    if (!this.isChild) {
+      for (var alias in this.context.aliases) {
+        if (this.context.aliases.hasOwnProperty(alias)) {
+          this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias];
+        }
+      }
+    }
+
+    if (this.source[1]) {
+      this.source[1] = "var " + this.source[1].substring(2) + ";";
+    }
+
+    // Merge children
+    if (!this.isChild) {
+      this.source[1] += '\n' + this.context.programs.join('\n') + '\n';
+    }
+
+    if (!this.environment.isSimple) {
+      this.source.push("return buffer;");
+    }
+
+    var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"];
+
+    for(var i=0, l=this.environment.depths.list.length; i<l; i++) {
+      params.push("depth" + this.environment.depths.list[i]);
+    }
+
+    // Perform a second pass over the output to merge content when possible
+    var source = this.mergeSource();
+
+    if (!this.isChild) {
+      var revision = Handlebars.COMPILER_REVISION,
+          versions = Handlebars.REVISION_CHANGES[revision];
+      source = "this.compilerInfo = ["+revision+",'"+versions+"'];\n"+source;
+    }
+
+    if (asObject) {
+      params.push(source);
+
+      return Function.apply(this, params);
+    } else {
+      var functionSource = 'function ' + (this.name || '') + '(' + params.join(',') + ') {\n  ' + source + '}';
+      Handlebars.log(Handlebars.logger.DEBUG, functionSource + "\n\n");
+      return functionSource;
+    }
+  },
+  mergeSource: function() {
+    // WARN: We are not handling the case where buffer is still populated as the source should
+    // not have buffer append operations as their final action.
+    var source = '',
+        buffer;
+    for (var i = 0, len = this.source.length; i < len; i++) {
+      var line = this.source[i];
+      if (line.appendToBuffer) {
+        if (buffer) {
+          buffer = buffer + '\n    + ' + line.content;
+        } else {
+          buffer = line.content;
+        }
+      } else {
+        if (buffer) {
+          source += 'buffer += ' + buffer + ';\n  ';
+          buffer = undefined;
+        }
+        source += line + '\n  ';
+      }
+    }
+    return source;
+  },
+
+  // [blockValue]
+  //
+  // On stack, before: hash, inverse, program, value
+  // On stack, after: return value of blockHelperMissing
+  //
+  // The purpose of this opcode is to take a block of the form
+  // `{{#foo}}...{{/foo}}`, resolve the value of `foo`, and
+  // replace it on the stack with the result of properly
+  // invoking blockHelperMissing.
+  blockValue: function() {
+    this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+    var params = ["depth0"];
+    this.setupParams(0, params);
+
+    this.replaceStack(function(current) {
+      params.splice(1, 0, current);
+      return "blockHelperMissing.call(" + params.join(", ") + ")";
+    });
+  },
+
+  // [ambiguousBlockValue]
+  //
+  // On stack, before: hash, inverse, program, value
+  // Compiler value, before: lastHelper=value of last found helper, if any
+  // On stack, after, if no lastHelper: same as [blockValue]
+  // On stack, after, if lastHelper: value
+  ambiguousBlockValue: function() {
+    this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+    var params = ["depth0"];
+    this.setupParams(0, params);
+
+    var current = this.topStack();
+    params.splice(1, 0, current);
+
+    // Use the options value generated from the invocation
+    params[params.length-1] = 'options';
+
+    this.source.push("if (!" + this.lastHelper + ") { " + current + " = blockHelperMissing.call(" + params.join(", ") + "); }");
+  },
+
+  // [appendContent]
+  //
+  // On stack, before: ...
+  // On stack, after: ...
+  //
+  // Appends the string value of `content` to the current buffer
+  appendContent: function(content) {
+    this.source.push(this.appendToBuffer(this.quotedString(content)));
+  },
+
+  // [append]
+  //
+  // On stack, before: value, ...
+  // On stack, after: ...
+  //
+  // Coerces `value` to a String and appends it to the current buffer.
+  //
+  // If `value` is truthy, or 0, it is coerced into a string and appended
+  // Otherwise, the empty string is appended
+  append: function() {
+    // Force anything that is inlined onto the stack so we don't have duplication
+    // when we examine local
+    this.flushInline();
+    var local = this.popStack();
+    this.source.push("if(" + local + " || " + local + " === 0) { " + this.appendToBuffer(local) + " }");
+    if (this.environment.isSimple) {
+      this.source.push("else { " + this.appendToBuffer("''") + " }");
+    }
+  },
+
+  // [appendEscaped]
+  //
+  // On stack, before: value, ...
+  // On stack, after: ...
+  //
+  // Escape `value` and append it to the buffer
+  appendEscaped: function() {
+    this.context.aliases.escapeExpression = 'this.escapeExpression';
+
+    this.source.push(this.appendToBuffer("escapeExpression(" + this.popStack() + ")"));
+  },
+
+  // [getContext]
+  //
+  // On stack, before: ...
+  // On stack, after: ...
+  // Compiler value, after: lastContext=depth
+  //
+  // Set the value of the `lastContext` compiler value to the depth
+  getContext: function(depth) {
+    if(this.lastContext !== depth) {
+      this.lastContext = depth;
+    }
+  },
+
+  // [lookupOnContext]
+  //
+  // On stack, before: ...
+  // On stack, after: currentContext[name], ...
+  //
+  // Looks up the value of `name` on the current context and pushes
+  // it onto the stack.
+  lookupOnContext: function(name) {
+    this.push(this.nameLookup('depth' + this.lastContext, name, 'context'));
+  },
+
+  // [pushContext]
+  //
+  // On stack, before: ...
+  // On stack, after: currentContext, ...
+  //
+  // Pushes the value of the current context onto the stack.
+  pushContext: function() {
+    this.pushStackLiteral('depth' + this.lastContext);
+  },
+
+  // [resolvePossibleLambda]
+  //
+  // On stack, before: value, ...
+  // On stack, after: resolved value, ...
+  //
+  // If the `value` is a lambda, replace it on the stack by
+  // the return value of the lambda
+  resolvePossibleLambda: function() {
+    this.context.aliases.functionType = '"function"';
+
+    this.replaceStack(function(current) {
+      return "typeof " + current + " === functionType ? " + current + ".apply(depth0) : " + current;
+    });
+  },
+
+  // [lookup]
+  //
+  // On stack, before: value, ...
+  // On stack, after: value[name], ...
+  //
+  // Replace the value on the stack with the result of looking
+  // up `name` on `value`
+  lookup: function(name) {
+    this.replaceStack(function(current) {
+      return current + " == null || " + current + " === false ? " + current + " : " + this.nameLookup(current, name, 'context');
+    });
+  },
+
+  // [lookupData]
+  //
+  // On stack, before: ...
+  // On stack, after: data[id], ...
+  //
+  // Push the result of looking up `id` on the current data
+  lookupData: function(id) {
+    this.push('data');
+  },
+
+  // [pushStringParam]
+  //
+  // On stack, before: ...
+  // On stack, after: string, currentContext, ...
+  //
+  // This opcode is designed for use in string mode, which
+  // provides the string value of a parameter along with its
+  // depth rather than resolving it immediately.
+  pushStringParam: function(string, type) {
+    this.pushStackLiteral('depth' + this.lastContext);
+
+    this.pushString(type);
+
+    if (typeof string === 'string') {
+      this.pushString(string);
+    } else {
+      this.pushStackLiteral(string);
+    }
+  },
+
+  emptyHash: function() {
+    this.pushStackLiteral('{}');
+
+    if (this.options.stringParams) {
+      this.register('hashTypes', '{}');
+      this.register('hashContexts', '{}');
+    }
+  },
+  pushHash: function() {
+    this.hash = {values: [], types: [], contexts: []};
+  },
+  popHash: function() {
+    var hash = this.hash;
+    this.hash = undefined;
+
+    if (this.options.stringParams) {
+      this.register('hashContexts', '{' + hash.contexts.join(',') + '}');
+      this.register('hashTypes', '{' + hash.types.join(',') + '}');
+    }
+    this.push('{\n    ' + hash.values.join(',\n    ') + '\n  }');
+  },
+
+  // [pushString]
+  //
+  // On stack, before: ...
+  // On stack, after: quotedString(string), ...
+  //
+  // Push a quoted version of `string` onto the stack
+  pushString: function(string) {
+    this.pushStackLiteral(this.quotedString(string));
+  },
+
+  // [push]
+  //
+  // On stack, before: ...
+  // On stack, after: expr, ...
+  //
+  // Push an expression onto the stack
+  push: function(expr) {
+    this.inlineStack.push(expr);
+    return expr;
+  },
+
+  // [pushLiteral]
+  //
+  // On stack, before: ...
+  // On stack, after: value, ...
+  //
+  // Pushes a value onto the stack. This operation prevents
+  // the compiler from creating a temporary variable to hold
+  // it.
+  pushLiteral: function(value) {
+    this.pushStackLiteral(value);
+  },
+
+  // [pushProgram]
+  //
+  // On stack, before: ...
+  // On stack, after: program(guid), ...
+  //
+  // Push a program expression onto the stack. This takes
+  // a compile-time guid and converts it into a runtime-accessible
+  // expression.
+  pushProgram: function(guid) {
+    if (guid != null) {
+      this.pushStackLiteral(this.programExpression(guid));
+    } else {
+      this.pushStackLiteral(null);
+    }
+  },
+
+  // [invokeHelper]
+  //
+  // On stack, before: hash, inverse, program, params..., ...
+  // On stack, after: result of helper invocation
+  //
+  // Pops off the helper's parameters, invokes the helper,
+  // and pushes the helper's return value onto the stack.
+  //
+  // If the helper is not found, `helperMissing` is called.
+  invokeHelper: function(paramSize, name) {
+    this.context.aliases.helperMissing = 'helpers.helperMissing';
+
+    var helper = this.lastHelper = this.setupHelper(paramSize, name, true);
+    var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
+
+    this.push(helper.name + ' || ' + nonHelper);
+    this.replaceStack(function(name) {
+      return name + ' ? ' + name + '.call(' +
+          helper.callParams + ") " + ": helperMissing.call(" +
+          helper.helperMissingParams + ")";
+    });
+  },
+
+  // [invokeKnownHelper]
+  //
+  // On stack, before: hash, inverse, program, params..., ...
+  // On stack, after: result of helper invocation
+  //
+  // This operation is used when the helper is known to exist,
+  // so a `helperMissing` fallback is not required.
+  invokeKnownHelper: function(paramSize, name) {
+    var helper = this.setupHelper(paramSize, name);
+    this.push(helper.name + ".call(" + helper.callParams + ")");
+  },
+
+  // [invokeAmbiguous]
+  //
+  // On stack, before: hash, inverse, program, params..., ...
+  // On stack, after: result of disambiguation
+  //
+  // This operation is used when an expression like `{{foo}}`
+  // is provided, but we don't know at compile-time whether it
+  // is a helper or a path.
+  //
+  // This operation emits more code than the other options,
+  // and can be avoided by passing the `knownHelpers` and
+  // `knownHelpersOnly` flags at compile-time.
+  invokeAmbiguous: function(name, helperCall) {
+    this.context.aliases.functionType = '"function"';
+
+    this.pushStackLiteral('{}');    // Hash value
+    var helper = this.setupHelper(0, name, helperCall);
+
+    var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
+
+    var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
+    var nextStack = this.nextStack();
+
+    this.source.push('if (' + nextStack + ' = ' + helperName + ') { ' + nextStack + ' = ' + nextStack + '.call(' + helper.callParams + '); }');
+    this.source.push('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '.apply(depth0) : ' + nextStack + '; }');
+  },
+
+  // [invokePartial]
+  //
+  // On stack, before: context, ...
+  // On stack after: result of partial invocation
+  //
+  // This operation pops off a context, invokes a partial with that context,
+  // and pushes the result of the invocation back.
+  invokePartial: function(name) {
+    var params = [this.nameLookup('partials', name, 'partial'), "'" + name + "'", this.popStack(), "helpers", "partials"];
+
+    if (this.options.data) {
+      params.push("data");
+    }
+
+    this.context.aliases.self = "this";
+    this.push("self.invokePartial(" + params.join(", ") + ")");
+  },
+
+  // [assignToHash]
+  //
+  // On stack, before: value, hash, ...
+  // On stack, after: hash, ...
+  //
+  // Pops a value and hash off the stack, assigns `hash[key] = value`
+  // and pushes the hash back onto the stack.
+  assignToHash: function(key) {
+    var value = this.popStack(),
+        context,
+        type;
+
+    if (this.options.stringParams) {
+      type = this.popStack();
+      context = this.popStack();
+    }
+
+    var hash = this.hash;
+    if (context) {
+      hash.contexts.push("'" + key + "': " + context);
+    }
+    if (type) {
+      hash.types.push("'" + key + "': " + type);
+    }
+    hash.values.push("'" + key + "': (" + value + ")");
+  },
+
+  // HELPERS
+
+  compiler: JavaScriptCompiler,
+
+  compileChildren: function(environment, options) {
+    var children = environment.children, child, compiler;
+
+    for(var i=0, l=children.length; i<l; i++) {
+      child = children[i];
+      compiler = new this.compiler();
+
+      var index = this.matchExistingProgram(child);
+
+      if (index == null) {
+        this.context.programs.push('');     // Placeholder to prevent name conflicts for nested children
+        index = this.context.programs.length;
+        child.index = index;
+        child.name = 'program' + index;
+        this.context.programs[index] = compiler.compile(child, options, this.context);
+        this.context.environments[index] = child;
+      } else {
+        child.index = index;
+        child.name = 'program' + index;
+      }
+    }
+  },
+  matchExistingProgram: function(child) {
+    for (var i = 0, len = this.context.environments.length; i < len; i++) {
+      var environment = this.context.environments[i];
+      if (environment && environment.equals(child)) {
+        return i;
+      }
+    }
+  },
+
+  programExpression: function(guid) {
+    this.context.aliases.self = "this";
+
+    if(guid == null) {
+      return "self.noop";
+    }
+
+    var child = this.environment.children[guid],
+        depths = child.depths.list, depth;
+
+    var programParams = [child.index, child.name, "data"];
+
+    for(var i=0, l = depths.length; i<l; i++) {
+      depth = depths[i];
+
+      if(depth === 1) { programParams.push("depth0"); }
+      else { programParams.push("depth" + (depth - 1)); }
+    }
+
+    return (depths.length === 0 ? "self.program(" : "self.programWithDepth(") + programParams.join(", ") + ")";
+  },
+
+  register: function(name, val) {
+    this.useRegister(name);
+    this.source.push(name + " = " + val + ";");
+  },
+
+  useRegister: function(name) {
+    if(!this.registers[name]) {
+      this.registers[name] = true;
+      this.registers.list.push(name);
+    }
+  },
+
+  pushStackLiteral: function(item) {
+    return this.push(new Literal(item));
+  },
+
+  pushStack: function(item) {
+    this.flushInline();
+
+    var stack = this.incrStack();
+    if (item) {
+      this.source.push(stack + " = " + item + ";");
+    }
+    this.compileStack.push(stack);
+    return stack;
+  },
+
+  replaceStack: function(callback) {
+    var prefix = '',
+        inline = this.isInline(),
+        stack;
+
+    // If we are currently inline then we want to merge the inline statement into the
+    // replacement statement via ','
+    if (inline) {
+      var top = this.popStack(true);
+
+      if (top instanceof Literal) {
+        // Literals do not need to be inlined
+        stack = top.value;
+      } else {
+        // Get or create the current stack name for use by the inline
+        var name = this.stackSlot ? this.topStackName() : this.incrStack();
+
+        prefix = '(' + this.push(name) + ' = ' + top + '),';
+        stack = this.topStack();
+      }
+    } else {
+      stack = this.topStack();
+    }
+
+    var item = callback.call(this, stack);
+
+    if (inline) {
+      if (this.inlineStack.length || this.compileStack.length) {
+        this.popStack();
+      }
+      this.push('(' + prefix + item + ')');
+    } else {
+      // Prevent modification of the context depth variable. Through replaceStack
+      if (!/^stack/.test(stack)) {
+        stack = this.nextStack();
+      }
+
+      this.source.push(stack + " = (" + prefix + item + ");");
+    }
+    return stack;
+  },
+
+  nextStack: function() {
+    return this.pushStack();
+  },
+
+  incrStack: function() {
+    this.stackSlot++;
+    if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); }
+    return this.topStackName();
+  },
+  topStackName: function() {
+    return "stack" + this.stackSlot;
+  },
+  flushInline: function() {
+    var inlineStack = this.inlineStack;
+    if (inlineStack.length) {
+      this.inlineStack = [];
+      for (var i = 0, len = inlineStack.length; i < len; i++) {
+        var entry = inlineStack[i];
+        if (entry instanceof Literal) {
+          this.compileStack.push(entry);
+        } else {
+          this.pushStack(entry);
+        }
+      }
+    }
+  },
+  isInline: function() {
+    return this.inlineStack.length;
+  },
+
+  popStack: function(wrapped) {
+    var inline = this.isInline(),
+        item = (inline ? this.inlineStack : this.compileStack).pop();
+
+    if (!wrapped && (item instanceof Literal)) {
+      return item.value;
+    } else {
+      if (!inline) {
+        this.stackSlot--;
+      }
+      return item;
+    }
+  },
+
+  topStack: function(wrapped) {
+    var stack = (this.isInline() ? this.inlineStack : this.compileStack),
+        item = stack[stack.length - 1];
+
+    if (!wrapped && (item instanceof Literal)) {
+      return item.value;
+    } else {
+      return item;
+    }
+  },
+
+  quotedString: function(str) {
+    return '"' + str
+      .replace(/\\/g, '\\\\')
+      .replace(/"/g, '\\"')
+      .replace(/\n/g, '\\n')
+      .replace(/\r/g, '\\r')
+      .replace(/\u2028/g, '\\u2028')   // Per Ecma-262 7.3 + 7.8.4
+      .replace(/\u2029/g, '\\u2029') + '"';
+  },
+
+  setupHelper: function(paramSize, name, missingParams) {
+    var params = [];
+    this.setupParams(paramSize, params, missingParams);
+    var foundHelper = this.nameLookup('helpers', name, 'helper');
+
+    return {
+      params: params,
+      name: foundHelper,
+      callParams: ["depth0"].concat(params).join(", "),
+      helperMissingParams: missingParams && ["depth0", this.quotedString(name)].concat(params).join(", ")
+    };
+  },
+
+  // the params and contexts arguments are passed in arrays
+  // to fill in
+  setupParams: function(paramSize, params, useRegister) {
+    var options = [], contexts = [], types = [], param, inverse, program;
+
+    options.push("hash:" + this.popStack());
+
+    inverse = this.popStack();
+    program = this.popStack();
+
+    // Avoid setting fn and inverse if neither are set. This allows
+    // helpers to do a check for `if (options.fn)`
+    if (program || inverse) {
+      if (!program) {
+        this.context.aliases.self = "this";
+        program = "self.noop";
+      }
+
+      if (!inverse) {
+       this.context.aliases.self = "this";
+        inverse = "self.noop";
+      }
+
+      options.push("inverse:" + inverse);
+      options.push("fn:" + program);
+    }
+
+    for(var i=0; i<paramSize; i++) {
+      param = this.popStack();
+      params.push(param);
+
+      if(this.options.stringParams) {
+        types.push(this.popStack());
+        contexts.push(this.popStack());
+      }
+    }
+
+    if (this.options.stringParams) {
+      options.push("contexts:[" + contexts.join(",") + "]");
+      options.push("types:[" + types.join(",") + "]");
+      options.push("hashContexts:hashContexts");
+      options.push("hashTypes:hashTypes");
+    }
+
+    if(this.options.data) {
+      options.push("data:data");
+    }
+
+    options = "{" + options.join(",") + "}";
+    if (useRegister) {
+      this.register('options', options);
+      params.push('options');
+    } else {
+      params.push(options);
+    }
+    return params.join(", ");
+  }
+};
+
+var reservedWords = (
+  "break else new var" +
+  " case finally return void" +
+  " catch for switch while" +
+  " continue function this with" +
+  " default if throw" +
+  " delete in try" +
+  " do instanceof typeof" +
+  " abstract enum int short" +
+  " boolean export interface static" +
+  " byte extends long super" +
+  " char final native synchronized" +
+  " class float package throws" +
+  " const goto private transient" +
+  " debugger implements protected volatile" +
+  " double import public let yield"
+).split(" ");
+
+var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
+
+for(var i=0, l=reservedWords.length; i<l; i++) {
+  compilerWords[reservedWords[i]] = true;
+}
+
+JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
+  if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {
+    return true;
+  }
+  return false;
+};
+
+Handlebars.precompile = function(input, options) {
+  if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
+    throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed " + input);
+  }
+
+  options = options || {};
+  if (!('data' in options)) {
+    options.data = true;
+  }
+  var ast = Handlebars.parse(input);
+  var environment = new Compiler().compile(ast, options);
+  return new JavaScriptCompiler().compile(environment, options);
+};
+
+Handlebars.compile = function(input, options) {
+  if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
+    throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed " + input);
+  }
+
+  options = options || {};
+  if (!('data' in options)) {
+    options.data = true;
+  }
+  var compiled;
+  function compile() {
+    var ast = Handlebars.parse(input);
+    var environment = new Compiler().compile(ast, options);
+    var templateSpec = new JavaScriptCompiler().compile(environment, options, undefined, true);
+    return Handlebars.template(templateSpec);
+  }
+
+  // Template is only compiled on first use and cached after that point.
+  return function(context, options) {
+    if (!compiled) {
+      compiled = compile();
+    }
+    return compiled.call(this, context, options);
+  };
+};
+
+;
+// lib/handlebars/runtime.js
+
+Handlebars.VM = {
+  template: function(templateSpec) {
+    // Just add water
+    var container = {
+      escapeExpression: Handlebars.Utils.escapeExpression,
+      invokePartial: Handlebars.VM.invokePartial,
+      programs: [],
+      program: function(i, fn, data) {
+        var programWrapper = this.programs[i];
+        if(data) {
+          programWrapper = Handlebars.VM.program(i, fn, data);
+        } else if (!programWrapper) {
+          programWrapper = this.programs[i] = Handlebars.VM.program(i, fn);
+        }
+        return programWrapper;
+      },
+      merge: function(param, common) {
+        var ret = param || common;
+
+        if (param && common) {
+          ret = {};
+          Handlebars.Utils.extend(ret, common);
+          Handlebars.Utils.extend(ret, param);
+        }
+        return ret;
+      },
+      programWithDepth: Handlebars.VM.programWithDepth,
+      noop: Handlebars.VM.noop,
+      compilerInfo: null
+    };
+
+    return function(context, options) {
+      options = options || {};
+      var result = templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);
+
+      var compilerInfo = container.compilerInfo || [],
+          compilerRevision = compilerInfo[0] || 1,
+          currentRevision = Handlebars.COMPILER_REVISION;
+
+      if (compilerRevision !== currentRevision) {
+        if (compilerRevision < currentRevision) {
+          var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
+              compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
+          throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
+                "Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
+        } else {
+          // Use the embedded version info since the runtime doesn't know about this revision yet
+          throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
+                "Please update your runtime to a newer version ("+compilerInfo[1]+").";
+        }
+      }
+
+      return result;
+    };
+  },
+
+  programWithDepth: function(i, fn, data /*, $depth */) {
+    var args = Array.prototype.slice.call(arguments, 3);
+
+    var program = function(context, options) {
+      options = options || {};
+
+      return fn.apply(this, [context, options.data || data].concat(args));
+    };
+    program.program = i;
+    program.depth = args.length;
+    return program;
+  },
+  program: function(i, fn, data) {
+    var program = function(context, options) {
+      options = options || {};
+
+      return fn(context, options.data || data);
+    };
+    program.program = i;
+    program.depth = 0;
+    return program;
+  },
+  noop: function() { return ""; },
+  invokePartial: function(partial, name, context, helpers, partials, data) {
+    var options = { helpers: helpers, partials: partials, data: data };
+
+    if(partial === undefined) {
+      throw new Handlebars.Exception("The partial " + name + " could not be found");
+    } else if(partial instanceof Function) {
+      return partial(context, options);
+    } else if (!Handlebars.compile) {
+      throw new Handlebars.Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
+    } else {
+      partials[name] = Handlebars.compile(partial, {data: data !== undefined});
+      return partials[name](context, options);
+    }
+  }
+};
+
+Handlebars.template = Handlebars.VM.template;
+;
+// lib/handlebars/browser-suffix.js
+})(Handlebars);
+;
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/highlight.7.3.pack.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/highlight.7.3.pack.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/highlight.7.3.pack.js	(revision 5961)
@@ -0,0 +1,1 @@
+var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(q){function o(s,r){return RegExp(s,"m"+(q.cI?"i":"")+(r?"g":""))}function p(y,w){if(y.compiled){return}y.compiled=true;var s=[];if(y.k){var r={};function z(A,t){t.split(" ").forEach(function(B){var C=B.split("|");r[C[0]]=[A,C[1]?Number(C[1]):1];s.push(C[0])})}y.lR=o(y.l||hljs.IR,true);if(typeof y.k=="string"){z("keyword",y.k)}else{for(var x in y.k){if(!y.k.hasOwnProperty(x)){continue}z(x,y.k[x])}}y.k=r}if(w){if(y.bWK){y.b="\\b("+s.join("|")+")\\s"}y.bR=o(y.b?y.b:"\\B|\\b");if(!y.e&&!y.eW){y.e="\\B|\\b"}if(y.e){y.eR=o(y.e)}y.tE=y.e||"";if(y.eW&&w.tE){y.tE+=(y.e?"|":"")+w.tE}}if(y.i){y.iR=o(y.i)}if(y.r===undefined){y.r=1}if(!y.c){y.c=[]}for(var v=0;v<y.c.length;v++){if(y.c[v]=="self"){y.c[v]=y}p(y.c[v],y)}if(y.starts){p(y.starts,w)}var u=[];for(var v=0;v<y.c.length;v++){u.push(y.c[v].b)}if(y.tE){u.push(y.tE)}if(y.i){u.push(y.i)}y.t=u.length?o(u.join("|"),true):{exec:function(t){return null}}}p(q)}function d(D,E){function o(r,M){for(var L=0;L<M.c.length;L++){var K=M.c[L].bR.exec(r);if(K&&K.index==0){return M.c[L]}}}function s(K,r){if(K.e&&K.eR.test(r)){return K}if(K.eW){return s(K.parent,r)}}function t(r,K){return K.i&&K.iR.test(r)}function y(L,r){var K=F.cI?r[0].toLowerCase():r[0];return L.k.hasOwnProperty(K)&&L.k[K]}function G(){var K=l(w);if(!A.k){return K}var r="";var N=0;A.lR.lastIndex=0;var L=A.lR.exec(K);while(L){r+=K.substr(N,L.index-N);var M=y(A,L);if(M){v+=M[1];r+='<span class="'+M[0]+'">'+L[0]+"</span>"}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'<span class="'+L.cN+'">':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+="</span>"}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},b]}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery-1.8.0.min.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery-1.8.0.min.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery-1.8.0.min.js	(revision 5961)
@@ -0,0 +1,2 @@
+/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
+(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cB(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cC(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cK(){try{return new a.XMLHttpRequest}catch(b){}}function cL(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cT(){return setTimeout(function(){cM=b},0),cM=p.now()}function cU(a,b){p.each(b,function(b,c){var d=(cS[b]||[]).concat(cS["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cV(a,b,c){var d,e=0,f=0,g=cR.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cM||cT(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cM||cT(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cW(k,j.opts.specialEasing);for(;e<g;e++){d=cR[e].call(j,a,k,j.opts);if(d)return d}return cU(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cW(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cX(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bY(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cb(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cO.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cY(a,b,c,d,e){return new cY.prototype.init(a,b,c,d,e)}function cZ(a,b){var c,d={height:a},e=0;for(;e<4;e+=2-b)c=bU[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function c_(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=r.test("Â ")?/^[\s\xA0]+|[\s\xA0]+$/g:/^\s+|\s+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":a.toString().replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||f.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete"||e.readyState!=="loading"&&e.addEventListener)setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){p.isFunction(c)&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")===0&&(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)(d=p._data(g[h],a+"queueHooks"))&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)~f.indexOf(" "+b[g]+" ")||(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,k,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=[].slice.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click")){g=p(this),g.context=this;for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){i={},k=[],g[0]=f;for(d=0;d<q;d++)l=o[d],m=l.selector,i[m]===b&&(i[m]=g.is(m)),i[m]&&k.push(l);k.length&&u.push({elem:f,matches:k})}}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){j=u[d],c.currentTarget=j.elem;for(e=0;e<j.matches.length&&!c.isImmediatePropagationStopped();e++){l=j.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,h=((p.event.special[l.origType]||{}).handle||l.handler).apply(j.elem,r),h!==b&&(c.result=h,h===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{ready:{setup:p.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)Z(a,b[e],c,d)}function be(a,b,c,d,e,f){var g,h=$.setFilters[b.toLowerCase()];return h||Z.error(b),(a||!(g=e))&&bd(a||"*",d,g=[],e),g.length>0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;a<c;a++)arguments[a]===b&&(g[a]=b)};for(;p<q;p++){s.exec(""),a=f[p],j=[],i=0,k=e;while(g=s.exec(a)){n=s.lastIndex=g.index+g[0].length;if(n>i){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="<a name='"+q+"'></a><div name='"+q+"'></div>",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},odd:function(a,b,c){var d=[],e=c?0:1,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},lt:function(a,b,c){return c?a.slice(+b):a.slice(0,+b)},gt:function(a,b,c){return c?a.slice(0,+b+1):a.slice(+b+1)},eq:function(a,b,c){var d=a.splice(+b,1);return c?a:d}}};$.setFilters.nth=$.setFilters.eq,$.filters=$.pseudos,X||($.attrHandle={href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}}),V&&($.order.push("NAME"),$.find.NAME=function(a,b){if(typeof b.getElementsByName!==j)return b.getElementsByName(a)}),Y&&($.order.splice(1,0,"CLASS"),$.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!==j&&!c)return b.getElementsByClassName(a)});try{n.call(i.childNodes,0)[0].nodeType}catch(_){n=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}var ba=Z.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},bb=Z.contains=i.compareDocumentPosition?function(a,b){return!!(a.compareDocumentPosition(b)&16)}:i.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc=Z.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=bc(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=bc(b);return c};Z.attr=function(a,b){var c,d=ba(a);return d||(b=b.toLowerCase()),$.attrHandle[b]?$.attrHandle[b](a):U||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},Z.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},[0,0].sort(function(){return l=0}),i.compareDocumentPosition?e=function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:(e=function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],g=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return f(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)g.unshift(j),j=j.parentNode;c=e.length,d=g.length;for(var l=0;l<c&&l<d;l++)if(e[l]!==g[l])return f(e[l],g[l]);return l===c?f(a,g[l],-1):f(e[l],b,1)},f=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),Z.uniqueSort=function(a){var b,c=1;if(e){k=l,a.sort(e);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1)}return a};var bl=Z.compile=function(a,b,c){var d,e,f,g=O[a];if(g&&g.context===b)return g;e=bg(a,b,c);for(f=0;d=e[f];f++)e[f]=bj(d,b,c);return g=O[a]=bk(e),g.context=b,g.runs=g.dirruns=0,P.push(a),P.length>$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j<k;j++){p=$.order[j];if(s=L[p].exec(m)){h=$.find[p]((s[1]||"").replace(K,""),q,g);if(h==null)continue;m===r&&(a=a.slice(0,a.length-r.length)+m.replace(L[p],""),a||o.apply(e,n.call(h,0)));break}}}if(a){i=bl(a,b,g),d=i.dirruns++,h==null&&(h=$.find.TAG("*",G.test(a)&&b.parentNode||b));for(j=0;l=h[j];j++)c=i.runs++,i(l,b)&&e.push(l)}return e};h.querySelectorAll&&function(){var a,b=bm,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[],f=[":active"],g=i.matchesSelector||i.mozMatchesSelector||i.webkitMatchesSelector||i.oMatchesSelector||i.msMatchesSelector;T(function(a){a.innerHTML="<select><option selected></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=(c[0]||c).ownerDocument||c[0]||c,typeof c.createDocumentFragment=="undefined"&&(c=e),a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cr=/([?&])_=[^&]*/,cs=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,ct=p.fn.load,cu={},cv={},cw=["*/"]+["*"];try{ci=f.href}catch(cx){ci=e.createElement("a"),ci.href="",ci=ci.href}cj=cs.exec(ci.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&ct)return ct.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cq,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cA(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cA(a,b),a},ajaxSettings:{url:ci,isLocal:cm.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cw},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cy(cu),ajaxTransport:cy(cv),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cB(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cC(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cl.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(ck,"").replace(co,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=cs.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==cj[1]&&i[2]==cj[2]&&(i[3]||(i[1]==="http:"?80:443))==(cj[3]||(cj[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cz(cu,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!cn.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cp.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cr,"$1_="+z);l.url=A+(A===l.url?(cp.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cw+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cz(cv,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cD=[],cE=/\?/,cF=/(=)\?(?=&|$)|\?\?/,cG=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cD.pop()||p.expando+"_"+cG++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cF.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cF.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cF,"$1"+f):m?c.data=i.replace(cF,"$1"+f):k&&(c.url+=(cE.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cD.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cH,cI=a.ActiveXObject?function(){for(var a in cH)cH[a](0,1)}:!1,cJ=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cK()||cL()}:cK,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cI&&delete cH[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cJ,cI&&(cH||(cH={},p(a).unload(cI)),cH[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cM,cN,cO=/^(?:toggle|show|hide)$/,cP=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cQ=/queueHooks$/,cR=[cX],cS={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cP.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cV,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cS[c]=cS[c]||[],cS[c].unshift(b)},prefilter:function(a,b){b?cR.unshift(a):cR.push(a)}}),p.Tween=cY,cY.prototype={constructor:cY,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cY.propHooks[this.prop];return a&&a.get?a.get(this):cY.propHooks._default.get(this)},run:function(a){var b,c=cY.propHooks[this.prop];return this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration),this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cY.propHooks._default.set(this),this}},cY.prototype.init.prototype=cY.prototype,cY.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cY.propHooks.scrollTop=cY.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(cZ(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bY).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cV(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cQ.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:cZ("show"),slideUp:cZ("hide"),slideToggle:cZ("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cY.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cN&&(cN=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cN),cN=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c$=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j,k,l,m=this[0],n=m&&m.ownerDocument;if(!n)return;return(e=n.body)===m?p.offset.bodyOffset(m):(d=n.documentElement,p.contains(d,m)?(c=m.getBoundingClientRect(),f=c_(n),g=d.clientTop||e.clientTop||0,h=d.clientLeft||e.clientLeft||0,i=f.pageYOffset||d.scrollTop,j=f.pageXOffset||d.scrollLeft,k=c.top+i-g,l=c.left+j-h,{top:k,left:l}):{top:0,left:0})},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c$.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c$.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=c_(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.ba-bbq.min.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.ba-bbq.min.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.ba-bbq.min.js	(revision 5961)
@@ -0,0 +1,18 @@
+/*
+ * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
+ * http://benalman.com/projects/jquery-bbq-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
+/*
+ * jQuery hashchange event - v1.2 - 2/11/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.slideto.min.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.slideto.min.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.slideto.min.js	(revision 5961)
@@ -0,0 +1,1 @@
+(function(b){b.fn.slideto=function(a){a=b.extend({slide_duration:"slow",highlight_duration:3E3,highlight:true,highlight_color:"#FFFF99"},a);return this.each(function(){obj=b(this);b("body").animate({scrollTop:obj.offset().top},a.slide_duration,function(){a.highlight&&b.ui.version&&obj.effect("highlight",{color:a.highlight_color},a.highlight_duration)})})}})(jQuery);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.wiggle.min.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.wiggle.min.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/jquery.wiggle.min.js	(revision 5961)
@@ -0,0 +1,8 @@
+/*
+jQuery Wiggle
+Author: WonderGroup, Jordan Thomas
+URL: http://labs.wondergroup.com/demos/mini-ui/index.html
+License: MIT (http://en.wikipedia.org/wiki/MIT_License)
+*/
+jQuery.fn.wiggle=function(o){var d={speed:50,wiggles:3,travel:5,callback:null};var o=jQuery.extend(d,o);return this.each(function(){var cache=this;var wrap=jQuery(this).wrap('<div class="wiggle-wrap"></div>').css("position","relative");var calls=0;for(i=1;i<=o.wiggles;i++){jQuery(this).animate({left:"-="+o.travel},o.speed).animate({left:"+="+o.travel*2},o.speed*2).animate({left:"-="+o.travel},o.speed,function(){calls++;if(jQuery(cache).parent().hasClass('wiggle-wrap')){jQuery(cache).parent().replaceWith(cache);}
+if(calls==o.wiggles&&jQuery.isFunction(o.callback)){o.callback();}});}});};
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/shred.bundle.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/shred.bundle.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/shred.bundle.js	(revision 5961)
@@ -0,0 +1,2765 @@
+var require = function (file, cwd) {
+    var resolved = require.resolve(file, cwd || '/');
+    var mod = require.modules[resolved];
+    if (!mod) throw new Error(
+        'Failed to resolve module ' + file + ', tried ' + resolved
+    );
+    var res = mod._cached ? mod._cached : mod();
+    return res;
+}
+
+require.paths = [];
+require.modules = {};
+require.extensions = [".js",".coffee"];
+
+require._core = {
+    'assert': true,
+    'events': true,
+    'fs': true,
+    'path': true,
+    'vm': true
+};
+
+require.resolve = (function () {
+    return function (x, cwd) {
+        if (!cwd) cwd = '/';
+        
+        if (require._core[x]) return x;
+        var path = require.modules.path();
+        var y = cwd || '.';
+        
+        if (x.match(/^(?:\.\.?\/|\/)/)) {
+            var m = loadAsFileSync(path.resolve(y, x))
+                || loadAsDirectorySync(path.resolve(y, x));
+            if (m) return m;
+        }
+        
+        var n = loadNodeModulesSync(x, y);
+        if (n) return n;
+        
+        throw new Error("Cannot find module '" + x + "'");
+        
+        function loadAsFileSync (x) {
+            if (require.modules[x]) {
+                return x;
+            }
+            
+            for (var i = 0; i < require.extensions.length; i++) {
+                var ext = require.extensions[i];
+                if (require.modules[x + ext]) return x + ext;
+            }
+        }
+        
+        function loadAsDirectorySync (x) {
+            x = x.replace(/\/+$/, '');
+            var pkgfile = x + '/package.json';
+            if (require.modules[pkgfile]) {
+                var pkg = require.modules[pkgfile]();
+                var b = pkg.browserify;
+                if (typeof b === 'object' && b.main) {
+                    var m = loadAsFileSync(path.resolve(x, b.main));
+                    if (m) return m;
+                }
+                else if (typeof b === 'string') {
+                    var m = loadAsFileSync(path.resolve(x, b));
+                    if (m) return m;
+                }
+                else if (pkg.main) {
+                    var m = loadAsFileSync(path.resolve(x, pkg.main));
+                    if (m) return m;
+                }
+            }
+            
+            return loadAsFileSync(x + '/index');
+        }
+        
+        function loadNodeModulesSync (x, start) {
+            var dirs = nodeModulesPathsSync(start);
+            for (var i = 0; i < dirs.length; i++) {
+                var dir = dirs[i];
+                var m = loadAsFileSync(dir + '/' + x);
+                if (m) return m;
+                var n = loadAsDirectorySync(dir + '/' + x);
+                if (n) return n;
+            }
+            
+            var m = loadAsFileSync(x);
+            if (m) return m;
+        }
+        
+        function nodeModulesPathsSync (start) {
+            var parts;
+            if (start === '/') parts = [ '' ];
+            else parts = path.normalize(start).split('/');
+            
+            var dirs = [];
+            for (var i = parts.length - 1; i >= 0; i--) {
+                if (parts[i] === 'node_modules') continue;
+                var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
+                dirs.push(dir);
+            }
+            
+            return dirs;
+        }
+    };
+})();
+
+require.alias = function (from, to) {
+    var path = require.modules.path();
+    var res = null;
+    try {
+        res = require.resolve(from + '/package.json', '/');
+    }
+    catch (err) {
+        res = require.resolve(from, '/');
+    }
+    var basedir = path.dirname(res);
+    
+    var keys = (Object.keys || function (obj) {
+        var res = [];
+        for (var key in obj) res.push(key)
+        return res;
+    })(require.modules);
+    
+    for (var i = 0; i < keys.length; i++) {
+        var key = keys[i];
+        if (key.slice(0, basedir.length + 1) === basedir + '/') {
+            var f = key.slice(basedir.length);
+            require.modules[to + f] = require.modules[basedir + f];
+        }
+        else if (key === basedir) {
+            require.modules[to] = require.modules[basedir];
+        }
+    }
+};
+
+require.define = function (filename, fn) {
+    var dirname = require._core[filename]
+        ? ''
+        : require.modules.path().dirname(filename)
+    ;
+    
+    var require_ = function (file) {
+        return require(file, dirname)
+    };
+    require_.resolve = function (name) {
+        return require.resolve(name, dirname);
+    };
+    require_.modules = require.modules;
+    require_.define = require.define;
+    var module_ = { exports : {} };
+    
+    require.modules[filename] = function () {
+        require.modules[filename]._cached = module_.exports;
+        fn.call(
+            module_.exports,
+            require_,
+            module_,
+            module_.exports,
+            dirname,
+            filename
+        );
+        require.modules[filename]._cached = module_.exports;
+        return module_.exports;
+    };
+};
+
+if (typeof process === 'undefined') process = {};
+
+if (!process.nextTick) process.nextTick = (function () {
+    var queue = [];
+    var canPost = typeof window !== 'undefined'
+        && window.postMessage && window.addEventListener
+    ;
+    
+    if (canPost) {
+        window.addEventListener('message', function (ev) {
+            if (ev.source === window && ev.data === 'browserify-tick') {
+                ev.stopPropagation();
+                if (queue.length > 0) {
+                    var fn = queue.shift();
+                    fn();
+                }
+            }
+        }, true);
+    }
+    
+    return function (fn) {
+        if (canPost) {
+            queue.push(fn);
+            window.postMessage('browserify-tick', '*');
+        }
+        else setTimeout(fn, 0);
+    };
+})();
+
+if (!process.title) process.title = 'browser';
+
+if (!process.binding) process.binding = function (name) {
+    if (name === 'evals') return require('vm')
+    else throw new Error('No such module')
+};
+
+if (!process.cwd) process.cwd = function () { return '.' };
+
+require.define("path", function (require, module, exports, __dirname, __filename) {
+    function filter (xs, fn) {
+    var res = [];
+    for (var i = 0; i < xs.length; i++) {
+        if (fn(xs[i], i, xs)) res.push(xs[i]);
+    }
+    return res;
+}
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+  // if the path tries to go above the root, `up` ends up > 0
+  var up = 0;
+  for (var i = parts.length; i >= 0; i--) {
+    var last = parts[i];
+    if (last == '.') {
+      parts.splice(i, 1);
+    } else if (last === '..') {
+      parts.splice(i, 1);
+      up++;
+    } else if (up) {
+      parts.splice(i, 1);
+      up--;
+    }
+  }
+
+  // if the path is allowed to go above the root, restore leading ..s
+  if (allowAboveRoot) {
+    for (; up--; up) {
+      parts.unshift('..');
+    }
+  }
+
+  return parts;
+}
+
+// Regex to split a filename into [*, dir, basename, ext]
+// posix version
+var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+var resolvedPath = '',
+    resolvedAbsolute = false;
+
+for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
+  var path = (i >= 0)
+      ? arguments[i]
+      : process.cwd();
+
+  // Skip empty and invalid entries
+  if (typeof path !== 'string' || !path) {
+    continue;
+  }
+
+  resolvedPath = path + '/' + resolvedPath;
+  resolvedAbsolute = path.charAt(0) === '/';
+}
+
+// At this point the path should be resolved to a full absolute path, but
+// handle relative paths to be safe (might happen when process.cwd() fails)
+
+// Normalize the path
+resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+    return !!p;
+  }), !resolvedAbsolute).join('/');
+
+  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+var isAbsolute = path.charAt(0) === '/',
+    trailingSlash = path.slice(-1) === '/';
+
+// Normalize the path
+path = normalizeArray(filter(path.split('/'), function(p) {
+    return !!p;
+  }), !isAbsolute).join('/');
+
+  if (!path && !isAbsolute) {
+    path = '.';
+  }
+  if (path && trailingSlash) {
+    path += '/';
+  }
+  
+  return (isAbsolute ? '/' : '') + path;
+};
+
+
+// posix version
+exports.join = function() {
+  var paths = Array.prototype.slice.call(arguments, 0);
+  return exports.normalize(filter(paths, function(p, index) {
+    return p && typeof p === 'string';
+  }).join('/'));
+};
+
+
+exports.dirname = function(path) {
+  var dir = splitPathRe.exec(path)[1] || '';
+  var isWindows = false;
+  if (!dir) {
+    // No dirname
+    return '.';
+  } else if (dir.length === 1 ||
+      (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
+    // It is just a slash or a drive letter with a slash
+    return dir;
+  } else {
+    // It is a full dirname, strip trailing slash
+    return dir.substring(0, dir.length - 1);
+  }
+};
+
+
+exports.basename = function(path, ext) {
+  var f = splitPathRe.exec(path)[2] || '';
+  // TODO: make this comparison case-insensitive on windows?
+  if (ext && f.substr(-1 * ext.length) === ext) {
+    f = f.substr(0, f.length - ext.length);
+  }
+  return f;
+};
+
+
+exports.extname = function(path) {
+  return splitPathRe.exec(path)[3] || '';
+};
+
+});
+
+require.define("/shred.js", function (require, module, exports, __dirname, __filename) {
+    // Shred is an HTTP client library intended to simplify the use of Node's
+// built-in HTTP library. In particular, we wanted to make it easier to interact
+// with HTTP-based APIs.
+// 
+// See the [examples](./examples.html) for more details.
+
+// Ax is a nice logging library we wrote. You can use any logger, providing it
+// has `info`, `warn`, `debug`, and `error` methods that take a string.
+var Ax = require("ax")
+  , CookieJarLib = require( "cookiejar" )
+  , CookieJar = CookieJarLib.CookieJar
+;
+
+// Shred takes some options, including a logger and request defaults.
+
+var Shred = function(options) {
+  options = (options||{});
+  this.agent = options.agent;
+  this.defaults = options.defaults||{};
+  this.log = options.logger||(new Ax({ level: "info" }));
+  this._sharedCookieJar = new CookieJar();
+  this.logCurl = options.logCurl || false;
+};
+
+// Most of the real work is done in the request and reponse classes.
+ 
+Shred.Request = require("./shred/request");
+Shred.Response = require("./shred/response");
+
+// The `request` method kicks off a new request, instantiating a new `Request`
+// object and passing along whatever default options we were given.
+
+Shred.prototype = {
+  request: function(options) {
+    options.logger = this.log;
+    options.logCurl = options.logCurl || this.logCurl;
+    options.cookieJar = ( 'cookieJar' in options ) ? options.cookieJar : this._sharedCookieJar; // let them set cookieJar = null
+    options.agent = options.agent || this.agent;
+    // fill in default options
+    for (var key in this.defaults) {
+      if (this.defaults.hasOwnProperty(key) && !options[key]) {
+        options[key] = this.defaults[key]
+      }
+    }
+    return new Shred.Request(options);
+  }
+};
+
+// Define a bunch of convenience methods so that you don't have to include
+// a `method` property in your request options.
+
+"get put post delete".split(" ").forEach(function(method) {
+  Shred.prototype[method] = function(options) {
+    options.method = method;
+    return this.request(options);
+  };
+});
+
+
+module.exports = Shred;
+
+});
+
+require.define("/node_modules/ax/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"./lib/ax.js"}
+});
+
+require.define("/node_modules/ax/lib/ax.js", function (require, module, exports, __dirname, __filename) {
+    var inspect = require("util").inspect
+  , fs = require("fs")
+;
+
+
+// this is a quick-and-dirty logger. there are other nicer loggers out there
+// but the ones i found were also somewhat involved. this one has a Ruby
+// logger type interface
+//
+// we can easily replace this, provide the info, debug, etc. methods are the
+// same. or, we can change Haiku to use a more standard node.js interface
+
+var format = function(level,message) {
+  var debug = (level=="debug"||level=="error");
+  if (!message) { return message.toString(); }
+  if (typeof(message) == "object") {
+    if (message instanceof Error && debug) {
+      return message.stack;
+    } else {
+      return inspect(message);
+    }
+  } else {
+    return message.toString();
+  }
+};
+
+var noOp = function(message) { return this; }
+var makeLogger = function(level,fn) {
+  return function(message) { 
+    this.stream.write(this.format(level, message)+"\n");
+    return this;
+  }
+};
+
+var Logger = function(options) {
+  var logger = this;
+  var options = options||{};
+
+  // Default options
+  options.level = options.level || "info";
+  options.timestamp = options.timestamp || true;
+  options.prefix = options.prefix || "";
+  logger.options = options;
+
+  // Allows a prefix to be added to the message.
+  //
+  //    var logger = new Ax({ module: 'Haiku' })
+  //    logger.warn('this is going to be awesome!');
+  //    //=> Haiku: this is going to be awesome!
+  //
+  if (logger.options.module){
+    logger.options.prefix = logger.options.module;
+  }
+
+  // Write to stderr or a file
+  if (logger.options.file){
+    logger.stream = fs.createWriteStream(logger.options.file, {"flags": "a"});
+  } else {
+      if(process.title === "node")
+    logger.stream = process.stderr;
+      else if(process.title === "browser")
+    logger.stream = function () {
+      // Work around weird console context issue: http://code.google.com/p/chromium/issues/detail?id=48662
+      return console[logger.options.level].apply(console, arguments);
+    };
+  }
+
+  switch(logger.options.level){
+    case 'debug':
+      ['debug', 'info', 'warn'].forEach(function (level) {
+        logger[level] = Logger.writer(level);
+      });
+    case 'info':
+      ['info', 'warn'].forEach(function (level) {
+        logger[level] = Logger.writer(level);
+      });
+    case 'warn':
+      logger.warn = Logger.writer('warn');
+  }
+}
+
+// Used to define logger methods
+Logger.writer = function(level){
+  return function(message){
+    var logger = this;
+
+    if(process.title === "node")
+  logger.stream.write(logger.format(level, message) + '\n');
+    else if(process.title === "browser")
+  logger.stream(logger.format(level, message) + '\n');
+
+  };
+}
+
+
+Logger.prototype = {
+  info: function(){},
+  debug: function(){},
+  warn: function(){},
+  error: Logger.writer('error'),
+  format: function(level, message){
+    if (! message) return '';
+
+    var logger = this
+      , prefix = logger.options.prefix
+      , timestamp = logger.options.timestamp ? " " + (new Date().toISOString()) : ""
+    ;
+
+    return (prefix + timestamp + ": " + message);
+  }
+};
+
+module.exports = Logger;
+
+});
+
+require.define("util", function (require, module, exports, __dirname, __filename) {
+    // todo
+
+});
+
+require.define("fs", function (require, module, exports, __dirname, __filename) {
+    // nothing to see here... no file methods for the browser
+
+});
+
+require.define("/node_modules/cookiejar/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"cookiejar.js"}
+});
+
+require.define("/node_modules/cookiejar/cookiejar.js", function (require, module, exports, __dirname, __filename) {
+    exports.CookieAccessInfo=CookieAccessInfo=function CookieAccessInfo(domain,path,secure,script) {
+    if(this instanceof CookieAccessInfo) {
+      this.domain=domain||undefined;
+      this.path=path||"/";
+      this.secure=!!secure;
+      this.script=!!script;
+      return this;
+    }
+    else {
+        return new CookieAccessInfo(domain,path,secure,script)    
+    }
+}
+
+exports.Cookie=Cookie=function Cookie(cookiestr) {
+  if(cookiestr instanceof Cookie) {
+    return cookiestr;
+  }
+    else {
+        if(this instanceof Cookie) {
+          this.name = null;
+          this.value = null;
+          this.expiration_date = Infinity;
+          this.path = "/";
+          this.domain = null;
+          this.secure = false; //how to define?
+          this.noscript = false; //httponly
+          if(cookiestr) {
+            this.parse(cookiestr)
+          }
+          return this;
+        }
+        return new Cookie(cookiestr)
+    }
+}
+
+Cookie.prototype.toString = function toString() {
+  var str=[this.name+"="+this.value];
+  if(this.expiration_date !== Infinity) {
+    str.push("expires="+(new Date(this.expiration_date)).toGMTString());
+  }
+  if(this.domain) {
+    str.push("domain="+this.domain);
+  }
+  if(this.path) {
+    str.push("path="+this.path);
+  }
+  if(this.secure) {
+    str.push("secure");
+  }
+  if(this.noscript) {
+    str.push("httponly");
+  }
+  return str.join("; ");
+}
+
+Cookie.prototype.toValueString = function toValueString() {
+  return this.name+"="+this.value;
+}
+
+var cookie_str_splitter=/[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g
+Cookie.prototype.parse = function parse(str) {
+  if(this instanceof Cookie) {
+      var parts=str.split(";")
+      , pair=parts[0].match(/([^=]+)=((?:.|\n)*)/)
+      , key=pair[1]
+      , value=pair[2];
+      this.name = key;
+      this.value = value;
+    
+      for(var i=1;i<parts.length;i++) {
+        pair=parts[i].match(/([^=]+)(?:=((?:.|\n)*))?/)
+        , key=pair[1].trim().toLowerCase()
+        , value=pair[2];
+        switch(key) {
+          case "httponly":
+            this.noscript = true;
+          break;
+          case "expires":
+            this.expiration_date = value
+              ? Number(Date.parse(value))
+              : Infinity;
+          break;
+          case "path":
+            this.path = value
+              ? value.trim()
+              : "";
+          break;
+          case "domain":
+            this.domain = value
+              ? value.trim()
+              : "";
+          break;
+          case "secure":
+            this.secure = true;
+          break
+        }
+      }
+    
+      return this;
+  }
+    return new Cookie().parse(str)
+}
+
+Cookie.prototype.matches = function matches(access_info) {
+  if(this.noscript && access_info.script
+  || this.secure && !access_info.secure
+  || !this.collidesWith(access_info)) {
+    return false
+  }
+  return true;
+}
+
+Cookie.prototype.collidesWith = function collidesWith(access_info) {
+  if((this.path && !access_info.path) || (this.domain && !access_info.domain)) {
+    return false
+  }
+  if(this.path && access_info.path.indexOf(this.path) !== 0) {
+    return false;
+  }
+  if (this.domain===access_info.domain) {
+    return true;
+  }
+  else if(this.domain && this.domain.charAt(0)===".")
+  {
+    var wildcard=access_info.domain.indexOf(this.domain.slice(1))
+    if(wildcard===-1 || wildcard!==access_info.domain.length-this.domain.length+1) {
+      return false;
+    }
+  }
+  else if(this.domain){
+    return false
+  }
+  return true;
+}
+
+exports.CookieJar=CookieJar=function CookieJar() {
+  if(this instanceof CookieJar) {
+      var cookies = {} //name: [Cookie]
+    
+      this.setCookie = function setCookie(cookie) {
+        cookie = Cookie(cookie);
+        //Delete the cookie if the set is past the current time
+        var remove = cookie.expiration_date <= Date.now();
+        if(cookie.name in cookies) {
+          var cookies_list = cookies[cookie.name];
+          for(var i=0;i<cookies_list.length;i++) {
+            var collidable_cookie = cookies_list[i];
+            if(collidable_cookie.collidesWith(cookie)) {
+              if(remove) {
+                cookies_list.splice(i,1);
+                if(cookies_list.length===0) {
+                  delete cookies[cookie.name]
+                }
+                return false;
+              }
+              else {
+                return cookies_list[i]=cookie;
+              }
+            }
+          }
+          if(remove) {
+            return false;
+          }
+          cookies_list.push(cookie);
+          return cookie;
+        }
+        else if(remove){
+          return false;
+        }
+        else {
+          return cookies[cookie.name]=[cookie];
+        }
+      }
+      //returns a cookie
+      this.getCookie = function getCookie(cookie_name,access_info) {
+        var cookies_list = cookies[cookie_name];
+        for(var i=0;i<cookies_list.length;i++) {
+          var cookie = cookies_list[i];
+          if(cookie.expiration_date <= Date.now()) {
+            if(cookies_list.length===0) {
+              delete cookies[cookie.name]
+            }
+            continue;
+          }
+          if(cookie.matches(access_info)) {
+            return cookie;
+          }
+        }
+      }
+      //returns a list of cookies
+      this.getCookies = function getCookies(access_info) {
+        var matches=[];
+        for(var cookie_name in cookies) {
+          var cookie=this.getCookie(cookie_name,access_info);
+          if (cookie) {
+            matches.push(cookie);
+          }
+        }
+        matches.toString=function toString(){return matches.join(":");}
+            matches.toValueString=function() {return matches.map(function(c){return c.toValueString();}).join(';');}
+        return matches;
+      }
+    
+      return this;
+  }
+    return new CookieJar()
+}
+
+
+//returns list of cookies that were set correctly
+CookieJar.prototype.setCookies = function setCookies(cookies) {
+  cookies=Array.isArray(cookies)
+    ?cookies
+    :cookies.split(cookie_str_splitter);
+  var successful=[]
+  for(var i=0;i<cookies.length;i++) {
+    var cookie = Cookie(cookies[i]);
+    if(this.setCookie(cookie)) {
+      successful.push(cookie);
+    }
+  }
+  return successful;
+}
+
+});
+
+require.define("/shred/request.js", function (require, module, exports, __dirname, __filename) {
+    // The request object encapsulates a request, creating a Node.js HTTP request and
+// then handling the response.
+
+var HTTP = require("http")
+  , HTTPS = require("https")
+  , parseUri = require("./parseUri")
+  , Emitter = require('events').EventEmitter
+  , sprintf = require("sprintf").sprintf
+  , Response = require("./response")
+  , HeaderMixins = require("./mixins/headers")
+  , Content = require("./content")
+;
+
+var STATUS_CODES = HTTP.STATUS_CODES || {
+    100 : 'Continue',
+    101 : 'Switching Protocols',
+    102 : 'Processing', // RFC 2518, obsoleted by RFC 4918
+    200 : 'OK',
+    201 : 'Created',
+    202 : 'Accepted',
+    203 : 'Non-Authoritative Information',
+    204 : 'No Content',
+    205 : 'Reset Content',
+    206 : 'Partial Content',
+    207 : 'Multi-Status', // RFC 4918
+    300 : 'Multiple Choices',
+    301 : 'Moved Permanently',
+    302 : 'Moved Temporarily',
+    303 : 'See Other',
+    304 : 'Not Modified',
+    305 : 'Use Proxy',
+    307 : 'Temporary Redirect',
+    400 : 'Bad Request',
+    401 : 'Unauthorized',
+    402 : 'Payment Required',
+    403 : 'Forbidden',
+    404 : 'Not Found',
+    405 : 'Method Not Allowed',
+    406 : 'Not Acceptable',
+    407 : 'Proxy Authentication Required',
+    408 : 'Request Time-out',
+    409 : 'Conflict',
+    410 : 'Gone',
+    411 : 'Length Required',
+    412 : 'Precondition Failed',
+    413 : 'Request Entity Too Large',
+    414 : 'Request-URI Too Large',
+    415 : 'Unsupported Media Type',
+    416 : 'Requested Range Not Satisfiable',
+    417 : 'Expectation Failed',
+    418 : 'I\'m a teapot', // RFC 2324
+    422 : 'Unprocessable Entity', // RFC 4918
+    423 : 'Locked', // RFC 4918
+    424 : 'Failed Dependency', // RFC 4918
+    425 : 'Unordered Collection', // RFC 4918
+    426 : 'Upgrade Required', // RFC 2817
+    500 : 'Internal Server Error',
+    501 : 'Not Implemented',
+    502 : 'Bad Gateway',
+    503 : 'Service Unavailable',
+    504 : 'Gateway Time-out',
+    505 : 'HTTP Version not supported',
+    506 : 'Variant Also Negotiates', // RFC 2295
+    507 : 'Insufficient Storage', // RFC 4918
+    509 : 'Bandwidth Limit Exceeded',
+    510 : 'Not Extended' // RFC 2774
+};
+
+// The Shred object itself constructs the `Request` object. You should rarely
+// need to do this directly.
+
+var Request = function(options) {
+  this.log = options.logger;
+  this.cookieJar = options.cookieJar;
+  this.encoding = options.encoding;
+  this.logCurl = options.logCurl;
+  processOptions(this,options||{});
+  createRequest(this);
+};
+
+// A `Request` has a number of properties, many of which help with details like
+// URL parsing or defaulting the port for the request.
+
+Object.defineProperties(Request.prototype, {
+
+// - **url**. You can set the `url` property with a valid URL string and all the
+//   URL-related properties (host, port, etc.) will be automatically set on the
+//   request object.
+
+  url: {
+    get: function() {
+      if (!this.scheme) { return null; }
+      return sprintf("%s://%s:%s%s",
+          this.scheme, this.host, this.port,
+          (this.proxy ? "/" : this.path) +
+          (this.query ? ("?" + this.query) : ""));
+    },
+    set: function(_url) {
+      _url = parseUri(_url);
+      this.scheme = _url.protocol;
+      this.host = _url.host;
+      this.port = _url.port;
+      this.path = _url.path;
+      this.query = _url.query;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **headers**. Returns a hash representing the request headers. You can't set
+//   this directly, only get it. You can add or modify headers by using the
+//   `setHeader` or `setHeaders` method. This ensures that the headers are
+//   normalized - that is, you don't accidentally send `Content-Type` and
+//   `content-type` headers. Keep in mind that if you modify the returned hash,
+//   it will *not* modify the request headers.
+
+  headers: {
+    get: function() {
+      return this.getHeaders();
+    },
+    enumerable: true
+  },
+
+// - **port**. Unless you set the `port` explicitly or include it in the URL, it
+//   will default based on the scheme.
+
+  port: {
+    get: function() {
+      if (!this._port) {
+        switch(this.scheme) {
+          case "https": return this._port = 443;
+          case "http":
+          default: return this._port = 80;
+        }
+      }
+      return this._port;
+    },
+    set: function(value) { this._port = value; return this; },
+    enumerable: true
+  },
+
+// - **method**. The request method - `get`, `put`, `post`, etc. that will be
+//   used to make the request. Defaults to `get`.
+
+  method: {
+    get: function() {
+      return this._method = (this._method||"GET");
+    },
+    set: function(value) {
+      this._method = value; return this;
+    },
+    enumerable: true
+  },
+
+// - **query**. Can be set either with a query string or a hash (object). Get
+//   will always return a properly escaped query string or null if there is no
+//   query component for the request.
+
+  query: {
+    get: function() {return this._query;},
+    set: function(value) {
+      var stringify = function (hash) {
+        var query = "";
+        for (var key in hash) {
+          query += encodeURIComponent(key) + '=' + encodeURIComponent(hash[key]) + '&';
+        }
+        // Remove the last '&'
+        query = query.slice(0, -1);
+        return query;
+      }
+
+      if (value) {
+        if (typeof value === 'object') {
+          value = stringify(value);
+        }
+        this._query = value;
+      } else {
+        this._query = "";
+      }
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **parameters**. This will return the query parameters in the form of a hash
+//   (object).
+
+  parameters: {
+    get: function() { return QueryString.parse(this._query||""); },
+    enumerable: true
+  },
+
+// - **content**. (Aliased as `body`.) Set this to add a content entity to the
+//   request. Attempts to use the `content-type` header to determine what to do
+//   with the content value. Get this to get back a [`Content`
+//   object](./content.html).
+
+  body: {
+    get: function() { return this._body; },
+    set: function(value) {
+      this._body = new Content({
+        data: value,
+        type: this.getHeader("Content-Type")
+      });
+      this.setHeader("Content-Type",this.content.type);
+      this.setHeader("Content-Length",this.content.length);
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **timeout**. Used to determine how long to wait for a response. Does not
+//   distinguish between connect timeouts versus request timeouts. Set either in
+//   milliseconds or with an object with temporal attributes (hours, minutes,
+//   seconds) and convert it into milliseconds. Get will always return
+//   milliseconds.
+
+  timeout: {
+    get: function() { return this._timeout; }, // in milliseconds
+    set: function(timeout) {
+      var request = this
+        , milliseconds = 0;
+      ;
+      if (!timeout) return this;
+      if (typeof timeout==="number") { milliseconds = timeout; }
+      else {
+        milliseconds = (timeout.milliseconds||0) +
+          (1000 * ((timeout.seconds||0) +
+              (60 * ((timeout.minutes||0) +
+                (60 * (timeout.hours||0))))));
+      }
+      this._timeout = milliseconds;
+      return this;
+    },
+    enumerable: true
+  }
+});
+
+// Alias `body` property to `content`. Since the [content object](./content.html)
+// has a `body` attribute, it's preferable to use `content` since you can then
+// access the raw content data using `content.body`.
+
+Object.defineProperty(Request.prototype,"content",
+    Object.getOwnPropertyDescriptor(Request.prototype, "body"));
+
+// The `Request` object can be pretty overwhelming to view using the built-in
+// Node.js inspect method. We want to make it a bit more manageable. This
+// probably goes [too far in the other
+// direction](https://github.com/spire-io/shred/issues/2).
+
+Request.prototype.inspect = function () {
+  var request = this;
+  var headers = this.format_headers();
+  var summary = ["<Shred Request> ", request.method.toUpperCase(),
+      request.url].join(" ")
+  return [ summary, "- Headers:", headers].join("\n");
+};
+
+Request.prototype.format_headers = function () {
+  var array = []
+  var headers = this._headers
+  for (var key in headers) {
+    if (headers.hasOwnProperty(key)) {
+      var value = headers[key]
+      array.push("\t" + key + ": " + value);
+    }
+  }
+  return array.join("\n");
+};
+
+// Allow chainable 'on's:  shred.get({ ... }).on( ... ).  You can pass in a
+// single function, a pair (event, function), or a hash:
+// { event: function, event: function }
+Request.prototype.on = function (eventOrHash, listener) {
+  var emitter = this.emitter;
+  // Pass in a single argument as a function then make it the default response handler
+  if (arguments.length === 1 && typeof(eventOrHash) === 'function') {
+    emitter.on('response', eventOrHash);
+  } else if (arguments.length === 1 && typeof(eventOrHash) === 'object') {
+    for (var key in eventOrHash) {
+      if (eventOrHash.hasOwnProperty(key)) {
+        emitter.on(key, eventOrHash[key]);
+      }
+    }
+  } else {
+    emitter.on(eventOrHash, listener);
+  }
+  return this;
+};
+
+// Add in the header methods. Again, these ensure we don't get the same header
+// multiple times with different case conventions.
+HeaderMixins.gettersAndSetters(Request);
+
+// `processOptions` is called from the constructor to handle all the work
+// associated with making sure we do our best to ensure we have a valid request.
+
+var processOptions = function(request,options) {
+
+  request.log.debug("Processing request options ..");
+
+  // We'll use `request.emitter` to manage the `on` event handlers.
+  request.emitter = (new Emitter);
+
+  request.agent = options.agent;
+
+  // Set up the handlers ...
+  if (options.on) {
+    for (var key in options.on) {
+      if (options.on.hasOwnProperty(key)) {
+        request.emitter.on(key, options.on[key]);
+      }
+    }
+  }
+
+  // Make sure we were give a URL or a host
+  if (!options.url && !options.host) {
+    request.emitter.emit("request_error",
+        new Error("No url or url options (host, port, etc.)"));
+    return;
+  }
+
+  // Allow for the [use of a proxy](http://www.jmarshall.com/easy/http/#proxies).
+
+  if (options.url) {
+    if (options.proxy) {
+      request.url = options.proxy;
+      request.path = options.url;
+    } else {
+      request.url = options.url;
+    }
+  }
+
+  // Set the remaining options.
+  request.query = options.query||options.parameters||request.query ;
+  request.method = options.method;
+  request.setHeader("user-agent",options.agent||"Shred");
+  request.setHeaders(options.headers);
+
+  if (request.cookieJar) {
+    var cookies = request.cookieJar.getCookies( CookieAccessInfo( request.host, request.path ) );
+    if (cookies.length) {
+      var cookieString = request.getHeader('cookie')||'';
+      for (var cookieIndex = 0; cookieIndex < cookies.length; ++cookieIndex) {
+          if ( cookieString.length && cookieString[ cookieString.length - 1 ] != ';' )
+          {
+              cookieString += ';';
+          }
+          cookieString += cookies[ cookieIndex ].name + '=' + cookies[ cookieIndex ].value + ';';
+      }
+      request.setHeader("cookie", cookieString);
+    }
+  }
+  
+  // The content entity can be set either using the `body` or `content` attributes.
+  if (options.body||options.content) {
+    request.content = options.body||options.content;
+  }
+  request.timeout = options.timeout;
+
+};
+
+// `createRequest` is also called by the constructor, after `processOptions`.
+// This actually makes the request and processes the response, so `createRequest`
+// is a bit of a misnomer.
+
+var createRequest = function(request) {
+  var timeout ;
+
+  request.log.debug("Creating request ..");
+  request.log.debug(request);
+
+  var reqParams = {
+    host: request.host,
+    port: request.port,
+    method: request.method,
+    path: request.path + (request.query ? '?'+request.query : ""),
+    headers: request.getHeaders(),
+    // Node's HTTP/S modules will ignore this, but we are using the
+    // browserify-http module in the browser for both HTTP and HTTPS, and this
+    // is how you differentiate the two.
+    scheme: request.scheme,
+    // Use a provided agent.  'Undefined' is the default, which uses a global
+    // agent.
+    agent: request.agent
+  };
+
+  if (request.logCurl) {
+    logCurl(request);
+  }
+
+  var http = request.scheme == "http" ? HTTP : HTTPS;
+
+  // Set up the real request using the selected library. The request won't be
+  // sent until we call `.end()`.
+  request._raw = http.request(reqParams, function(response) {
+    request.log.debug("Received response ..");
+
+    // We haven't timed out and we have a response, so make sure we clear the
+    // timeout so it doesn't fire while we're processing the response.
+    clearTimeout(timeout);
+
+    // Construct a Shred `Response` object from the response. This will stream
+    // the response, thus the need for the callback. We can access the response
+    // entity safely once we're in the callback.
+    response = new Response(response, request, function(response) {
+
+      // Set up some event magic. The precedence is given first to
+      // status-specific handlers, then to responses for a given event, and then
+      // finally to the more general `response` handler. In the last case, we
+      // need to first make sure we're not dealing with a a redirect.
+      var emit = function(event) {
+        var emitter = request.emitter;
+        var textStatus = STATUS_CODES[response.status] ? STATUS_CODES[response.status].toLowerCase() : null;
+        if (emitter.listeners(response.status).length > 0 || emitter.listeners(textStatus).length > 0) {
+          emitter.emit(response.status, response);
+          emitter.emit(textStatus, response);
+        } else {
+          if (emitter.listeners(event).length>0) {
+            emitter.emit(event, response);
+          } else if (!response.isRedirect) {
+            emitter.emit("response", response);
+            //console.warn("Request has no event listener for status code " + response.status);
+          }
+        }
+      };
+
+      // Next, check for a redirect. We simply repeat the request with the URL
+      // given in the `Location` header. We fire a `redirect` event.
+      if (response.isRedirect) {
+        request.log.debug("Redirecting to "
+            + response.getHeader("Location"));
+        request.url = response.getHeader("Location");
+        emit("redirect");
+        createRequest(request);
+
+      // Okay, it's not a redirect. Is it an error of some kind?
+      } else if (response.isError) {
+        emit("error");
+      } else {
+      // It looks like we're good shape. Trigger the `success` event.
+        emit("success");
+      }
+    });
+  });
+
+  // We're still setting up the request. Next, we're going to handle error cases
+  // where we have no response. We don't emit an error event because that event
+  // takes a response. We don't response handlers to have to check for a null
+  // value. However, we [should introduce a different event
+  // type](https://github.com/spire-io/shred/issues/3) for this type of error.
+  request._raw.on("error", function(error) {
+    request.emitter.emit("request_error", error);
+  });
+
+  request._raw.on("socket", function(socket) {
+    request.emitter.emit("socket", socket);
+  });
+
+  // TCP timeouts should also trigger the "response_error" event.
+  request._raw.on('socket', function () {
+    request._raw.socket.on('timeout', function () {
+      // This should trigger the "error" event on the raw request, which will
+      // trigger the "response_error" on the shred request.
+      request._raw.abort();
+    });
+  });
+
+
+  // We're almost there. Next, we need to write the request entity to the
+  // underlying request object.
+  if (request.content) {
+    request.log.debug("Streaming body: '" +
+        request.content.data.slice(0,59) + "' ... ");
+    request._raw.write(request.content.data);
+  }
+
+  // Finally, we need to set up the timeout. We do this last so that we don't
+  // start the clock ticking until the last possible moment.
+  if (request.timeout) {
+    timeout = setTimeout(function() {
+      request.log.debug("Timeout fired, aborting request ...");
+      request._raw.abort();
+      request.emitter.emit("timeout", request);
+    },request.timeout);
+  }
+
+  // The `.end()` method will cause the request to fire. Technically, it might
+  // have already sent the headers and body.
+  request.log.debug("Sending request ...");
+  request._raw.end();
+};
+
+// Logs the curl command for the request.
+var logCurl = function (req) {
+  var headers = req.getHeaders();
+  var headerString = "";
+
+  for (var key in headers) {
+    headerString += '-H "' + key + ": " + headers[key] + '" ';
+  }
+
+  var bodyString = ""
+
+  if (req.content) {
+    bodyString += "-d '" + req.content.body + "' ";
+  }
+
+  var query = req.query ? '?' + req.query : "";
+
+  console.log("curl " +
+    "-X " + req.method.toUpperCase() + " " +
+    req.scheme + "://" + req.host + ":" + req.port + req.path + query + " " +
+    headerString +
+    bodyString
+  );
+};
+
+
+module.exports = Request;
+
+});
+
+require.define("http", function (require, module, exports, __dirname, __filename) {
+    // todo
+
+});
+
+require.define("https", function (require, module, exports, __dirname, __filename) {
+    // todo
+
+});
+
+require.define("/shred/parseUri.js", function (require, module, exports, __dirname, __filename) {
+    // parseUri 1.2.2
+// (c) Steven Levithan <stevenlevithan.com>
+// MIT License
+
+function parseUri (str) {
+  var o   = parseUri.options,
+    m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
+    uri = {},
+    i   = 14;
+
+  while (i--) uri[o.key[i]] = m[i] || "";
+
+  uri[o.q.name] = {};
+  uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
+    if ($1) uri[o.q.name][$1] = $2;
+  });
+
+  return uri;
+};
+
+parseUri.options = {
+  strictMode: false,
+  key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
+  q:   {
+    name:   "queryKey",
+    parser: /(?:^|&)([^&=]*)=?([^&]*)/g
+  },
+  parser: {
+    strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
+    loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
+  }
+};
+
+module.exports = parseUri;
+
+});
+
+require.define("events", function (require, module, exports, __dirname, __filename) {
+    if (!process.EventEmitter) process.EventEmitter = function () {};
+
+var EventEmitter = exports.EventEmitter = process.EventEmitter;
+var isArray = typeof Array.isArray === 'function'
+    ? Array.isArray
+    : function (xs) {
+        return Object.toString.call(xs) === '[object Array]'
+    }
+;
+
+// By default EventEmitters will print a warning if more than
+// 10 listeners are added to it. This is a useful default which
+// helps finding memory leaks.
+//
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+var defaultMaxListeners = 10;
+EventEmitter.prototype.setMaxListeners = function(n) {
+  if (!this._events) this._events = {};
+  this._events.maxListeners = n;
+};
+
+
+EventEmitter.prototype.emit = function(type) {
+  // If there is no 'error' event listener then throw.
+  if (type === 'error') {
+    if (!this._events || !this._events.error ||
+        (isArray(this._events.error) && !this._events.error.length))
+    {
+      if (arguments[1] instanceof Error) {
+        throw arguments[1]; // Unhandled 'error' event
+      } else {
+        throw new Error("Uncaught, unspecified 'error' event.");
+      }
+      return false;
+    }
+  }
+
+  if (!this._events) return false;
+  var handler = this._events[type];
+  if (!handler) return false;
+
+  if (typeof handler == 'function') {
+    switch (arguments.length) {
+      // fast cases
+      case 1:
+        handler.call(this);
+        break;
+      case 2:
+        handler.call(this, arguments[1]);
+        break;
+      case 3:
+        handler.call(this, arguments[1], arguments[2]);
+        break;
+      // slower
+      default:
+        var args = Array.prototype.slice.call(arguments, 1);
+        handler.apply(this, args);
+    }
+    return true;
+
+  } else if (isArray(handler)) {
+    var args = Array.prototype.slice.call(arguments, 1);
+
+    var listeners = handler.slice();
+    for (var i = 0, l = listeners.length; i < l; i++) {
+      listeners[i].apply(this, args);
+    }
+    return true;
+
+  } else {
+    return false;
+  }
+};
+
+// EventEmitter is defined in src/node_events.cc
+// EventEmitter.prototype.emit() is also defined there.
+EventEmitter.prototype.addListener = function(type, listener) {
+  if ('function' !== typeof listener) {
+    throw new Error('addListener only takes instances of Function');
+  }
+
+  if (!this._events) this._events = {};
+
+  // To avoid recursion in the case that type == "newListeners"! Before
+  // adding it to the listeners, first emit "newListeners".
+  this.emit('newListener', type, listener);
+
+  if (!this._events[type]) {
+    // Optimize the case of one listener. Don't need the extra array object.
+    this._events[type] = listener;
+  } else if (isArray(this._events[type])) {
+
+    // Check for listener leak
+    if (!this._events[type].warned) {
+      var m;
+      if (this._events.maxListeners !== undefined) {
+        m = this._events.maxListeners;
+      } else {
+        m = defaultMaxListeners;
+      }
+
+      if (m && m > 0 && this._events[type].length > m) {
+        this._events[type].warned = true;
+        console.error('(node) warning: possible EventEmitter memory ' +
+                      'leak detected. %d listeners added. ' +
+                      'Use emitter.setMaxListeners() to increase limit.',
+                      this._events[type].length);
+        console.trace();
+      }
+    }
+
+    // If we've already got an array, just append.
+    this._events[type].push(listener);
+  } else {
+    // Adding the second element, need to change to array.
+    this._events[type] = [this._events[type], listener];
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+  var self = this;
+  self.on(type, function g() {
+    self.removeListener(type, g);
+    listener.apply(this, arguments);
+  });
+
+  return this;
+};
+
+EventEmitter.prototype.removeListener = function(type, listener) {
+  if ('function' !== typeof listener) {
+    throw new Error('removeListener only takes instances of Function');
+  }
+
+  // does not use listeners(), so no side effect of creating _events[type]
+  if (!this._events || !this._events[type]) return this;
+
+  var list = this._events[type];
+
+  if (isArray(list)) {
+    var i = list.indexOf(listener);
+    if (i < 0) return this;
+    list.splice(i, 1);
+    if (list.length == 0)
+      delete this._events[type];
+  } else if (this._events[type] === listener) {
+    delete this._events[type];
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+  // does not use listeners(), so no side effect of creating _events[type]
+  if (type && this._events && this._events[type]) this._events[type] = null;
+  return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+  if (!this._events) this._events = {};
+  if (!this._events[type]) this._events[type] = [];
+  if (!isArray(this._events[type])) {
+    this._events[type] = [this._events[type]];
+  }
+  return this._events[type];
+};
+
+});
+
+require.define("/node_modules/sprintf/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"./lib/sprintf"}
+});
+
+require.define("/node_modules/sprintf/lib/sprintf.js", function (require, module, exports, __dirname, __filename) {
+    /**
+sprintf() for JavaScript 0.7-beta1
+http://www.diveintojavascript.com/projects/javascript-sprintf
+
+Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of sprintf() for JavaScript nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Changelog:
+2010.11.07 - 0.7-beta1-node
+  - converted it to a node.js compatible module
+
+2010.09.06 - 0.7-beta1
+  - features: vsprintf, support for named placeholders
+  - enhancements: format cache, reduced global namespace pollution
+
+2010.05.22 - 0.6:
+ - reverted to 0.4 and fixed the bug regarding the sign of the number 0
+ Note:
+ Thanks to Raphael Pigulla <raph (at] n3rd [dot) org> (http://www.n3rd.org/)
+ who warned me about a bug in 0.5, I discovered that the last update was
+ a regress. I appologize for that.
+
+2010.05.09 - 0.5:
+ - bug fix: 0 is now preceeded with a + sign
+ - bug fix: the sign was not at the right position on padded results (Kamal Abdali)
+ - switched from GPL to BSD license
+
+2007.10.21 - 0.4:
+ - unit test and patch (David Baird)
+
+2007.09.17 - 0.3:
+ - bug fix: no longer throws exception on empty paramenters (Hans Pufal)
+
+2007.09.11 - 0.2:
+ - feature: added argument swapping
+
+2007.04.03 - 0.1:
+ - initial release
+**/
+
+var sprintf = (function() {
+  function get_type(variable) {
+    return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
+  }
+  function str_repeat(input, multiplier) {
+    for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
+    return output.join('');
+  }
+
+  var str_format = function() {
+    if (!str_format.cache.hasOwnProperty(arguments[0])) {
+      str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
+    }
+    return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
+  };
+
+  str_format.format = function(parse_tree, argv) {
+    var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
+    for (i = 0; i < tree_length; i++) {
+      node_type = get_type(parse_tree[i]);
+      if (node_type === 'string') {
+        output.push(parse_tree[i]);
+      }
+      else if (node_type === 'array') {
+        match = parse_tree[i]; // convenience purposes only
+        if (match[2]) { // keyword argument
+          arg = argv[cursor];
+          for (k = 0; k < match[2].length; k++) {
+            if (!arg.hasOwnProperty(match[2][k])) {
+              throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
+            }
+            arg = arg[match[2][k]];
+          }
+        }
+        else if (match[1]) { // positional argument (explicit)
+          arg = argv[match[1]];
+        }
+        else { // positional argument (implicit)
+          arg = argv[cursor++];
+        }
+
+        if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
+          throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
+        }
+        switch (match[8]) {
+          case 'b': arg = arg.toString(2); break;
+          case 'c': arg = String.fromCharCode(arg); break;
+          case 'd': arg = parseInt(arg, 10); break;
+          case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
+          case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
+          case 'o': arg = arg.toString(8); break;
+          case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
+          case 'u': arg = Math.abs(arg); break;
+          case 'x': arg = arg.toString(16); break;
+          case 'X': arg = arg.toString(16).toUpperCase(); break;
+        }
+        arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
+        pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
+        pad_length = match[6] - String(arg).length;
+        pad = match[6] ? str_repeat(pad_character, pad_length) : '';
+        output.push(match[5] ? arg + pad : pad + arg);
+      }
+    }
+    return output.join('');
+  };
+
+  str_format.cache = {};
+
+  str_format.parse = function(fmt) {
+    var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
+    while (_fmt) {
+      if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
+        parse_tree.push(match[0]);
+      }
+      else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
+        parse_tree.push('%');
+      }
+      else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
+        if (match[2]) {
+          arg_names |= 1;
+          var field_list = [], replacement_field = match[2], field_match = [];
+          if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
+            field_list.push(field_match[1]);
+            while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+              if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
+                field_list.push(field_match[1]);
+              }
+              else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
+                field_list.push(field_match[1]);
+              }
+              else {
+                throw('[sprintf] huh?');
+              }
+            }
+          }
+          else {
+            throw('[sprintf] huh?');
+          }
+          match[2] = field_list;
+        }
+        else {
+          arg_names |= 2;
+        }
+        if (arg_names === 3) {
+          throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
+        }
+        parse_tree.push(match);
+      }
+      else {
+        throw('[sprintf] huh?');
+      }
+      _fmt = _fmt.substring(match[0].length);
+    }
+    return parse_tree;
+  };
+
+  return str_format;
+})();
+
+var vsprintf = function(fmt, argv) {
+  argv.unshift(fmt);
+  return sprintf.apply(null, argv);
+};
+
+exports.sprintf = sprintf;
+exports.vsprintf = vsprintf;
+});
+
+require.define("/shred/response.js", function (require, module, exports, __dirname, __filename) {
+    // The `Response object` encapsulates a Node.js HTTP response.
+
+var Content = require("./content")
+  , HeaderMixins = require("./mixins/headers")
+  , CookieJarLib = require( "cookiejar" )
+  , Cookie = CookieJarLib.Cookie
+;
+
+// Browser doesn't have zlib.
+var zlib = null;
+try {
+  zlib = require('zlib');
+} catch (e) {
+  console.warn("no zlib library");
+}
+
+// Iconv doesn't work in browser
+var Iconv = null;
+try {
+  Iconv = require('iconv-lite');
+} catch (e) {
+  console.warn("no iconv library");
+}
+
+// Construct a `Response` object. You should never have to do this directly. The
+// `Request` object handles this, getting the raw response object and passing it
+// in here, along with the request. The callback allows us to stream the response
+// and then use the callback to let the request know when it's ready.
+var Response = function(raw, request, callback) { 
+  var response = this;
+  this._raw = raw;
+
+  // The `._setHeaders` method is "private"; you can't otherwise set headers on
+  // the response.
+  this._setHeaders.call(this,raw.headers);
+  
+  // store any cookies
+  if (request.cookieJar && this.getHeader('set-cookie')) {
+    var cookieStrings = this.getHeader('set-cookie');
+    var cookieObjs = []
+      , cookie;
+
+    for (var i = 0; i < cookieStrings.length; i++) {
+      var cookieString = cookieStrings[i];
+      if (!cookieString) {
+        continue;
+      }
+
+      if (!cookieString.match(/domain\=/i)) {
+        cookieString += '; domain=' + request.host;
+      }
+
+      if (!cookieString.match(/path\=/i)) {
+        cookieString += '; path=' + request.path;
+      }
+
+      try {
+        cookie = new Cookie(cookieString);
+        if (cookie) {
+          cookieObjs.push(cookie);
+        }
+      } catch (e) {
+        console.warn("Tried to set bad cookie: " + cookieString);
+      }
+    }
+
+    request.cookieJar.setCookies(cookieObjs);
+  }
+
+  this.request = request;
+  this.client = request.client;
+  this.log = this.request.log;
+
+  // Stream the response content entity and fire the callback when we're done.
+  // Store the incoming data in a array of Buffers which we concatinate into one
+  // buffer at the end.  We need to use buffers instead of strings here in order
+  // to preserve binary data.
+  var chunkBuffers = [];
+  var dataLength = 0;
+  raw.on("data", function(chunk) {
+    chunkBuffers.push(chunk);
+    dataLength += chunk.length;
+  });
+  raw.on("end", function() {
+    var body;
+    if (typeof Buffer === 'undefined') {
+      // Just concatinate into a string
+      body = chunkBuffers.join('');
+    } else {
+      // Initialize new buffer and add the chunks one-at-a-time.
+      body = new Buffer(dataLength);
+      for (var i = 0, pos = 0; i < chunkBuffers.length; i++) {
+        chunkBuffers[i].copy(body, pos);
+        pos += chunkBuffers[i].length;
+      }
+    }
+
+    var setBodyAndFinish = function (body) {
+      response._body = new Content({ 
+        body: body,
+        type: response.getHeader("Content-Type")
+      });
+      callback(response);
+    }
+
+    if (zlib && response.getHeader("Content-Encoding") === 'gzip'){
+      zlib.gunzip(body, function (err, gunzippedBody) {
+        if (Iconv && response.request.encoding){
+          body = Iconv.fromEncoding(gunzippedBody,response.request.encoding);
+        } else {
+          body = gunzippedBody.toString();
+        }
+        setBodyAndFinish(body);
+      })
+    }
+    else{
+       if (response.request.encoding){
+            body = Iconv.fromEncoding(body,response.request.encoding);
+        }        
+      setBodyAndFinish(body);
+    }
+  });
+};
+
+// The `Response` object can be pretty overwhelming to view using the built-in
+// Node.js inspect method. We want to make it a bit more manageable. This
+// probably goes [too far in the other
+// direction](https://github.com/spire-io/shred/issues/2).
+
+Response.prototype = {
+  inspect: function() {
+    var response = this;
+    var headers = this.format_headers();
+    var summary = ["<Shred Response> ", response.status].join(" ")
+    return [ summary, "- Headers:", headers].join("\n");
+  },
+  format_headers: function () {
+    var array = []
+    var headers = this._headers
+    for (var key in headers) {
+      if (headers.hasOwnProperty(key)) {
+        var value = headers[key]
+        array.push("\t" + key + ": " + value);
+      }
+    }
+    return array.join("\n");
+  }
+};
+
+// `Response` object properties, all of which are read-only:
+Object.defineProperties(Response.prototype, {
+  
+// - **status**. The HTTP status code for the response. 
+  status: {
+    get: function() { return this._raw.statusCode; },
+    enumerable: true
+  },
+
+// - **content**. The HTTP content entity, if any. Provided as a [content
+//   object](./content.html), which will attempt to convert the entity based upon
+//   the `content-type` header. The converted value is available as
+//   `content.data`. The original raw content entity is available as
+//   `content.body`.
+  body: {
+    get: function() { return this._body; }
+  },
+  content: {
+    get: function() { return this.body; },
+    enumerable: true
+  },
+
+// - **isRedirect**. Is the response a redirect? These are responses with 3xx
+//   status and a `Location` header.
+  isRedirect: {
+    get: function() {
+      return (this.status>299
+          &&this.status<400
+          &&this.getHeader("Location"));
+    },
+    enumerable: true
+  },
+
+// - **isError**. Is the response an error? These are responses with status of
+//   400 or greater.
+  isError: {
+    get: function() {
+      return (this.status === 0 || this.status > 399)
+    },
+    enumerable: true
+  }
+});
+
+// Add in the [getters for accessing the normalized headers](./headers.js).
+HeaderMixins.getters(Response);
+HeaderMixins.privateSetters(Response);
+
+// Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes
+// getAllResponseHeaders() to return {} if the response is a CORS request.
+// xhr.getHeader still works correctly.
+var getHeader = Response.prototype.getHeader;
+Response.prototype.getHeader = function (name) {
+  return (getHeader.call(this,name) ||
+    (typeof this._raw.getHeader === 'function' && this._raw.getHeader(name)));
+};
+
+module.exports = Response;
+
+});
+
+require.define("/shred/content.js", function (require, module, exports, __dirname, __filename) {
+    
+// The purpose of the `Content` object is to abstract away the data conversions
+// to and from raw content entities as strings. For example, you want to be able
+// to pass in a Javascript object and have it be automatically converted into a
+// JSON string if the `content-type` is set to a JSON-based media type.
+// Conversely, you want to be able to transparently get back a Javascript object
+// in the response if the `content-type` is a JSON-based media-type.
+
+// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5).
+
+// The `Content` constructor takes an options object, which *must* have either a
+// `body` or `data` property and *may* have a `type` property indicating the
+// media type. If there is no `type` attribute, a default will be inferred.
+var Content = function(options) {
+  this.body = options.body;
+  this.data = options.data;
+  this.type = options.type;
+};
+
+Content.prototype = {
+  // Treat `toString()` as asking for the `content.body`. That is, the raw content entity.
+  //
+  //     toString: function() { return this.body; }
+  //
+  // Commented out, but I've forgotten why. :/
+};
+
+
+// `Content` objects have the following attributes:
+Object.defineProperties(Content.prototype,{
+  
+// - **type**. Typically accessed as `content.type`, reflects the `content-type`
+//   header associated with the request or response. If not passed as an options
+//   to the constructor or set explicitly, it will infer the type the `data`
+//   attribute, if possible, and, failing that, will default to `text/plain`.
+  type: {
+    get: function() {
+      if (this._type) {
+        return this._type;
+      } else {
+        if (this._data) {
+          switch(typeof this._data) {
+            case "string": return "text/plain";
+            case "object": return "application/json";
+          }
+        }
+      }
+      return "text/plain";
+    },
+    set: function(value) {
+      this._type = value;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **data**. Typically accessed as `content.data`, reflects the content entity
+//   converted into Javascript data. This can be a string, if the `type` is, say,
+//   `text/plain`, but can also be a Javascript object. The conversion applied is
+//   based on the `processor` attribute. The `data` attribute can also be set
+//   directly, in which case the conversion will be done the other way, to infer
+//   the `body` attribute.
+  data: {
+    get: function() {
+      if (this._body) {
+        return this.processor.parser(this._body);
+      } else {
+        return this._data;
+      }
+    },
+    set: function(data) {
+      if (this._body&&data) Errors.setDataWithBody(this);
+      this._data = data;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **body**. Typically accessed as `content.body`, reflects the content entity
+//   as a UTF-8 string. It is the mirror of the `data` attribute. If you set the
+//   `data` attribute, the `body` attribute will be inferred and vice-versa. If
+//   you attempt to set both, an exception is raised.
+  body: {
+    get: function() {
+      if (this._data) {
+        return this.processor.stringify(this._data);
+      } else {
+        return this.processor.stringify(this._body);
+      }
+    },
+    set: function(body) {
+      if (this._data&&body) Errors.setBodyWithData(this);
+      this._body = body;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **processor**. The functions that will be used to convert to/from `data` and
+//   `body` attributes. You can add processors. The two that are built-in are for
+//   `text/plain`, which is basically an identity transformation and
+//   `application/json` and other JSON-based media types (including custom media
+//   types with `+json`). You can add your own processors. See below.
+  processor: {
+    get: function() {
+      var processor = Content.processors[this.type];
+      if (processor) {
+        return processor;
+      } else {
+        // Return the first processor that matches any part of the
+        // content type. ex: application/vnd.foobar.baz+json will match json.
+        var main = this.type.split(";")[0];
+        var parts = main.split(/\+|\//);
+        for (var i=0, l=parts.length; i < l; i++) {
+          processor = Content.processors[parts[i]]
+        }
+        return processor || {parser:identity,stringify:toString};
+      }
+    },
+    enumerable: true
+  },
+
+// - **length**. Typically accessed as `content.length`, returns the length in
+//   bytes of the raw content entity.
+  length: {
+    get: function() {
+      if (typeof Buffer !== 'undefined') {
+        return Buffer.byteLength(this.body);
+      }
+      return this.body.length;
+    }
+  }
+});
+
+Content.processors = {};
+
+// The `registerProcessor` function allows you to add your own processors to
+// convert content entities. Each processor consists of a Javascript object with
+// two properties:
+// - **parser**. The function used to parse a raw content entity and convert it
+//   into a Javascript data type.
+// - **stringify**. The function used to convert a Javascript data type into a
+//   raw content entity.
+Content.registerProcessor = function(types,processor) {
+  
+// You can pass an array of types that will trigger this processor, or just one.
+// We determine the array via duck-typing here.
+  if (types.forEach) {
+    types.forEach(function(type) {
+      Content.processors[type] = processor;
+    });
+  } else {
+    // If you didn't pass an array, we just use what you pass in.
+    Content.processors[types] = processor;
+  }
+};
+
+// Register the identity processor, which is used for text-based media types.
+var identity = function(x) { return x; }
+  , toString = function(x) { return x.toString(); }
+Content.registerProcessor(
+  ["text/html","text/plain","text"],
+  { parser: identity, stringify: toString });
+
+// Register the JSON processor, which is used for JSON-based media types.
+Content.registerProcessor(
+  ["application/json; charset=utf-8","application/json","json"],
+  {
+    parser: function(string) {
+      return JSON.parse(string);
+    },
+    stringify: function(data) {
+      return JSON.stringify(data); }});
+
+// Error functions are defined separately here in an attempt to make the code
+// easier to read.
+var Errors = {
+  setDataWithBody: function(object) {
+    throw new Error("Attempt to set data attribute of a content object " +
+        "when the body attributes was already set.");
+  },
+  setBodyWithData: function(object) {
+    throw new Error("Attempt to set body attribute of a content object " +
+        "when the data attributes was already set.");
+  }
+}
+module.exports = Content;
+
+});
+
+require.define("/shred/mixins/headers.js", function (require, module, exports, __dirname, __filename) {
+    // The header mixins allow you to add HTTP header support to any object. This
+// might seem pointless: why not simply use a hash? The main reason is that, per
+// the [HTTP spec](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2),
+// headers are case-insensitive. So, for example, `content-type` is the same as
+// `CONTENT-TYPE` which is the same as `Content-Type`. Since there is no way to
+// overload the index operator in Javascript, using a hash to represent the
+// headers means it's possible to have two conflicting values for a single
+// header.
+// 
+// The solution to this is to provide explicit methods to set or get headers.
+// This also has the benefit of allowing us to introduce additional variations,
+// including snake case, which we automatically convert to what Matthew King has
+// dubbed "corset case" - the hyphen-separated names with initial caps:
+// `Content-Type`. We use corset-case just in case we're dealing with servers
+// that haven't properly implemented the spec.
+
+// Convert headers to corset-case. **Example:** `CONTENT-TYPE` will be converted
+// to `Content-Type`.
+
+var corsetCase = function(string) {
+  return string;//.toLowerCase()
+      //.replace("_","-")
+      // .replace(/(^|-)(\w)/g, 
+          // function(s) { return s.toUpperCase(); });
+};
+
+// We suspect that `initializeHeaders` was once more complicated ...
+var initializeHeaders = function(object) {
+  return {};
+};
+
+// Access the `_headers` property using lazy initialization. **Warning:** If you
+// mix this into an object that is using the `_headers` property already, you're
+// going to have trouble.
+var $H = function(object) {
+  return object._headers||(object._headers=initializeHeaders(object));
+};
+
+// Hide the implementations as private functions, separate from how we expose them.
+
+// The "real" `getHeader` function: get the header after normalizing the name.
+var getHeader = function(object,name) {
+  return $H(object)[corsetCase(name)];
+};
+
+// The "real" `getHeader` function: get one or more headers, or all of them
+// if you don't ask for any specifics. 
+var getHeaders = function(object,names) {
+  var keys = (names && names.length>0) ? names : Object.keys($H(object));
+  var hash = keys.reduce(function(hash,key) {
+    hash[key] = getHeader(object,key);
+    return hash;
+  },{});
+  // Freeze the resulting hash so you don't mistakenly think you're modifying
+  // the real headers.
+  Object.freeze(hash);
+  return hash;
+};
+
+// The "real" `setHeader` function: set a header, after normalizing the name.
+var setHeader = function(object,name,value) {
+  $H(object)[corsetCase(name)] = value;
+  return object;
+};
+
+// The "real" `setHeaders` function: set multiple headers based on a hash.
+var setHeaders = function(object,hash) {
+  for( var key in hash ) { setHeader(object,key,hash[key]); };
+  return this;
+};
+
+// Here's where we actually bind the functionality to an object. These mixins work by
+// exposing mixin functions. Each function mixes in a specific batch of features.
+module.exports = {
+  
+  // Add getters.
+  getters: function(constructor) {
+    constructor.prototype.getHeader = function(name) { return getHeader(this,name); };
+    constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); };
+  },
+  // Add setters but as "private" methods.
+  privateSetters: function(constructor) {
+    constructor.prototype._setHeader = function(key,value) { return setHeader(this,key,value); };
+    constructor.prototype._setHeaders = function(hash) { return setHeaders(this,hash); };
+  },
+  // Add setters.
+  setters: function(constructor) {
+    constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); };
+    constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); };
+  },
+  // Add both getters and setters.
+  gettersAndSetters: function(constructor) {
+    constructor.prototype.getHeader = function(name) { return getHeader(this,name); };
+    constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); };
+    constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); };
+    constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); };
+  },
+};
+
+});
+
+require.define("/node_modules/iconv-lite/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {}
+});
+
+require.define("/node_modules/iconv-lite/index.js", function (require, module, exports, __dirname, __filename) {
+    // Module exports
+var iconv = module.exports = {
+    toEncoding: function(str, encoding) {
+        return iconv.getCodec(encoding).toEncoding(str);
+    },
+    fromEncoding: function(buf, encoding) {
+        return iconv.getCodec(encoding).fromEncoding(buf);
+    },
+    
+    defaultCharUnicode: 'ï¿œ',
+    defaultCharSingleByte: '?',
+    
+    // Get correct codec for given encoding.
+    getCodec: function(encoding) {
+        var enc = encoding || "utf8";
+        var codecOptions = undefined;
+        while (1) {
+            if (getType(enc) === "String")
+                enc = enc.replace(/[- ]/g, "").toLowerCase();
+            var codec = iconv.encodings[enc];
+            var type = getType(codec);
+            if (type === "String") {
+                // Link to other encoding.
+                codecOptions = {originalEncoding: enc};
+                enc = codec;
+            }
+            else if (type === "Object" && codec.type != undefined) {
+                // Options for other encoding.
+                codecOptions = codec;
+                enc = codec.type;
+            } 
+            else if (type === "Function")
+                // Codec itself.
+                return codec(codecOptions);
+            else
+                throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
+        }
+    },
+    
+    // Define basic encodings
+    encodings: {
+        internal: function(options) {
+            return {
+                toEncoding: function(str) {
+                    return new Buffer(ensureString(str), options.originalEncoding);
+                },
+                fromEncoding: function(buf) {
+                    return ensureBuffer(buf).toString(options.originalEncoding);
+                }
+            };
+        },
+        utf8: "internal",
+        ucs2: "internal",
+        binary: "internal",
+        ascii: "internal",
+        base64: "internal",
+        
+        // Codepage single-byte encodings.
+        singlebyte: function(options) {
+            // Prepare chars if needed
+            if (!options.chars || (options.chars.length !== 128 && options.chars.length !== 256))
+                throw new Error("Encoding '"+options.type+"' has incorrect 'chars' (must be of len 128 or 256)");
+            
+            if (options.chars.length === 128)
+                options.chars = asciiString + options.chars;
+            
+            if (!options.charsBuf) {
+                options.charsBuf = new Buffer(options.chars, 'ucs2');
+            }
+            
+            if (!options.revCharsBuf) {
+                options.revCharsBuf = new Buffer(65536);
+                var defChar = iconv.defaultCharSingleByte.charCodeAt(0);
+                for (var i = 0; i < options.revCharsBuf.length; i++)
+                    options.revCharsBuf[i] = defChar;
+                for (var i = 0; i < options.chars.length; i++)
+                    options.revCharsBuf[options.chars.charCodeAt(i)] = i;
+            }
+            
+            return {
+                toEncoding: function(str) {
+                    str = ensureString(str);
+                    
+                    var buf = new Buffer(str.length);
+                    var revCharsBuf = options.revCharsBuf;
+                    for (var i = 0; i < str.length; i++)
+                        buf[i] = revCharsBuf[str.charCodeAt(i)];
+                    
+                    return buf;
+                },
+                fromEncoding: function(buf) {
+                    buf = ensureBuffer(buf);
+                    
+                    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
+                    var charsBuf = options.charsBuf;
+                    var newBuf = new Buffer(buf.length*2);
+                    var idx1 = 0, idx2 = 0;
+                    for (var i = 0, _len = buf.length; i < _len; i++) {
+                        idx1 = buf[i]*2; idx2 = i*2;
+                        newBuf[idx2] = charsBuf[idx1];
+                        newBuf[idx2+1] = charsBuf[idx1+1];
+                    }
+                    return newBuf.toString('ucs2');
+                }
+            };
+        },
+
+        // Codepage double-byte encodings.
+        table: function(options) {
+            var table = options.table, key, revCharsTable = options.revCharsTable;
+            if (!table) {
+                throw new Error("Encoding '" + options.type +"' has incorect 'table' option");
+            }
+            if(!revCharsTable) {
+                revCharsTable = options.revCharsTable = {};
+                for (key in table) {
+                    revCharsTable[table[key]] = parseInt(key);
+                }
+            }
+            
+            return {
+                toEncoding: function(str) {
+                    str = ensureString(str);
+                    var strLen = str.length;
+                    var bufLen = strLen;
+                    for (var i = 0; i < strLen; i++)
+                        if (str.charCodeAt(i) >> 7)
+                            bufLen++;
+
+                    var newBuf = new Buffer(bufLen), gbkcode, unicode, 
+                        defaultChar = revCharsTable[iconv.defaultCharUnicode.charCodeAt(0)];
+
+                    for (var i = 0, j = 0; i < strLen; i++) {
+                        unicode = str.charCodeAt(i);
+                        if (unicode >> 7) {
+                            gbkcode = revCharsTable[unicode] || defaultChar;
+                            newBuf[j++] = gbkcode >> 8; //high byte;
+                            newBuf[j++] = gbkcode & 0xFF; //low byte
+                        } else {//ascii
+                            newBuf[j++] = unicode;
+                        }
+                    }
+                    return newBuf;
+                },
+                fromEncoding: function(buf) {
+                    buf = ensureBuffer(buf);
+                    var bufLen = buf.length, strLen = 0;
+                    for (var i = 0; i < bufLen; i++) {
+                        strLen++;
+                        if (buf[i] & 0x80) //the high bit is 1, so this byte is gbkcode's high byte.skip next byte
+                            i++;
+                    }
+                    var newBuf = new Buffer(strLen*2), unicode, gbkcode,
+                        defaultChar = iconv.defaultCharUnicode.charCodeAt(0);
+                    
+                    for (var i = 0, j = 0; i < bufLen; i++, j+=2) {
+                        gbkcode = buf[i];
+                        if (gbkcode & 0x80) {
+                            gbkcode = (gbkcode << 8) + buf[++i];
+                            unicode = table[gbkcode] || defaultChar;
+                        } else {
+                            unicode = gbkcode;
+                        }
+                        newBuf[j] = unicode & 0xFF; //low byte
+                        newBuf[j+1] = unicode >> 8; //high byte
+                    }
+                    return newBuf.toString('ucs2');
+                }
+            }
+        }
+    }
+};
+
+// Add aliases to convert functions
+iconv.encode = iconv.toEncoding;
+iconv.decode = iconv.fromEncoding;
+
+// Load other encodings from files in /encodings dir.
+var encodingsDir = __dirname+"/encodings/",
+    fs = require('fs');
+fs.readdirSync(encodingsDir).forEach(function(file) {
+    if(fs.statSync(encodingsDir + file).isDirectory()) return;
+    var encodings = require(encodingsDir + file)
+    for (var key in encodings)
+        iconv.encodings[key] = encodings[key]
+});
+
+// Utilities
+var asciiString = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'+
+              ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f';
+
+var ensureBuffer = function(buf) {
+    buf = buf || new Buffer(0);
+    return (buf instanceof Buffer) ? buf : new Buffer(buf.toString(), "utf8");
+}
+
+var ensureString = function(str) {
+    str = str || "";
+    return (str instanceof String) ? str : str.toString((str instanceof Buffer) ? 'utf8' : undefined);
+}
+
+var getType = function(obj) {
+    return Object.prototype.toString.call(obj).slice(8, -1);
+}
+
+
+});
+
+require.define("/node_modules/http-browserify/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"index.js","browserify":"browser.js"}
+});
+
+require.define("/node_modules/http-browserify/browser.js", function (require, module, exports, __dirname, __filename) {
+    var http = module.exports;
+var EventEmitter = require('events').EventEmitter;
+var Request = require('./lib/request');
+
+http.request = function (params, cb) {
+    if (!params) params = {};
+    if (!params.host) params.host = window.location.host.split(':')[0];
+    if (!params.port) params.port = window.location.port;
+    
+    var req = new Request(new xhrHttp, params);
+    if (cb) req.on('response', cb);
+    return req;
+};
+
+http.get = function (params, cb) {
+    params.method = 'GET';
+    var req = http.request(params, cb);
+    req.end();
+    return req;
+};
+
+var xhrHttp = (function () {
+    if (typeof window === 'undefined') {
+        throw new Error('no window object present');
+    }
+    else if (window.XMLHttpRequest) {
+        return window.XMLHttpRequest;
+    }
+    else if (window.ActiveXObject) {
+        var axs = [
+            'Msxml2.XMLHTTP.6.0',
+            'Msxml2.XMLHTTP.3.0',
+            'Microsoft.XMLHTTP'
+        ];
+        for (var i = 0; i < axs.length; i++) {
+            try {
+                var ax = new(window.ActiveXObject)(axs[i]);
+                return function () {
+                    if (ax) {
+                        var ax_ = ax;
+                        ax = null;
+                        return ax_;
+                    }
+                    else {
+                        return new(window.ActiveXObject)(axs[i]);
+                    }
+                };
+            }
+            catch (e) {}
+        }
+        throw new Error('ajax not supported in this browser')
+    }
+    else {
+        throw new Error('ajax not supported in this browser');
+    }
+})();
+
+http.STATUS_CODES = {
+    100 : 'Continue',
+    101 : 'Switching Protocols',
+    102 : 'Processing', // RFC 2518, obsoleted by RFC 4918
+    200 : 'OK',
+    201 : 'Created',
+    202 : 'Accepted',
+    203 : 'Non-Authoritative Information',
+    204 : 'No Content',
+    205 : 'Reset Content',
+    206 : 'Partial Content',
+    207 : 'Multi-Status', // RFC 4918
+    300 : 'Multiple Choices',
+    301 : 'Moved Permanently',
+    302 : 'Moved Temporarily',
+    303 : 'See Other',
+    304 : 'Not Modified',
+    305 : 'Use Proxy',
+    307 : 'Temporary Redirect',
+    400 : 'Bad Request',
+    401 : 'Unauthorized',
+    402 : 'Payment Required',
+    403 : 'Forbidden',
+    404 : 'Not Found',
+    405 : 'Method Not Allowed',
+    406 : 'Not Acceptable',
+    407 : 'Proxy Authentication Required',
+    408 : 'Request Time-out',
+    409 : 'Conflict',
+    410 : 'Gone',
+    411 : 'Length Required',
+    412 : 'Precondition Failed',
+    413 : 'Request Entity Too Large',
+    414 : 'Request-URI Too Large',
+    415 : 'Unsupported Media Type',
+    416 : 'Requested Range Not Satisfiable',
+    417 : 'Expectation Failed',
+    418 : 'I\'m a teapot', // RFC 2324
+    422 : 'Unprocessable Entity', // RFC 4918
+    423 : 'Locked', // RFC 4918
+    424 : 'Failed Dependency', // RFC 4918
+    425 : 'Unordered Collection', // RFC 4918
+    426 : 'Upgrade Required', // RFC 2817
+    500 : 'Internal Server Error',
+    501 : 'Not Implemented',
+    502 : 'Bad Gateway',
+    503 : 'Service Unavailable',
+    504 : 'Gateway Time-out',
+    505 : 'HTTP Version not supported',
+    506 : 'Variant Also Negotiates', // RFC 2295
+    507 : 'Insufficient Storage', // RFC 4918
+    509 : 'Bandwidth Limit Exceeded',
+    510 : 'Not Extended' // RFC 2774
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/request.js", function (require, module, exports, __dirname, __filename) {
+    var EventEmitter = require('events').EventEmitter;
+var Response = require('./response');
+var isSafeHeader = require('./isSafeHeader');
+
+var Request = module.exports = function (xhr, params) {
+    var self = this;
+    self.xhr = xhr;
+    self.body = '';
+    
+    var uri = params.host + ':' + params.port + (params.path || '/');
+    
+    xhr.open(
+        params.method || 'GET',
+        (params.scheme || 'http') + '://' + uri,
+        true
+    );
+    
+    if (params.headers) {
+        Object.keys(params.headers).forEach(function (key) {
+            if (!isSafeHeader(key)) return;
+            var value = params.headers[key];
+            if (Array.isArray(value)) {
+                value.forEach(function (v) {
+                    xhr.setRequestHeader(key, v);
+                });
+            }
+            else xhr.setRequestHeader(key, value)
+        });
+    }
+    
+    var res = new Response(xhr);
+    res.on('ready', function () {
+        self.emit('response', res);
+    });
+    
+    xhr.onreadystatechange = function () {
+        res.handle(xhr);
+    };
+};
+
+Request.prototype = new EventEmitter;
+
+Request.prototype.setHeader = function (key, value) {
+    if ((Array.isArray && Array.isArray(value))
+    || value instanceof Array) {
+        for (var i = 0; i < value.length; i++) {
+            this.xhr.setRequestHeader(key, value[i]);
+        }
+    }
+    else {
+        this.xhr.setRequestHeader(key, value);
+    }
+};
+
+Request.prototype.write = function (s) {
+    this.body += s;
+};
+
+Request.prototype.end = function (s) {
+    if (s !== undefined) this.write(s);
+    this.xhr.send(this.body);
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/response.js", function (require, module, exports, __dirname, __filename) {
+    var EventEmitter = require('events').EventEmitter;
+var isSafeHeader = require('./isSafeHeader');
+
+var Response = module.exports = function (xhr) {
+    this.xhr = xhr;
+    this.offset = 0;
+};
+
+Response.prototype = new EventEmitter;
+
+var capable = {
+    streaming : true,
+    status2 : true
+};
+
+function parseHeaders (xhr) {
+    var lines = xhr.getAllResponseHeaders().split(/\r?\n/);
+    var headers = {};
+    for (var i = 0; i < lines.length; i++) {
+        var line = lines[i];
+        if (line === '') continue;
+        
+        var m = line.match(/^([^:]+):\s*(.*)/);
+        if (m) {
+            var key = m[1].toLowerCase(), value = m[2];
+            
+            if (headers[key] !== undefined) {
+                if ((Array.isArray && Array.isArray(headers[key]))
+                || headers[key] instanceof Array) {
+                    headers[key].push(value);
+                }
+                else {
+                    headers[key] = [ headers[key], value ];
+                }
+            }
+            else {
+                headers[key] = value;
+            }
+        }
+        else {
+            headers[line] = true;
+        }
+    }
+    return headers;
+}
+
+Response.prototype.getHeader = function (key) {
+    var header = this.headers ? this.headers[key.toLowerCase()] : null;
+    if (header) return header;
+
+    // Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes
+    // getAllResponseHeaders() to return {} if the response is a CORS request.
+    // xhr.getHeader still works correctly.
+    if (isSafeHeader(key)) {
+      return this.xhr.getResponseHeader(key);
+    }
+    return null;
+};
+
+Response.prototype.handle = function () {
+    var xhr = this.xhr;
+    if (xhr.readyState === 2 && capable.status2) {
+        try {
+            this.statusCode = xhr.status;
+            this.headers = parseHeaders(xhr);
+        }
+        catch (err) {
+            capable.status2 = false;
+        }
+        
+        if (capable.status2) {
+            this.emit('ready');
+        }
+    }
+    else if (capable.streaming && xhr.readyState === 3) {
+        try {
+            if (!this.statusCode) {
+                this.statusCode = xhr.status;
+                this.headers = parseHeaders(xhr);
+                this.emit('ready');
+            }
+        }
+        catch (err) {}
+        
+        try {
+            this.write();
+        }
+        catch (err) {
+            capable.streaming = false;
+        }
+    }
+    else if (xhr.readyState === 4) {
+        if (!this.statusCode) {
+            this.statusCode = xhr.status;
+            this.emit('ready');
+        }
+        this.write();
+        
+        if (xhr.error) {
+            this.emit('error', xhr.responseText);
+        }
+        else this.emit('end');
+    }
+};
+
+Response.prototype.write = function () {
+    var xhr = this.xhr;
+    if (xhr.responseText.length > this.offset) {
+        this.emit('data', xhr.responseText.slice(this.offset));
+        this.offset = xhr.responseText.length;
+    }
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/isSafeHeader.js", function (require, module, exports, __dirname, __filename) {
+    // Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html
+var unsafeHeaders = [
+    "accept-charset",
+    "accept-encoding",
+    "access-control-request-headers",
+    "access-control-request-method",
+    "connection",
+    "content-length",
+    "cookie",
+    "cookie2",
+    "content-transfer-encoding",
+    "date",
+    "expect",
+    "host",
+    "keep-alive",
+    "origin",
+    "referer",
+    "set-cookie",
+    "te",
+    "trailer",
+    "transfer-encoding",
+    "upgrade",
+    "user-agent",
+    "via"
+];
+
+module.exports = function (headerName) {
+    if (!headerName) return false;
+    return (unsafeHeaders.indexOf(headerName.toLowerCase()) === -1)
+};
+
+});
+
+require.alias("http-browserify", "/node_modules/http");
+
+require.alias("http-browserify", "/node_modules/https");
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/shred/content.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/shred/content.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/shred/content.js	(revision 5961)
@@ -0,0 +1,193 @@
+
+// The purpose of the `Content` object is to abstract away the data conversions
+// to and from raw content entities as strings. For example, you want to be able
+// to pass in a Javascript object and have it be automatically converted into a
+// JSON string if the `content-type` is set to a JSON-based media type.
+// Conversely, you want to be able to transparently get back a Javascript object
+// in the response if the `content-type` is a JSON-based media-type.
+
+// One limitation of the current implementation is that it [assumes the `charset` is UTF-8](https://github.com/spire-io/shred/issues/5).
+
+// The `Content` constructor takes an options object, which *must* have either a
+// `body` or `data` property and *may* have a `type` property indicating the
+// media type. If there is no `type` attribute, a default will be inferred.
+var Content = function(options) {
+  this.body = options.body;
+  this.data = options.data;
+  this.type = options.type;
+};
+
+Content.prototype = {
+  // Treat `toString()` as asking for the `content.body`. That is, the raw content entity.
+  //
+  //     toString: function() { return this.body; }
+  //
+  // Commented out, but I've forgotten why. :/
+};
+
+
+// `Content` objects have the following attributes:
+Object.defineProperties(Content.prototype,{
+  
+// - **type**. Typically accessed as `content.type`, reflects the `content-type`
+//   header associated with the request or response. If not passed as an options
+//   to the constructor or set explicitly, it will infer the type the `data`
+//   attribute, if possible, and, failing that, will default to `text/plain`.
+  type: {
+    get: function() {
+      if (this._type) {
+        return this._type;
+      } else {
+        if (this._data) {
+          switch(typeof this._data) {
+            case "string": return "text/plain";
+            case "object": return "application/json";
+          }
+        }
+      }
+      return "text/plain";
+    },
+    set: function(value) {
+      this._type = value;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **data**. Typically accessed as `content.data`, reflects the content entity
+//   converted into Javascript data. This can be a string, if the `type` is, say,
+//   `text/plain`, but can also be a Javascript object. The conversion applied is
+//   based on the `processor` attribute. The `data` attribute can also be set
+//   directly, in which case the conversion will be done the other way, to infer
+//   the `body` attribute.
+  data: {
+    get: function() {
+      if (this._body) {
+        return this.processor.parser(this._body);
+      } else {
+        return this._data;
+      }
+    },
+    set: function(data) {
+      if (this._body&&data) Errors.setDataWithBody(this);
+      this._data = data;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **body**. Typically accessed as `content.body`, reflects the content entity
+//   as a UTF-8 string. It is the mirror of the `data` attribute. If you set the
+//   `data` attribute, the `body` attribute will be inferred and vice-versa. If
+//   you attempt to set both, an exception is raised.
+  body: {
+    get: function() {
+      if (this._data) {
+        return this.processor.stringify(this._data);
+      } else {
+        return this._body.toString();
+      }
+    },
+    set: function(body) {
+      if (this._data&&body) Errors.setBodyWithData(this);
+      this._body = body;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **processor**. The functions that will be used to convert to/from `data` and
+//   `body` attributes. You can add processors. The two that are built-in are for
+//   `text/plain`, which is basically an identity transformation and
+//   `application/json` and other JSON-based media types (including custom media
+//   types with `+json`). You can add your own processors. See below.
+  processor: {
+    get: function() {
+      var processor = Content.processors[this.type];
+      if (processor) {
+        return processor;
+      } else {
+        // Return the first processor that matches any part of the
+        // content type. ex: application/vnd.foobar.baz+json will match json.
+        var main = this.type.split(";")[0];
+        var parts = main.split(/\+|\//);
+        for (var i=0, l=parts.length; i < l; i++) {
+          processor = Content.processors[parts[i]]
+        }
+        return processor || {parser:identity,stringify:toString};
+      }
+    },
+    enumerable: true
+  },
+
+// - **length**. Typically accessed as `content.length`, returns the length in
+//   bytes of the raw content entity.
+  length: {
+    get: function() {
+      if (typeof Buffer !== 'undefined') {
+        return Buffer.byteLength(this.body);
+      }
+      return this.body.length;
+    }
+  }
+});
+
+Content.processors = {};
+
+// The `registerProcessor` function allows you to add your own processors to
+// convert content entities. Each processor consists of a Javascript object with
+// two properties:
+// - **parser**. The function used to parse a raw content entity and convert it
+//   into a Javascript data type.
+// - **stringify**. The function used to convert a Javascript data type into a
+//   raw content entity.
+Content.registerProcessor = function(types,processor) {
+  
+// You can pass an array of types that will trigger this processor, or just one.
+// We determine the array via duck-typing here.
+  if (types.forEach) {
+    types.forEach(function(type) {
+      Content.processors[type] = processor;
+    });
+  } else {
+    // If you didn't pass an array, we just use what you pass in.
+    Content.processors[types] = processor;
+  }
+};
+
+// Register the identity processor, which is used for text-based media types.
+var identity = function(x) { return x; }
+  , toString = function(x) { return x.toString(); }
+Content.registerProcessor(
+  ["text/html","text/plain","text"],
+  { parser: identity, stringify: toString });
+
+// Register the JSON processor, which is used for JSON-based media types.
+Content.registerProcessor(
+  ["application/json; charset=utf-8","application/json","json"],
+  {
+    parser: function(string) {
+      return JSON.parse(string);
+    },
+    stringify: function(data) {
+      return JSON.stringify(data); }});
+
+var qs = require('querystring');
+// Register the post processor, which is used for JSON-based media types.
+Content.registerProcessor(
+  ["application/x-www-form-urlencoded"],
+  { parser : qs.parse, stringify : qs.stringify });
+
+// Error functions are defined separately here in an attempt to make the code
+// easier to read.
+var Errors = {
+  setDataWithBody: function(object) {
+    throw new Error("Attempt to set data attribute of a content object " +
+        "when the body attributes was already set.");
+  },
+  setBodyWithData: function(object) {
+    throw new Error("Attempt to set body attribute of a content object " +
+        "when the data attributes was already set.");
+  }
+}
+module.exports = Content;
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger-client.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger-client.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger-client.js	(revision 5961)
@@ -0,0 +1,1489 @@
+// swagger-client.js
+// version 2.1.0-alpha.2
+/**
+ * Array Model
+ **/
+var ArrayModel = function(definition) {
+  this.name = "name";
+  this.definition = definition || {};
+  this.properties = [];
+  this.type;
+  this.ref;
+
+  var requiredFields = definition.enum || [];
+  var items = definition.items;
+  if(items) {
+    var type = items.type;
+    if(items.type) {
+      this.type = typeFromJsonSchema(type.type, type.format);
+    }
+    else {
+      this.ref = items['$ref'];
+    }
+  }
+}
+
+ArrayModel.prototype.createJSONSample = function(modelsToIgnore) {
+  var result;
+  modelsToIgnore = (modelsToIgnore||{})
+  if(this.type) {
+    result = type;
+  }
+  else if (this.ref) {
+    var name = simpleRef(this.ref);
+    result = models[name].createJSONSample();
+  }
+  return [ result ];
+};
+
+ArrayModel.prototype.getSampleValue = function(modelsToIgnore) {
+  var result;
+  modelsToIgnore = (modelsToIgnore || {})
+  if(this.type) {
+    result = type;
+  }
+  else if (this.ref) {
+    var name = simpleRef(this.ref);
+    result = models[name].getSampleValue(modelsToIgnore);
+  }
+  return [ result ];
+}
+
+ArrayModel.prototype.getMockSignature = function(modelsToIgnore) {
+  var propertiesStr = [];
+
+  if(this.ref) {
+    return models[simpleRef(this.ref)].getMockSignature();
+  }
+};
+
+/**
+ * SwaggerAuthorizations applys the correct authorization to an operation being executed
+ */
+var SwaggerAuthorizations = function() {
+  this.authz = {};
+};
+
+SwaggerAuthorizations.prototype.add = function(name, auth) {
+  this.authz[name] = auth;
+  return auth;
+};
+
+SwaggerAuthorizations.prototype.remove = function(name) {
+  return delete this.authz[name];
+};
+
+SwaggerAuthorizations.prototype.apply = function(obj, authorizations) {
+  var status = null;
+  var key;
+
+  // if the "authorizations" key is undefined, or has an empty array, add all keys
+  if(typeof authorizations === 'undefined' || Object.keys(authorizations).length == 0) {
+    for (key in this.authz) {
+      value = this.authz[key];
+      result = value.apply(obj, authorizations);
+      if (result === true)
+        status = true;
+    }
+  }
+  else {
+    if(Array.isArray(authorizations)) {
+      var i;
+      for(i = 0; i < authorizations.length; i++) {
+        var auth = authorizations[i];
+        log(auth);
+        for (key in this.authz) {
+          var value = this.authz[key];
+          if(typeof value !== 'undefined') {
+            result = value.apply(obj, authorizations);
+            if (result === true)
+              status = true;
+          }
+        }
+      }
+    }
+  }
+
+  return status;
+};
+
+/**
+ * ApiKeyAuthorization allows a query param or header to be injected
+ */
+var ApiKeyAuthorization = function(name, value, type) {
+  this.name = name;
+  this.value = value;
+  this.type = type;
+};
+
+ApiKeyAuthorization.prototype.apply = function(obj, authorizations) {
+  if (this.type === "query") {
+    if (obj.url.indexOf('?') > 0)
+      obj.url = obj.url + "&" + this.name + "=" + this.value;
+    else
+      obj.url = obj.url + "?" + this.name + "=" + this.value;
+    return true;
+  } else if (this.type === "header") {
+    obj.headers[this.name] = this.value;
+    return true;
+  }
+};
+
+var CookieAuthorization = function(cookie) {
+  this.cookie = cookie;
+}
+
+CookieAuthorization.prototype.apply = function(obj, authorizations) {
+  obj.cookieJar = obj.cookieJar || CookieJar();
+  obj.cookieJar.setCookie(this.cookie);
+  return true;
+}
+
+/**
+ * Password Authorization is a basic auth implementation
+ */
+var PasswordAuthorization = function(name, username, password) {
+  this.name = name;
+  this.username = username;
+  this.password = password;
+  this._btoa = null;
+  if (typeof window !== 'undefined')
+    this._btoa = btoa;
+  else
+    this._btoa = require("btoa");
+};
+
+PasswordAuthorization.prototype.apply = function(obj, authorizations) {
+  var base64encoder = this._btoa;
+  obj.headers["Authorization"] = "Basic " + base64encoder(this.username + ":" + this.password);
+  return true;
+};var __bind = function(fn, me){
+  return function(){
+    return fn.apply(me, arguments);
+  };
+};
+
+fail = function(message) {
+  log(message);
+}
+
+log = function(){
+  log.history = log.history || [];
+  log.history.push(arguments);
+  if(this.console){
+    console.log( Array.prototype.slice.call(arguments)[0] );
+  }
+};
+
+if (!Array.prototype.indexOf) {
+  Array.prototype.indexOf = function(obj, start) {
+    for (var i = (start || 0), j = this.length; i < j; i++) {
+      if (this[i] === obj) { return i; }
+    }
+    return -1;
+  }
+}
+
+if (!('filter' in Array.prototype)) {
+  Array.prototype.filter= function(filter, that /*opt*/) {
+    var other= [], v;
+    for (var i=0, n= this.length; i<n; i++)
+      if (i in this && filter.call(that, v= this[i], i, this))
+        other.push(v);
+    return other;
+  };
+}
+
+if (!('map' in Array.prototype)) {
+  Array.prototype.map= function(mapper, that /*opt*/) {
+    var other= new Array(this.length);
+    for (var i= 0, n= this.length; i<n; i++)
+      if (i in this)
+        other[i]= mapper.call(that, this[i], i, this);
+    return other;
+  };
+}
+
+Object.keys = Object.keys || (function () {
+  var hasOwnProperty = Object.prototype.hasOwnProperty,
+    hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
+    DontEnums = [
+      'toString',
+      'toLocaleString',
+      'valueOf',
+      'hasOwnProperty',
+      'isPrototypeOf',
+      'propertyIsEnumerable',
+      'constructor'
+    ],
+  DontEnumsLength = DontEnums.length;
+
+  return function (o) {
+    if (typeof o != "object" && typeof o != "function" || o === null)
+      throw new TypeError("Object.keys called on a non-object");
+
+    var result = [];
+    for (var name in o) {
+      if (hasOwnProperty.call(o, name))
+        result.push(name);
+    }
+
+    if (hasDontEnumBug) {
+      for (var i = 0; i < DontEnumsLength; i++) {
+        if (hasOwnProperty.call(o, DontEnums[i]))
+          result.push(DontEnums[i]);
+      }
+    }
+
+    return result;
+  };
+})();
+/**
+ * PrimitiveModel
+ **/
+var PrimitiveModel = function(definition) {
+  this.name = "name";
+  this.definition = definition || {};
+  this.properties = [];
+  this.type;
+
+  var requiredFields = definition.enum || [];
+  this.type = typeFromJsonSchema(definition.type, definition.format);
+}
+
+PrimitiveModel.prototype.createJSONSample = function(modelsToIgnore) {
+  var result = this.type;
+  return result;
+};
+
+PrimitiveModel.prototype.getSampleValue = function() {
+  var result = this.type;
+  return null;
+}
+
+PrimitiveModel.prototype.getMockSignature = function(modelsToIgnore) {
+  var propertiesStr = [];
+  var i;
+  for (i = 0; i < this.properties.length; i++) {
+    var prop = this.properties[i];
+    propertiesStr.push(prop.toString());
+  }
+
+  var strong = '<span class="strong">';
+  var stronger = '<span class="stronger">';
+  var strongClose = '</span>';
+  var classOpen = strong + this.name + ' {' + strongClose;
+  var classClose = strong + '}' + strongClose;
+  var returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
+
+  if (!modelsToIgnore)
+    modelsToIgnore = {};
+  modelsToIgnore[this.name] = this;
+  var i;
+  for (i = 0; i < this.properties.length; i++) {
+    var prop = this.properties[i];
+    var ref = prop['$ref'];
+    var model = models[ref];
+    if (model && typeof modelsToIgnore[ref] === 'undefined') {
+      returnVal = returnVal + ('<br>' + model.getMockSignature(modelsToIgnore));
+    }
+  }
+  return returnVal;
+};var SwaggerClient = function(url, options) {
+  this.isBuilt = false;
+  this.url = null;
+  this.debug = false;
+  this.basePath = null;
+  this.authorizations = null;
+  this.authorizationScheme = null;
+  this.isValid = false;
+  this.info = null;
+  this.useJQuery = false;
+  this.models = models;
+
+  options = (options||{});
+  if (url)
+    if (url.url) options = url;
+    else this.url = url;
+  else options = url;
+
+  if (options.url != null)
+    this.url = options.url;
+
+  if (options.success != null)
+    this.success = options.success;
+
+  if (typeof options.useJQuery === 'boolean')
+    this.useJQuery = options.useJQuery;
+
+  this.failure = options.failure != null ? options.failure : function() {};
+  this.progress = options.progress != null ? options.progress : function() {};
+  this.spec = options.spec;
+
+  if (options.success != null)
+    this.build();
+}
+
+SwaggerClient.prototype.build = function() {
+  var self = this;
+  this.progress('fetching resource list: ' + this.url);
+  var obj = {
+    useJQuery: this.useJQuery,
+    url: this.url,
+    method: "get",
+    headers: {
+      accept: "application/json, */*"
+    },
+    on: {
+      error: function(response) {
+        if (self.url.substring(0, 4) !== 'http')
+          return self.fail('Please specify the protocol for ' + self.url);
+        else if (response.status === 0)
+          return self.fail('Can\'t read from server.  It may not have the appropriate access-control-origin settings.');
+        else if (response.status === 404)
+          return self.fail('Can\'t read swagger JSON from ' + self.url);
+        else
+          return self.fail(response.status + ' : ' + response.statusText + ' ' + self.url);
+      },
+      response: function(resp) {
+        var responseObj = resp.obj || JSON.parse(resp.data);
+        self.swaggerVersion = responseObj.swaggerVersion;
+
+        if(responseObj.swagger && parseInt(responseObj.swagger) === 2) {
+          self.swaggerVersion = responseObj.swagger;
+          self.buildFromSpec(responseObj);
+          self.isValid = true;
+        }
+        else {
+          self.isValid = false;
+          self.failure();
+        }
+      }
+    }
+  };
+  if(this.spec) {
+    var self = this;
+    setTimeout(function() { self.buildFromSpec(self.spec); }, 10);
+  }
+  else {
+    var e = (typeof window !== 'undefined' ? window : exports);
+    var status = e.authorizations.apply(obj);
+    new SwaggerHttp().execute(obj);
+  }
+
+  return this;
+};
+
+SwaggerClient.prototype.buildFromSpec = function(response) {
+  if(this.isBuilt) return this;
+
+  this.info = response.info || {};
+  this.title = response.title || '';
+  this.host = response.host || '';
+  this.schemes = response.schemes || [];
+  this.scheme;
+  this.basePath = response.basePath || '';
+  this.apis = {};
+  this.apisArray = [];
+  this.consumes = response.consumes;
+  this.produces = response.produces;
+  this.securityDefinitions = response.securityDefinitions;
+
+  // legacy support
+  this.authSchemes = response.securityDefinitions;
+
+  var location = this.parseUri(this.url);
+  if(typeof this.schemes === 'undefined' || this.schemes.length === 0) {
+    this.scheme = location.scheme;
+  }
+  else {
+    this.scheme = this.schemes[0];
+  }
+
+  if(typeof this.host === 'undefined' || this.host === '') {
+    this.host = location.host;
+    if (location.port) {
+      this.host = this.host + ':' + location.port;
+    }
+  }
+
+  this.definitions = response.definitions;
+  var key;
+  for(key in this.definitions) {
+    var model = new Model(key, this.definitions[key]);
+    if(model) {
+      models[key] = model;
+    }
+  }
+
+  // get paths, create functions for each operationId
+  var path;
+  var operations = [];
+  for(path in response.paths) {
+    if(typeof response.paths[path] === 'object') {
+      var httpMethod;
+      for(httpMethod in response.paths[path]) {
+        if(['delete', 'get', 'head', 'options', 'patch', 'post', 'put'].indexOf(httpMethod) === -1) {
+          continue;
+        }
+        var operation = response.paths[path][httpMethod];
+        var tags = operation.tags;
+        if(typeof tags === 'undefined') {
+          operation.tags = [ 'default' ];
+          tags = operation.tags;
+        }
+        var operationId = this.idFromOp(path, httpMethod, operation);
+        var operationObject = new Operation (
+          this,
+          operationId,
+          httpMethod,
+          path,
+          operation,
+          this.definitions
+        );
+        // bind this operation's execute command to the api
+        if(tags.length > 0) {
+          var i;
+          for(i = 0; i < tags.length; i++) {
+            var tag = this.tagFromLabel(tags[i]);
+            var operationGroup = this[tag];
+            if(typeof operationGroup === 'undefined') {
+              this[tag] = [];
+              operationGroup = this[tag];
+              operationGroup.label = tag;
+              operationGroup.apis = [];
+              this[tag].help = this.help.bind(operationGroup);
+              this.apisArray.push(new OperationGroup(tag, operationObject));
+            }
+            operationGroup[operationId] = operationObject.execute.bind(operationObject);
+            operationGroup[operationId].help = operationObject.help.bind(operationObject);
+            operationGroup.apis.push(operationObject);
+
+            // legacy UI feature
+            var j;
+            var api;
+            for(j = 0; j < this.apisArray.length; j++) {
+              if(this.apisArray[j].tag === tag) {
+                api = this.apisArray[j];
+              }
+            }
+            if(api) {
+              api.operationsArray.push(operationObject);
+            }
+          }
+        }
+        else {
+          log('no group to bind to');
+        }
+      }
+    }
+  }
+  this.isBuilt = true;
+  if (this.success)
+    this.success();
+  return this;
+}
+
+SwaggerClient.prototype.parseUri = function(uri) {
+  var urlParseRE = /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/;
+  var parts = urlParseRE.exec(uri);
+  return {
+    scheme: parts[4].replace(':',''),
+    host: parts[11],
+    port: parts[12],
+    path: parts[15]
+  };
+}
+
+SwaggerClient.prototype.help = function() {
+  var i;
+  log('operations for the "' + this.label + '" tag');
+  for(i = 0; i < this.apis.length; i++) {
+    var api = this.apis[i];
+    log('  * ' + api.nickname + ': ' + api.operation.summary);
+  }
+}
+
+SwaggerClient.prototype.tagFromLabel = function(label) {
+  return label;
+}
+
+SwaggerClient.prototype.idFromOp = function(path, httpMethod, op) {
+  if(typeof op.operationId !== 'undefined') {
+    return (op.operationId);
+  }
+  else {
+    return path.substring(1).replace(/\//g, "_").replace(/\{/g, "").replace(/\}/g, "") + "_" + httpMethod;
+  }
+}
+
+SwaggerClient.prototype.fail = function(message) {
+  this.failure(message);
+  throw message;
+};
+
+var OperationGroup = function(tag, operation) {
+  this.tag = tag;
+  this.path = tag;
+  this.name = tag;
+  this.operation = operation;
+  this.operationsArray = [];
+
+  this.description = operation.description || "";
+}
+
+var Operation = function(parent, operationId, httpMethod, path, args, definitions) {
+  var errors = [];
+  this.operation = args;
+  this.deprecated = args.deprecated;
+  this.consumes = args.consumes;
+  this.produces = args.produces;
+  this.parent = parent;
+  this.host = parent.host;
+  this.schemes = parent.schemes;
+  this.scheme = parent.scheme || 'http';
+  this.basePath = parent.basePath;
+  this.nickname = (operationId||errors.push('Operations must have a nickname.'));
+  this.method = (httpMethod||errors.push('Operation ' + operationId + ' is missing method.'));
+  this.path = (path||errors.push('Operation ' + nickname + ' is missing path.'));
+  this.parameters = args != null ? (args.parameters||[]) : {};
+  this.summary = args.summary || '';
+  this.responses = (args.responses||{});
+  this.type = null;
+  this.security = args.security;
+  this.authorizations = args.security;
+  this.description = args.description;
+
+  var i;
+  for(i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(param.type === 'array') {
+      param.isList = true;
+      param.allowMultiple = true;
+    }
+    var innerType = this.getType(param);
+    if(innerType && innerType.toString().toLowerCase() === 'boolean') {
+      param.allowableValues = {};
+      param.isList = true;
+      param.enum = ["true", "false"];
+    }
+    if(typeof param.enum !== 'undefined') {
+      var id;
+      param.allowableValues = {};
+      param.allowableValues.values = [];
+      param.allowableValues.descriptiveValues = [];
+      for(id = 0; id < param.enum.length; id++) {
+        var value = param.enum[id];
+        var isDefault = (value === param.default) ? true : false;
+        param.allowableValues.values.push(value);
+        param.allowableValues.descriptiveValues.push({value : value, isDefault: isDefault});
+      }
+    }
+    if(param.type === 'array' && typeof param.allowableValues === 'undefined') {
+      // can't show as a list if no values to select from
+      delete param.isList;
+      delete param.allowMultiple;
+    }
+    param.signature = this.getSignature(innerType, models);
+    param.sampleJSON = this.getSampleJSON(innerType, models);
+    param.responseClassSignature = param.signature;
+  }
+
+  var response;
+  var model;
+  var responses = this.responses;
+
+  if(responses['200']) {
+    response = responses['200'];
+    defaultResponseCode = '200';
+  }
+  else if(responses['201']) {
+    response = responses['201'];
+    defaultResponseCode = '201';
+  }
+  else if(responses['202']) {
+    response = responses['202'];
+    defaultResponseCode = '202';
+  }
+  else if(responses['203']) {
+    response = responses['203'];
+    defaultResponseCode = '203';
+  }
+  else if(responses['204']) {
+    response = responses['204'];
+    defaultResponseCode = '204';
+  }
+  else if(responses['205']) {
+    response = responses['205'];
+    defaultResponseCode = '205';
+  }
+  else if(responses['206']) {
+    response = responses['206'];
+    defaultResponseCode = '206';
+  }
+  else if(responses['default']) {
+    response = responses['default'];
+    defaultResponseCode = 'default';
+  }
+
+  if(response && response.schema) {
+    var resolvedModel = this.resolveModel(response.schema, definitions);
+    if(resolvedModel) {
+      this.type = resolvedModel.name;
+      this.responseSampleJSON = JSON.stringify(resolvedModel.getSampleValue(), null, 2);
+      this.responseClassSignature = resolvedModel.getMockSignature();
+      delete responses[defaultResponseCode];
+    }
+    else {
+      this.type = response.schema.type;
+    }
+  }
+
+  if (errors.length > 0)
+    this.resource.api.fail(errors);
+
+  return this;
+}
+
+OperationGroup.prototype.sort = function(sorter) {
+
+}
+
+Operation.prototype.getType = function (param) {
+  var type = param.type;
+  var format = param.format;
+  var isArray = false;
+  var str;
+  if(type === 'integer' && format === 'int32')
+    str = 'integer';
+  else if(type === 'integer' && format === 'int64')
+    str = 'long';
+  else if(type === 'integer' && typeof format === 'undefined')
+    str = 'long';
+  else if(type === 'string' && format === 'date-time')
+    str = 'date-time';
+  else if(type === 'string' && format === 'date')
+    str = 'date';
+  else if(type === 'number' && format === 'float')
+    str = 'float';
+  else if(type === 'number' && format === 'double')
+    str = 'double';
+  else if(type === 'number' && typeof format === 'undefined')
+    str = 'double';
+  else if(type === 'boolean')
+    str = 'boolean';
+  else if(type === 'string')
+    str = 'string';
+  else if(type === 'array') {
+    isArray = true;
+    if(param.items)
+      str = this.getType(param.items);
+  }
+  if(param['$ref'])
+    str = param['$ref'];
+
+  var schema = param.schema;
+  if(schema) {
+    var ref = schema['$ref'];
+    if(ref) {
+      ref = simpleRef(ref);
+      if(isArray)
+        return [ ref ];
+      else
+        return ref;
+    }
+    else
+      return this.getType(schema);
+  }
+  if(isArray)
+    return [ str ];
+  else
+    return str;
+}
+
+Operation.prototype.resolveModel = function (schema, definitions) {
+  if(typeof schema['$ref'] !== 'undefined') {
+    var ref = schema['$ref'];
+    if(ref.indexOf('#/definitions/') == 0)
+      ref = ref.substring('#/definitions/'.length);
+    if(definitions[ref])
+      return new Model(ref, definitions[ref]);
+  }
+  if(schema.type === 'array')
+    return new ArrayModel(schema);
+  else
+    return null;
+}
+
+Operation.prototype.help = function() {
+  log(this.nickname + ': ' + this.operation.summary);
+  for(var i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    log('  * ' + param.name + ': ' + param.description);
+  }
+}
+
+Operation.prototype.getSignature = function(type, models) {
+  var isPrimitive, listType;
+
+  if(type instanceof Array) {
+    listType = true;
+    type = type[0];
+  }
+
+  if(type === 'string')
+    isPrimitive = true
+  else
+    isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true;
+  if (isPrimitive) {
+    return type;
+  } else {
+    if (listType != null)
+      return models[type].getMockSignature();
+    else
+      return models[type].getMockSignature();
+  }
+};
+
+/**
+ * gets sample response for a single operation
+ **/
+Operation.prototype.getSampleJSON = function(type, models) {
+  var isPrimitive, listType, sampleJson;
+
+  listType = (type instanceof Array);
+  isPrimitive = (models[type] != null) ? false : true;
+  sampleJson = isPrimitive ? void 0 : models[type].createJSONSample();
+
+  if (sampleJson) {
+    sampleJson = listType ? [sampleJson] : sampleJson;
+    if(typeof sampleJson == 'string')
+      return sampleJson;
+    else if(typeof sampleJson === 'object') {
+      var t = sampleJson;
+      if(sampleJson instanceof Array && sampleJson.length > 0) {
+        t = sampleJson[0];
+      }
+      if(t.nodeName) {
+        var xmlString = new XMLSerializer().serializeToString(t);
+        return this.formatXml(xmlString);
+      }
+      else
+        return JSON.stringify(sampleJson, null, 2);
+    }
+    else
+      return sampleJson;
+  }
+};
+
+/**
+ * legacy binding
+ **/
+Operation.prototype["do"] = function(args, opts, callback, error, parent) {
+  return this.execute(args, opts, callback, error, parent);
+}
+
+/**
+ * executes an operation
+ **/
+Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) {
+  var args = (arg1||{});
+  var opts = {}, success, error;
+  if(typeof arg2 === 'object') {
+    opts = arg2;
+    success = arg3;
+    error = arg4;
+  }
+  if(typeof arg2 === 'function') {
+    success = arg2;
+    error = arg3;
+  }
+
+  var formParams = {};
+  var headers = {};
+  var requestUrl = this.path;
+
+  success = (success||log)
+  error = (error||log)
+
+  var requiredParams = [];
+  var missingParams = [];
+  // check required params, track the ones that are missing
+  var i;
+  for(i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(param.required === true) {
+      requiredParams.push(param.name);
+      if(typeof args[param.name] === 'undefined')
+        missingParams = param.name;
+    }
+  }
+
+  if(missingParams.length > 0) {
+    var message = 'missing required params: ' + missingParams;
+    fail(message);
+    return;
+  }
+
+  // set content type negotiation
+  var consumes = this.consumes || this.parent.consumes || [ 'application/json' ];
+  var produces = this.produces || this.parent.produces || [ 'application/json' ];
+
+  headers = this.setContentTypes(args, opts);
+
+  // grab params from the args, build the querystring along the way
+  var querystring = "";
+  for(var i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(typeof args[param.name] !== 'undefined') {
+      if(param.in === 'path') {
+        var reg = new RegExp('\{' + param.name + '[^\}]*\}', 'gi');
+        requestUrl = requestUrl.replace(reg, this.encodePathParam(args[param.name]));
+      }
+      else if (param.in === 'query') {
+        if(querystring === '')
+          querystring += '?';
+        else
+          querystring += '&';
+        if(typeof param.collectionFormat !== 'undefined') {
+          var qp = args[param.name];
+          if(Array.isArray(qp))
+            querystring += this.encodeCollection(param.collectionFormat, param.name, qp);
+          else
+            querystring += this.encodeQueryParam(param.name) + '=' + this.encodeQueryParam(args[param.name]);
+        }
+        else
+          querystring += this.encodeQueryParam(param.name) + '=' + this.encodeQueryParam(args[param.name]);
+      }
+      else if (param.in === 'header')
+        headers[param.name] = args[param.name];
+      else if (param.in === 'formData')
+        formParams[param.name] = args[param.name];
+      else if (param.in === 'body')
+        args.body = args[param.name];
+    }
+  }
+  // handle form params
+  if(headers['Content-Type'] === 'application/x-www-form-urlencoded') {
+    var encoded = "";
+    var key;
+    for(key in formParams) {
+      value = formParams[key];
+      if(typeof value !== 'undefined'){
+        if(encoded !== "")
+          encoded += "&";
+        encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value);
+      }
+    }
+    // todo append?
+    args.body = encoded;
+  }
+  var url = this.scheme + '://' + this.host + this.basePath + requestUrl + querystring;
+
+  var obj = {
+    url: url,
+    method: this.method,
+    body: args.body,
+    useJQuery: this.useJQuery,
+    headers: headers,
+    on: {
+      response: function(response) {
+        return success(response, parent);
+      },
+      error: function(response) {
+        return error(response, parent);
+      }
+    }
+  };
+  var status = e.authorizations.apply(obj, this.operation.security);
+  new SwaggerHttp().execute(obj);
+}
+
+Operation.prototype.setContentTypes = function(args, opts) {
+  // default type
+  var accepts = 'application/json';
+  var consumes = 'application/json';
+
+  var allDefinedParams = this.parameters;
+  var definedFormParams = [];
+  var definedFileParams = [];
+  var body = args.body;
+  var headers = {};
+
+  // get params from the operation and set them in definedFileParams, definedFormParams, headers
+  var i;
+  for(i = 0; i < allDefinedParams.length; i++) {
+    var param = allDefinedParams[i];
+    if(param.in === 'formData')
+      definedFormParams.push(param);
+    else if(param.in === 'file')
+      definedFileParams.push(param);
+    else if(param.in === 'header' && this.headers) {
+      var key = param.name;
+      var headerValue = this.headers[param.name];
+      if(typeof this.headers[param.name] !== 'undefined')
+        headers[key] = headerValue;
+    }
+  }
+
+  // if there's a body, need to set the accepts header via requestContentType
+  if (body && (this.type === 'post' || this.type === 'put' || this.type === 'patch' || this.type === 'delete')) {
+    if (opts.requestContentType)
+      consumes = opts.requestContentType;
+  } else {
+    // if any form params, content type must be set
+    if(definedFormParams.length > 0) {
+      if(definedFileParams.length > 0)
+        consumes = 'multipart/form-data';
+      else
+        consumes = 'application/x-www-form-urlencoded';
+    }
+    else if (this.type == 'DELETE')
+      body = '{}';
+    else if (this.type != 'DELETE')
+      accepts = null;
+  }
+
+  if (consumes && this.consumes) {
+    if (this.consumes.indexOf(consumes) === -1) {
+      log('server doesn\'t consume ' + consumes + ', try ' + JSON.stringify(this.consumes));
+      consumes = this.operation.consumes[0];
+    }
+  }
+
+  if (opts.responseContentType) {
+    accepts = opts.responseContentType;
+  } else {
+    accepts = 'application/json';
+  }
+  if (accepts && this.produces) {
+    if (this.produces.indexOf(accepts) === -1) {
+      log('server can\'t produce ' + accepts);
+      accepts = this.produces[0];
+    }
+  }
+
+  if ((consumes && body !== '') || (consumes === 'application/x-www-form-urlencoded'))
+    headers['Content-Type'] = consumes;
+  if (accepts)
+    headers['Accept'] = accepts;
+  return headers;
+}
+
+Operation.prototype.encodeCollection = function(type, name, value) {
+  var encoded = '';
+  var i;
+  if(type === 'default' || type === 'multi') {
+    for(i = 0; i < value.length; i++) {
+      if(i > 0) encoded += '&'
+      encoded += this.encodeQueryParam(name) + '=' + this.encodeQueryParam(value[i]);
+    }
+  }
+  else {
+    var separator = '';
+    if(type === 'csv')
+      separator = ',';
+    else if(type === 'ssv')
+      separator = '%20';
+    else if(type === 'tsv')
+      separator = '\\t';
+    else if(type === 'pipes')
+      separator = '|';
+    if(separator !== '') {
+      for(i = 0; i < value.length; i++) {
+        if(i == 0)
+          encoded = this.encodeQueryParam(name) + '=' + this.encodeQueryParam(value[i]);
+        else
+          encoded += separator + this.encodeQueryParam(value[i]);
+      }
+    }
+  }
+  // TODO: support the different encoding schemes here
+  return encoded;
+}
+
+/**
+ * TODO this encoding needs to be changed 
+ **/
+Operation.prototype.encodeQueryParam = function(arg) {
+  return escape(arg);
+}
+
+/**
+ * TODO revisit, might not want to leave '/'
+ **/
+Operation.prototype.encodePathParam = function(pathParam) {
+  var encParts, part, parts, _i, _len;
+  pathParam = pathParam.toString();
+  if (pathParam.indexOf('/') === -1) {
+    return encodeURIComponent(pathParam);
+  } else {
+    parts = pathParam.split('/');
+    encParts = [];
+    for (_i = 0, _len = parts.length; _i < _len; _i++) {
+      part = parts[_i];
+      encParts.push(encodeURIComponent(part));
+    }
+    return encParts.join('/');
+  }
+};
+
+var Model = function(name, definition) {
+  this.name = name;
+  this.definition = definition || {};
+  this.properties = [];
+  var requiredFields = definition.required || [];
+
+  var key;
+  var props = definition.properties;
+  if(props) {
+    for(key in props) {
+      var required = false;
+      var property = props[key];
+      if(requiredFields.indexOf(key) >= 0)
+        required = true;
+      this.properties.push(new Property(key, property, required));
+    }    
+  }
+}
+
+Model.prototype.createJSONSample = function(modelsToIgnore) {
+  var result = {};
+  modelsToIgnore = (modelsToIgnore||{})
+  modelsToIgnore[this.name] = this;
+  var i;
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    result[prop.name] = prop.getSampleValue(modelsToIgnore);
+  }
+  delete modelsToIgnore[this.name];
+  return result;
+};
+
+Model.prototype.getSampleValue = function(modelsToIgnore) {
+  var i;
+  var obj = {};
+  for(i = 0; i < this.properties.length; i++ ) {
+    var property = this.properties[i];
+    obj[property.name] = property.sampleValue(false, modelsToIgnore);
+  }
+  return obj;
+}
+
+Model.prototype.getMockSignature = function(modelsToIgnore) {
+  var propertiesStr = [];
+  var i;
+  for (i = 0; i < this.properties.length; i++) {
+    var prop = this.properties[i];
+    propertiesStr.push(prop.toString());
+  }
+
+  var strong = '<span class="strong">';
+  var stronger = '<span class="stronger">';
+  var strongClose = '</span>';
+  var classOpen = strong + this.name + ' {' + strongClose;
+  var classClose = strong + '}' + strongClose;
+  var returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
+  if (!modelsToIgnore)
+    modelsToIgnore = {};
+
+  modelsToIgnore[this.name] = this;
+  var i;
+  for (i = 0; i < this.properties.length; i++) {
+    var prop = this.properties[i];
+    var ref = prop['$ref'];
+    var model = models[ref];
+    if (model && typeof modelsToIgnore[model.name] === 'undefined') {
+      returnVal = returnVal + ('<br>' + model.getMockSignature(modelsToIgnore));
+    }
+  }
+  return returnVal;
+};
+
+var Property = function(name, obj, required) {
+  this.schema = obj;
+  this.required = required;
+  if(obj['$ref']) {
+    var refType = obj['$ref'];
+    refType = refType.indexOf('#/definitions') === -1 ? refType : refType.substring('#/definitions').length;
+    this['$ref'] = refType;
+  }
+  else if (obj.type === 'array') {
+    if(obj.items['$ref'])
+      this['$ref'] = obj.items['$ref'];
+    else
+      obj = obj.items;
+  }
+  this.name = name;
+  this.description = obj.description;
+  this.obj = obj;
+  this.optional = true;
+  this.default = obj.default || null;
+  this.example = obj.example || null;
+}
+
+Property.prototype.getSampleValue = function (modelsToIgnore) {
+  return this.sampleValue(false, modelsToIgnore);
+}
+
+Property.prototype.isArray = function () {
+  var schema = this.schema;
+  if(schema.type === 'array')
+    return true;
+  else
+    return false;
+}
+
+Property.prototype.sampleValue = function(isArray, ignoredModels) {
+  isArray = (isArray || this.isArray());
+  ignoredModels = (ignoredModels || {});
+  var type = getStringSignature(this.obj);
+  var output;
+
+  if(this['$ref']) {
+    var refModel = models[this['$ref']];
+    if(refModel && typeof ignoredModels[type] === 'undefined') {
+      ignoredModels[type] = this;
+      output = refModel.getSampleValue(ignoredModels);
+    }
+    else
+      type = refModel;
+  }
+  else if(this.example)
+    output = this.example;
+  else if(this.default)
+    output = this.default;
+  else if(type === 'date-time')
+    output = new Date().toISOString();
+  else if(type === 'string')
+    output = 'string';
+  else if(type === 'integer')
+    output = 0;
+  else if(type === 'long')
+    output = 0;
+  else if(type === 'float')
+    output = 0.0;
+  else if(type === 'double')
+    output = 0.0;
+  else if(type === 'boolean')
+    output = true;
+  else
+    output = {};
+  ignoredModels[type] = output;
+  if(isArray)
+    return [output];
+  else
+    return output;
+}
+
+getStringSignature = function(obj) {
+  var str = '';
+  if(obj.type === 'array') {
+    obj = (obj.items || obj['$ref'] || {});
+    str += 'Array[';
+  }
+  if(obj.type === 'integer' && obj.format === 'int32')
+    str += 'integer';
+  else if(obj.type === 'integer' && obj.format === 'int64')
+    str += 'long';
+  else if(obj.type === 'integer' && typeof obj.format === 'undefined')
+    str += 'long';
+  else if(obj.type === 'string' && obj.format === 'date-time')
+    str += 'date-time';
+  else if(obj.type === 'string' && obj.format === 'date')
+    str += 'date';
+  else if(obj.type === 'number' && obj.format === 'float')
+    str += 'float';
+  else if(obj.type === 'number' && obj.format === 'double')
+    str += 'double';
+  else if(obj.type === 'number' && typeof obj.format === 'undefined')
+    str += 'double';
+  else if(obj.type === 'boolean')
+    str += 'boolean';
+  else
+    str += obj.type || obj['$ref'];
+  if(obj.type === 'array')
+    str += ']';
+  return str;
+}
+
+simpleRef = function(name) {
+  if(name.indexOf("#/definitions/") === 0)
+    return name.substring('#/definitions/'.length)
+  else
+    return name;
+}
+
+Property.prototype.toString = function() {
+  var str = getStringSignature(this.obj);
+  if(str !== '') {
+    str = '<span class="propName ' + this.required + '">' + this.name + '</span> (<span class="propType">' + str + '</span>';
+    if(!this.required)
+      str += ', <span class="propOptKey">optional</span>';
+    str += ')';
+  }
+  else 
+    str = this.name + ' (' + JSON.stringify(this.obj) + ')';
+
+  if(typeof this.description !== 'undefined')
+    str += ': ' + this.description;
+  return str;
+}
+
+typeFromJsonSchema = function(type, format) {
+  var str;
+  if(type === 'integer' && format === 'int32')
+    str = 'integer';
+  else if(type === 'integer' && format === 'int64')
+    str = 'long';
+  else if(type === 'integer' && typeof format === 'undefined')
+    str = 'long';
+  else if(type === 'string' && format === 'date-time')
+    str = 'date-time';
+  else if(type === 'string' && format === 'date')
+    str = 'date';
+  else if(type === 'number' && format === 'float')
+    str = 'float';
+  else if(type === 'number' && format === 'double')
+    str = 'double';
+  else if(type === 'number' && typeof format === 'undefined')
+    str = 'double';
+  else if(type === 'boolean')
+    str = 'boolean';
+  else if(type === 'string')
+    str = 'string';
+
+  return str;
+}
+
+var e = (typeof window !== 'undefined' ? window : exports);
+
+var sampleModels = {};
+var cookies = {};
+var models = {};
+
+e.authorizations = new SwaggerAuthorizations();
+e.ApiKeyAuthorization = ApiKeyAuthorization;
+e.PasswordAuthorization = PasswordAuthorization;
+e.CookieAuthorization = CookieAuthorization;
+e.SwaggerClient = SwaggerClient;
+
+/**
+ * SwaggerHttp is a wrapper for executing requests
+ */
+var SwaggerHttp = function() {};
+
+SwaggerHttp.prototype.execute = function(obj) {
+  if(obj && (typeof obj.useJQuery === 'boolean'))
+    this.useJQuery = obj.useJQuery;
+  else
+    this.useJQuery = this.isIE8();
+
+  if(this.useJQuery)
+    return new JQueryHttpClient().execute(obj);
+  else
+    return new ShredHttpClient().execute(obj);
+}
+
+SwaggerHttp.prototype.isIE8 = function() {
+  var detectedIE = false;
+  if (typeof navigator !== 'undefined' && navigator.userAgent) {
+    nav = navigator.userAgent.toLowerCase();
+    if (nav.indexOf('msie') !== -1) {
+      var version = parseInt(nav.split('msie')[1]);
+      if (version <= 8) {
+        detectedIE = true;
+      }
+    }
+  }
+  return detectedIE;
+};
+
+/*
+ * JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic.
+ * NOTE: when jQuery is available it will export both '$' and 'jQuery' to the global space.
+ *       Since we are using closures here we need to alias it for internal use.
+ */
+var JQueryHttpClient = function(options) {
+  "use strict";
+  if(!jQuery){
+    var jQuery = window.jQuery;
+  }
+}
+
+JQueryHttpClient.prototype.execute = function(obj) {
+  var cb = obj.on;
+  var request = obj;
+
+  obj.type = obj.method;
+  obj.cache = false;
+
+  obj.beforeSend = function(xhr) {
+    var key, results;
+    if (obj.headers) {
+      results = [];
+      var key;
+      for (key in obj.headers) {
+        if (key.toLowerCase() === "content-type") {
+          results.push(obj.contentType = obj.headers[key]);
+        } else if (key.toLowerCase() === "accept") {
+          results.push(obj.accepts = obj.headers[key]);
+        } else {
+          results.push(xhr.setRequestHeader(key, obj.headers[key]));
+        }
+      }
+      return results;
+    }
+  };
+
+  obj.data = obj.body;
+  obj.complete = function(response, textStatus, opts) {
+    var headers = {},
+        headerArray = response.getAllResponseHeaders().split("\n");
+
+    for(var i = 0; i < headerArray.length; i++) {
+      var toSplit = headerArray[i].trim();
+      if(toSplit.length === 0)
+        continue;
+      var separator = toSplit.indexOf(":");
+      if(separator === -1) {
+        // Name but no value in the header
+        headers[toSplit] = null;
+        continue;
+      }
+      var name = toSplit.substring(0, separator).trim(),
+          value = toSplit.substring(separator + 1).trim();
+      headers[name] = value;
+    }
+
+    var out = {
+      url: request.url,
+      method: request.method,
+      status: response.status,
+      data: response.responseText,
+      headers: headers
+    };
+
+    var contentType = (headers["content-type"]||headers["Content-Type"]||null)
+
+    if(contentType != null) {
+      if(contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) {
+        if(response.responseText && response.responseText !== "")
+          out.obj = JSON.parse(response.responseText);
+        else
+          out.obj = {}
+      }
+    }
+
+    if(response.status >= 200 && response.status < 300)
+      cb.response(out);
+    else if(response.status === 0 || (response.status >= 400 && response.status < 599))
+      cb.error(out);
+    else
+      return cb.response(out);
+  };
+
+  jQuery.support.cors = true;
+  return jQuery.ajax(obj);
+}
+
+/*
+ * ShredHttpClient is a light-weight, node or browser HTTP client
+ */
+var ShredHttpClient = function(options) {
+  this.options = (options||{});
+  this.isInitialized = false;
+
+  var identity, toString;
+
+  if (typeof window !== 'undefined') {
+    this.Shred = require("./shred");
+    this.content = require("./shred/content");
+  }
+  else
+    this.Shred = require("shred");
+  this.shred = new this.Shred(options);
+}
+
+ShredHttpClient.prototype.initShred = function () {
+  this.isInitialized = true;
+  this.registerProcessors(this.shred);
+}
+
+ShredHttpClient.prototype.registerProcessors = function(shred) {
+  var identity = function(x) {
+    return x;
+  };
+  var toString = function(x) {
+    return x.toString();
+  };
+
+  if (typeof window !== 'undefined') {
+    this.content.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+      parser: identity,
+      stringify: toString
+    });
+  } else {
+    this.Shred.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+      parser: identity,
+      stringify: toString
+    });
+  }
+}
+
+ShredHttpClient.prototype.execute = function(obj) {
+  if(!this.isInitialized)
+    this.initShred();
+
+  var cb = obj.on, res;
+
+  var transform = function(response) {
+    var out = {
+      headers: response._headers,
+      url: response.request.url,
+      method: response.request.method,
+      status: response.status,
+      data: response.content.data
+    };
+
+    var contentType = (response._headers["content-type"]||response._headers["Content-Type"]||null)
+
+    if(contentType != null) {
+      if(contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) {
+        if(response.content.data && response.content.data !== "")
+          try{
+            out.obj = JSON.parse(response.content.data);
+          }
+          catch (e) {
+            // unable to parse
+          }
+        else
+          out.obj = {}
+      }
+    }
+    return out;
+  };
+
+  res = {
+    error: function(response) {
+      if (obj)
+        return cb.error(transform(response));
+    },
+    redirect: function(response) {
+      if (obj)
+        return cb.redirect(transform(response));
+    },
+    307: function(response) {
+      if (obj)
+        return cb.redirect(transform(response));
+    },
+    response: function(response) {
+      if (obj)
+        return cb.response(transform(response));
+    }
+  };
+  if (obj) {
+    obj.on = res;
+  }
+  return this.shred.request(obj);
+};
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger-oauth.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger-oauth.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger-oauth.js	(revision 5961)
@@ -0,0 +1,237 @@
+var appName;
+var popupMask;
+var popupDialog;
+var clientId;
+var realm;
+
+function handleLogin() {
+  var scopes = [];
+
+  var auths = window.swaggerUi.api.authSchemes || window.swaggerUi.api.securityDefinitions;
+  if(auths) {
+    var key;
+    var defs = auths;
+    for(key in defs) {
+      var auth = defs[key];
+      if(auth.type === 'oauth2' && auth.scopes) {
+        var scope;
+        if(Array.isArray(auth.scopes)) {
+          // 1.2 support
+          var i;
+          for(i = 0; i < auth.scopes.length; i++) {
+            scopes.push(auth.scopes[i]);
+          }
+        }
+        else {
+          // 2.0 support
+          for(scope in auth.scopes) {
+            scopes.push({scope: scope, description: auth.scopes[scope]});
+          }
+        }
+      }
+    }
+  }
+
+  if(window.swaggerUi.api
+    && window.swaggerUi.api.info) {
+    appName = window.swaggerUi.api.info.title;
+  }
+
+  popupDialog = $(
+    [
+      '<div class="api-popup-dialog">',
+      '<div class="api-popup-title">Select OAuth2.0 Scopes</div>',
+      '<div class="api-popup-content">',
+        '<p>Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.',
+          '<a href="#">Learn how to use</a>',
+        '</p>',
+        '<p><strong>' + appName + '</strong> API requires the following scopes. Select which ones you want to grant to Swagger UI.</p>',
+        '<ul class="api-popup-scopes">',
+        '</ul>',
+        '<p class="error-msg"></p>',
+        '<div class="api-popup-actions"><button class="api-popup-authbtn api-button green" type="button">Authorize</button><button class="api-popup-cancel api-button gray" type="button">Cancel</button></div>',
+      '</div>',
+      '</div>'].join(''));
+  $(document.body).append(popupDialog);
+
+  popup = popupDialog.find('ul.api-popup-scopes').empty();
+  for (i = 0; i < scopes.length; i ++) {
+    scope = scopes[i];
+    str = '<li><input type="checkbox" id="scope_' + i + '" scope="' + scope.scope + '"/>' + '<label for="scope_' + i + '">' + scope.scope;
+    if (scope.description) {
+      str += '<br/><span class="api-scope-desc">' + scope.description + '</span>';
+    }
+    str += '</label></li>';
+    popup.append(str);
+  }
+
+  var $win = $(window),
+    dw = $win.width(),
+    dh = $win.height(),
+    st = $win.scrollTop(),
+    dlgWd = popupDialog.outerWidth(),
+    dlgHt = popupDialog.outerHeight(),
+    top = (dh -dlgHt)/2 + st,
+    left = (dw - dlgWd)/2;
+
+  popupDialog.css({
+    top: (top < 0? 0 : top) + 'px',
+    left: (left < 0? 0 : left) + 'px'
+  });
+
+  popupDialog.find('button.api-popup-cancel').click(function() {
+    popupMask.hide();
+    popupDialog.hide();
+    popupDialog.empty();
+    popupDialog = [];
+  });
+
+  popupDialog.find('button.api-popup-authbtn').click(function() {
+    popupMask.hide();
+    popupDialog.hide();
+
+    var authSchemes = window.swaggerUi.api.authSchemes;
+    var host = window.location;
+    var pathname = location.pathname.substring(0, location.pathname.lastIndexOf("/"));
+    var redirectUrl = host.protocol + '//' + host.host + pathname + '/o2c.html';
+    var url = null;
+
+    for (var key in authSchemes) {
+      if (authSchemes.hasOwnProperty(key)) {
+        if(authSchemes[key].type === 'oauth2' && authSchemes[key].flow === 'implicit') {
+          var dets = authSchemes[key];
+          url = dets.authorizationUrl + '?response_type=token';
+          window.swaggerUi.tokenName = dets.tokenUrl || 'access_token';          
+        }
+        else if(authSchemes[key].grantTypes) {
+          // 1.2 support
+          var o = authSchemes[key].grantTypes;
+          for(var t in o) {
+            if(o.hasOwnProperty(t) && t === 'implicit') {
+              var dets = o[t];
+              var ep = dets.loginEndpoint.url;
+              url = dets.loginEndpoint.url + '?response_type=token';
+              window.swaggerUi.tokenName = dets.tokenName;
+            }
+          }
+        }
+      }
+    }
+    var scopes = []
+    var o = $('.api-popup-scopes').find('input:checked');
+
+    for(k =0; k < o.length; k++) {
+      scopes.push($(o[k]).attr('scope'));
+    }
+
+    window.enabledScopes=scopes;
+
+    url += '&redirect_uri=' + encodeURIComponent(redirectUrl);
+    url += '&realm=' + encodeURIComponent(realm);
+    url += '&client_id=' + encodeURIComponent(clientId);
+    url += '&scope=' + encodeURIComponent(scopes);
+
+    window.open(url);
+  });
+
+  popupMask.show();
+  popupDialog.show();
+  return;
+}
+
+
+function handleLogout() {
+  for(key in window.authorizations.authz){
+    window.authorizations.remove(key)
+  }
+  window.enabledScopes = null;
+  $('.api-ic.ic-on').addClass('ic-off');
+  $('.api-ic.ic-on').removeClass('ic-on');
+
+  // set the info box
+  $('.api-ic.ic-warning').addClass('ic-error');
+  $('.api-ic.ic-warning').removeClass('ic-warning');
+}
+
+function initOAuth(opts) {
+  var o = (opts||{});
+  var errors = [];
+
+  appName = (o.appName||errors.push('missing appName'));
+  popupMask = (o.popupMask||$('#api-common-mask'));
+  popupDialog = (o.popupDialog||$('.api-popup-dialog'));
+  clientId = (o.clientId||errors.push('missing client id'));
+  realm = (o.realm||errors.push('missing realm'));
+
+  if(errors.length > 0){
+    log('auth unable initialize oauth: ' + errors);
+    return;
+  }
+
+  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
+  $('.api-ic').click(function(s) {
+    if($(s.target).hasClass('ic-off'))
+      handleLogin();
+    else {
+      handleLogout();
+    }
+    false;
+  });
+}
+
+function onOAuthComplete(token) {
+  if(token) {
+    if(token.error) {
+      var checkbox = $('input[type=checkbox],.secured')
+      checkbox.each(function(pos){
+        checkbox[pos].checked = false;
+      });
+      alert(token.error);
+    }
+    else {
+      var b = token[window.swaggerUi.tokenName];
+      if(b){
+        // if all roles are satisfied
+        var o = null;
+        $.each($('.auth #api_information_panel'), function(k, v) {
+          var children = v;
+          if(children && children.childNodes) {
+            var requiredScopes = [];
+            $.each((children.childNodes), function (k1, v1){
+              var inner = v1.innerHTML;
+              if(inner)
+                requiredScopes.push(inner);
+            });
+            var diff = [];
+            for(var i=0; i < requiredScopes.length; i++) {
+              var s = requiredScopes[i];
+              if(window.enabledScopes && window.enabledScopes.indexOf(s) == -1) {
+                diff.push(s);
+              }
+            }
+            if(diff.length > 0){
+              o = v.parentNode;
+              $(o.parentNode).find('.api-ic.ic-on').addClass('ic-off');
+              $(o.parentNode).find('.api-ic.ic-on').removeClass('ic-on');
+
+              // sorry, not all scopes are satisfied
+              $(o).find('.api-ic').addClass('ic-warning');
+              $(o).find('.api-ic').removeClass('ic-error');
+            }
+            else {
+              o = v.parentNode;
+              $(o.parentNode).find('.api-ic.ic-off').addClass('ic-on');
+              $(o.parentNode).find('.api-ic.ic-off').removeClass('ic-off');
+
+              // all scopes are satisfied
+              $(o).find('.api-ic').addClass('ic-info');
+              $(o).find('.api-ic').removeClass('ic-warning');
+              $(o).find('.api-ic').removeClass('ic-error');          
+            }
+          }
+        });
+        window.authorizations.add('oauth2', new ApiKeyAuthorization('Authorization', 'Bearer ' + b, 'header'));
+      }
+    }
+  }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/swagger.js	(revision 5961)
@@ -0,0 +1,1674 @@
+// swagger.js
+// version 2.0.42
+
+(function () {
+
+  var __bind = function (fn, me) {
+    return function () {
+      return fn.apply(me, arguments);
+    };
+  };
+
+  var log = function () {
+    log.history = log.history || [];
+    log.history.push(arguments);
+    if (this.console) {
+      console.log(Array.prototype.slice.call(arguments)[0]);
+    }
+  };
+
+  // if you want to apply conditional formatting of parameter values
+  var parameterMacro = function (value) {
+    return value;
+  }
+
+  // if you want to apply conditional formatting of model property values
+  var modelPropertyMacro = function (value) {
+    return value;
+  }
+
+  if (!Array.prototype.indexOf) {
+    Array.prototype.indexOf = function (obj, start) {
+      for (var i = (start || 0), j = this.length; i < j; i++) {
+        if (this[i] === obj) { return i; }
+      }
+      return -1;
+    }
+  }
+
+  if (!('filter' in Array.prototype)) {
+    Array.prototype.filter = function (filter, that /*opt*/) {
+      var other = [], v;
+      for (var i = 0, n = this.length; i < n; i++)
+        if (i in this && filter.call(that, v = this[i], i, this))
+          other.push(v);
+      return other;
+    };
+  }
+
+  if (!('map' in Array.prototype)) {
+    Array.prototype.map = function (mapper, that /*opt*/) {
+      var other = new Array(this.length);
+      for (var i = 0, n = this.length; i < n; i++)
+        if (i in this)
+          other[i] = mapper.call(that, this[i], i, this);
+      return other;
+    };
+  }
+
+  Object.keys = Object.keys || (function () {
+    var hasOwnProperty = Object.prototype.hasOwnProperty,
+      hasDontEnumBug = !{ toString: null }.propertyIsEnumerable("toString"),
+      DontEnums = [
+      'toString',
+      'toLocaleString',
+      'valueOf',
+      'hasOwnProperty',
+      'isPrototypeOf',
+      'propertyIsEnumerable',
+      'constructor'
+      ],
+    DontEnumsLength = DontEnums.length;
+
+    return function (o) {
+      if (typeof o != "object" && typeof o != "function" || o === null)
+        throw new TypeError("Object.keys called on a non-object");
+
+      var result = [];
+      for (var name in o) {
+        if (hasOwnProperty.call(o, name))
+          result.push(name);
+      }
+
+      if (hasDontEnumBug) {
+        for (var i = 0; i < DontEnumsLength; i++) {
+          if (hasOwnProperty.call(o, DontEnums[i]))
+            result.push(DontEnums[i]);
+        }
+      }
+
+      return result;
+    };
+  })();
+
+  var SwaggerApi = function (url, options) {
+    this.isBuilt = false;
+    this.url = null;
+    this.debug = false;
+    this.basePath = null;
+    this.authorizations = null;
+    this.authorizationScheme = null;
+    this.info = null;
+    this.useJQuery = false;
+    this.modelsArray = [];
+    this.isValid;
+
+    options = (options || {});
+    if (url)
+      if (url.url)
+        options = url;
+      else
+        this.url = url;
+    else
+      options = url;
+
+    if (options.url != null)
+      this.url = options.url;
+
+    if (options.success != null)
+      this.success = options.success;
+
+    if (typeof options.useJQuery === 'boolean')
+      this.useJQuery = options.useJQuery;
+
+    this.failure = options.failure != null ? options.failure : function () { };
+    this.progress = options.progress != null ? options.progress : function () { };
+    if (options.success != null) {
+      this.build();
+      this.isBuilt = true;
+    }
+  }
+
+  SwaggerApi.prototype.build = function () {
+    if (this.isBuilt)
+      return this;
+    var _this = this;
+    this.progress('fetching resource list: ' + this.url);
+    var obj = {
+      useJQuery: this.useJQuery,
+      url: this.url,
+      method: "get",
+      headers: {
+        accept: "application/json,application/json;charset=\"utf-8\",*/*"
+      },
+      on: {
+        error: function (response) {
+          if (_this.url.substring(0, 4) !== 'http') {
+            return _this.fail('Please specify the protocol for ' + _this.url);
+          } else if (response.status === 0) {
+            return _this.fail('Can\'t read from server.  It may not have the appropriate access-control-origin settings.');
+          } else if (response.status === 404) {
+            return _this.fail('Can\'t read swagger JSON from ' + _this.url);
+          } else {
+            return _this.fail(response.status + ' : ' + response.statusText + ' ' + _this.url);
+          }
+        },
+        response: function (resp) {
+          var responseObj = resp.obj || JSON.parse(resp.data);
+          _this.swaggerVersion = responseObj.swaggerVersion;
+          if (_this.swaggerVersion === "1.2") {
+            return _this.buildFromSpec(responseObj);
+          } else {
+            return _this.buildFrom1_1Spec(responseObj);
+          }
+        }
+      }
+    };
+    var e = (typeof window !== 'undefined' ? window : exports);
+    e.authorizations.apply(obj);
+    new SwaggerHttp().execute(obj);
+    return this;
+  };
+
+  SwaggerApi.prototype.buildFromSpec = function (response) {
+    if (response.apiVersion != null) {
+      this.apiVersion = response.apiVersion;
+    }
+    this.apis = {};
+    this.apisArray = [];
+    this.consumes = response.consumes;
+    this.produces = response.produces;
+    this.authSchemes = response.authorizations;
+    if (response.info != null) {
+      this.info = response.info;
+    }
+    var isApi = false;
+    var i;
+    for (i = 0; i < response.apis.length; i++) {
+      var api = response.apis[i];
+      if (api.operations) {
+        var j;
+        for (j = 0; j < api.operations.length; j++) {
+          operation = api.operations[j];
+          isApi = true;
+        }
+      }
+    }
+    if (response.basePath)
+      this.basePath = response.basePath;
+    else if (this.url.indexOf('?') > 0)
+      this.basePath = this.url.substring(0, this.url.lastIndexOf('?'));
+    else
+      this.basePath = this.url;
+
+    if (isApi) {
+      var newName = response.resourcePath.replace(/\//g, '');
+      this.resourcePath = response.resourcePath;
+      var res = new SwaggerResource(response, this);
+      this.apis[newName] = res;
+      this.apisArray.push(res);
+    } else {
+      var k;
+      for (k = 0; k < response.apis.length; k++) {
+        var resource = response.apis[k];
+        var res = new SwaggerResource(resource, this);
+        this.apis[res.name] = res;
+        this.apisArray.push(res);
+      }
+    }
+    this.isValid = true;
+    if (this.success) {
+      this.success();
+    }
+    return this;
+  };
+
+  SwaggerApi.prototype.buildFrom1_1Spec = function (response) {
+    log("This API is using a deprecated version of Swagger!  Please see http://github.com/wordnik/swagger-core/wiki for more info");
+    if (response.apiVersion != null)
+      this.apiVersion = response.apiVersion;
+    this.apis = {};
+    this.apisArray = [];
+    this.produces = response.produces;
+    if (response.info != null) {
+      this.info = response.info;
+    }
+    var isApi = false;
+    for (var i = 0; i < response.apis.length; i++) {
+      var api = response.apis[i];
+      if (api.operations) {
+        for (var j = 0; j < api.operations.length; j++) {
+          operation = api.operations[j];
+          isApi = true;
+        }
+      }
+    }
+    if (response.basePath) {
+      this.basePath = response.basePath;
+    } else if (this.url.indexOf('?') > 0) {
+      this.basePath = this.url.substring(0, this.url.lastIndexOf('?'));
+    } else {
+      this.basePath = this.url;
+    }
+    if (isApi) {
+      var newName = response.resourcePath.replace(/\//g, '');
+      this.resourcePath = response.resourcePath;
+      var res = new SwaggerResource(response, this);
+      this.apis[newName] = res;
+      this.apisArray.push(res);
+    } else {
+      for (k = 0; k < response.apis.length; k++) {
+        resource = response.apis[k];
+        var res = new SwaggerResource(resource, this);
+        this.apis[res.name] = res;
+        this.apisArray.push(res);
+      }
+    }
+    this.isValid = true;
+    if (this.success) {
+      this.success();
+    }
+    return this;
+  };
+
+  SwaggerApi.prototype.selfReflect = function () {
+    var resource, resource_name, _ref;
+    if (this.apis == null) {
+      return false;
+    }
+    _ref = this.apis;
+    for (resource_name in _ref) {
+      resource = _ref[resource_name];
+      if (resource.ready == null) {
+        return false;
+      }
+    }
+    this.setConsolidatedModels();
+    this.ready = true;
+    if (this.success != null) {
+      return this.success();
+    }
+  };
+
+  SwaggerApi.prototype.fail = function (message) {
+    this.failure(message);
+    throw message;
+  };
+
+  SwaggerApi.prototype.setConsolidatedModels = function () {
+    var model, modelName, resource, resource_name, _i, _len, _ref, _ref1, _results;
+    this.models = {};
+    _ref = this.apis;
+    for (resource_name in _ref) {
+      resource = _ref[resource_name];
+      for (modelName in resource.models) {
+        if (this.models[modelName] == null) {
+          this.models[modelName] = resource.models[modelName];
+          this.modelsArray.push(resource.models[modelName]);
+        }
+      }
+    }
+    _ref1 = this.modelsArray;
+    _results = [];
+    for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+      model = _ref1[_i];
+      _results.push(model.setReferencedModels(this.models));
+    }
+    return _results;
+  };
+
+  SwaggerApi.prototype.help = function () {
+    var operation, operation_name, parameter, resource, resource_name, _i, _len, _ref, _ref1, _ref2;
+    _ref = this.apis;
+    for (resource_name in _ref) {
+      resource = _ref[resource_name];
+      log(resource_name);
+      _ref1 = resource.operations;
+      for (operation_name in _ref1) {
+        operation = _ref1[operation_name];
+        log("  " + operation.nickname);
+        _ref2 = operation.parameters;
+        for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+          parameter = _ref2[_i];
+          log("  " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description);
+        }
+      }
+    }
+    return this;
+  };
+
+  var SwaggerResource = function (resourceObj, api) {
+    var _this = this;
+    this.api = api;
+    this.api = this.api;
+    var consumes = (this.consumes | []);
+    var produces = (this.produces | []);
+    this.path = this.api.resourcePath != null ? this.api.resourcePath : resourceObj.path;
+    this.description = resourceObj.description;
+
+    var parts = this.path.split("/");
+    this.name = parts[parts.length - 1].replace('.{format}', '');
+    this.basePath = this.api.basePath;
+    this.operations = {};
+    this.operationsArray = [];
+    this.modelsArray = [];
+    this.models = {};
+    this.rawModels = {};
+    this.useJQuery = (typeof api.useJQuery !== 'undefined' ? api.useJQuery : null);
+
+    if ((resourceObj.apis != null) && (this.api.resourcePath != null)) {
+      this.addApiDeclaration(resourceObj);
+    } else {
+      if (this.path == null) {
+        this.api.fail("SwaggerResources must have a path.");
+      }
+      if (this.path.substring(0, 4) === 'http') {
+        this.url = this.path.replace('{format}', 'json');
+      } else {
+        this.url = this.api.basePath + this.path.replace('{format}', 'json');
+      }
+      this.api.progress('fetching resource ' + this.name + ': ' + this.url);
+      var obj = {
+        url: this.url,
+        method: "get",
+        useJQuery: this.useJQuery,
+        headers: {
+          accept: "application/json,application/json;charset=\"utf-8\",*/*"
+        },
+        on: {
+          response: function (resp) {
+            var responseObj = resp.obj || JSON.parse(resp.data);
+            return _this.addApiDeclaration(responseObj);
+          },
+          error: function (response) {
+            return _this.api.fail("Unable to read api '" +
+              _this.name + "' from path " + _this.url + " (server returned " + response.statusText + ")");
+          }
+        }
+      };
+      var e = typeof window !== 'undefined' ? window : exports;
+      e.authorizations.apply(obj);
+      new SwaggerHttp().execute(obj);
+    }
+  }
+
+  SwaggerResource.prototype.getAbsoluteBasePath = function (relativeBasePath) {
+    var pos, url;
+    url = this.api.basePath;
+    pos = url.lastIndexOf(relativeBasePath);
+    var parts = url.split("/");
+    var rootUrl = parts[0] + "//" + parts[2];
+
+    if (relativeBasePath.indexOf("http") === 0)
+      return relativeBasePath;
+    if (relativeBasePath === "/")
+      return rootUrl;
+    if (relativeBasePath.substring(0, 1) == "/") {
+      // use root + relative
+      return rootUrl + relativeBasePath;
+    }
+    else {
+      var pos = this.basePath.lastIndexOf("/");
+      var base = this.basePath.substring(0, pos);
+      if (base.substring(base.length - 1) == "/")
+        return base + relativeBasePath;
+      else
+        return base + "/" + relativeBasePath;
+    }
+  };
+
+  SwaggerResource.prototype.addApiDeclaration = function (response) {
+    if (response.produces != null)
+      this.produces = response.produces;
+    if (response.consumes != null)
+      this.consumes = response.consumes;
+    if ((response.basePath != null) && response.basePath.replace(/\s/g, '').length > 0)
+      this.basePath = response.basePath.indexOf("http") === -1 ? this.getAbsoluteBasePath(response.basePath) : response.basePath;
+
+    this.addModels(response.models);
+    if (response.apis) {
+      for (var i = 0 ; i < response.apis.length; i++) {
+        var endpoint = response.apis[i];
+        this.addOperations(endpoint.path, endpoint.operations, response.consumes, response.produces);
+      }
+    }
+    this.api[this.name] = this;
+    this.ready = true;
+    return this.api.selfReflect();
+  };
+
+  SwaggerResource.prototype.addModels = function (models) {
+    if (models != null) {
+      var modelName;
+      for (modelName in models) {
+        if (this.models[modelName] == null) {
+          var swaggerModel = new SwaggerModel(modelName, models[modelName]);
+          this.modelsArray.push(swaggerModel);
+          this.models[modelName] = swaggerModel;
+          this.rawModels[modelName] = models[modelName];
+        }
+      }
+      var output = [];
+      for (var i = 0; i < this.modelsArray.length; i++) {
+        var model = this.modelsArray[i];
+        output.push(model.setReferencedModels(this.models));
+      }
+      return output;
+    }
+  };
+
+  SwaggerResource.prototype.addOperations = function (resource_path, ops, consumes, produces) {
+    if (ops) {
+      var output = [];
+      for (var i = 0; i < ops.length; i++) {
+        var o = ops[i];
+        consumes = this.consumes;
+        produces = this.produces;
+        if (o.consumes != null)
+          consumes = o.consumes;
+        else
+          consumes = this.consumes;
+
+        if (o.produces != null)
+          produces = o.produces;
+        else
+          produces = this.produces;
+        var type = (o.type || o.responseClass);
+
+        if (type === "array") {
+          ref = null;
+          if (o.items)
+            ref = o.items["type"] || o.items["$ref"];
+          type = "array[" + ref + "]";
+        }
+        var responseMessages = o.responseMessages;
+        var method = o.method;
+        if (o.httpMethod) {
+          method = o.httpMethod;
+        }
+        if (o.supportedContentTypes) {
+          consumes = o.supportedContentTypes;
+        }
+        if (o.errorResponses) {
+          responseMessages = o.errorResponses;
+          for (var j = 0; j < responseMessages.length; j++) {
+            r = responseMessages[j];
+            r.message = r.reason;
+            r.reason = null;
+          }
+        }
+        o.nickname = this.sanitize(o.nickname);
+        var op = new SwaggerOperation(o.nickname, resource_path, method, o.parameters, o.summary, o.notes, type, responseMessages, this, consumes, produces, o.authorizations, o.deprecated);
+        this.operations[op.nickname] = op;
+        output.push(this.operationsArray.push(op));
+      }
+      return output;
+    }
+  };
+
+  SwaggerResource.prototype.sanitize = function (nickname) {
+    var op;
+    op = nickname.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|.\/?,\\'""-]/g, '_');
+    op = op.replace(/((_){2,})/g, '_');
+    op = op.replace(/^(_)*/g, '');
+    op = op.replace(/([_])*$/g, '');
+    return op;
+  };
+
+  SwaggerResource.prototype.help = function () {
+    var op = this.operations;
+    var output = [];
+    var operation_name;
+    for (operation_name in op) {
+      operation = op[operation_name];
+      var msg = "  " + operation.nickname;
+      for (var i = 0; i < operation.parameters; i++) {
+        parameter = operation.parameters[i];
+        msg.concat("  " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description);
+      }
+      output.push(msg);
+    }
+    return output;
+  };
+
+  var SwaggerModel = function (modelName, obj) {
+    this.name = obj.id != null ? obj.id : modelName;
+    this.properties = [];
+    var propertyName;
+    for (propertyName in obj.properties) {
+      if (obj.required != null) {
+        var value;
+        for (value in obj.required) {
+          if (propertyName === obj.required[value]) {
+            obj.properties[propertyName].required = true;
+          }
+        }
+      }
+      var prop = new SwaggerModelProperty(propertyName, obj.properties[propertyName]);
+      this.properties.push(prop);
+    }
+  }
+
+  SwaggerModel.prototype.setReferencedModels = function (allModels) {
+    var results = [];
+    for (var i = 0; i < this.properties.length; i++) {
+      var property = this.properties[i];
+      var type = property.type || property.dataType;
+      if (allModels[type] != null)
+        results.push(property.refModel = allModels[type]);
+      else if ((property.refDataType != null) && (allModels[property.refDataType] != null))
+        results.push(property.refModel = allModels[property.refDataType]);
+      else
+        results.push(void 0);
+    }
+    return results;
+  };
+
+  SwaggerModel.prototype.getMockSignature = function (modelsToIgnore) {
+    var propertiesStr = [];
+    for (var i = 0; i < this.properties.length; i++) {
+      var prop = this.properties[i];
+      propertiesStr.push(prop.toString());
+    }
+
+    var strong = '<span class="strong">';
+    var stronger = '<span class="stronger">';
+    var strongClose = '</span>';
+    var classOpen = strong + this.name + ' {' + strongClose;
+    var classClose = strong + '}' + strongClose;
+    var returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
+    if (!modelsToIgnore)
+      modelsToIgnore = [];
+    modelsToIgnore.push(this.name);
+
+    for (var i = 0; i < this.properties.length; i++) {
+      var prop = this.properties[i];
+      if ((prop.refModel != null) && modelsToIgnore.indexOf(prop.refModel.name) === -1) {
+        returnVal = returnVal + ('<br>' + prop.refModel.getMockSignature(modelsToIgnore));
+      }
+    }
+    return returnVal;
+  };
+
+  SwaggerModel.prototype.createJSONSample = function (modelsToIgnore) {
+    if (sampleModels[this.name]) {
+      return sampleModels[this.name];
+    }
+    else {
+      var result = {};
+      var modelsToIgnore = (modelsToIgnore || [])
+      modelsToIgnore.push(this.name);
+      for (var i = 0; i < this.properties.length; i++) {
+        var prop = this.properties[i];
+        result[prop.name] = prop.getSampleValue(modelsToIgnore);
+      }
+      modelsToIgnore.pop(this.name);
+      return result;
+    }
+  };
+
+  var SwaggerModelProperty = function (name, obj) {
+    this.name = name;
+    this.dataType = obj.type || obj.dataType || obj["$ref"];
+    this.isCollection = this.dataType && (this.dataType.toLowerCase() === 'array' || this.dataType.toLowerCase() === 'list' || this.dataType.toLowerCase() === 'set');
+    this.descr = obj.description;
+    this.required = obj.required;
+    this.defaultValue = modelPropertyMacro(obj.defaultValue);
+    if (obj.items != null) {
+      if (obj.items.type != null) {
+        this.refDataType = obj.items.type;
+      }
+      if (obj.items.$ref != null) {
+        this.refDataType = obj.items.$ref;
+      }
+    }
+    this.dataTypeWithRef = this.refDataType != null ? (this.dataType + '[' + this.refDataType + ']') : this.dataType;
+    if (obj.allowableValues != null) {
+      this.valueType = obj.allowableValues.valueType;
+      this.values = obj.allowableValues.values;
+      if (this.values != null) {
+        this.valuesString = "'" + this.values.join("' or '") + "'";
+      }
+    }
+    if (obj["enum"] != null) {
+      this.valueType = "string";
+      this.values = obj["enum"];
+      if (this.values != null) {
+        this.valueString = "'" + this.values.join("' or '") + "'";
+      }
+    }
+  }
+
+  SwaggerModelProperty.prototype.getSampleValue = function (modelsToIgnore) {
+    var result;
+    if ((this.refModel != null) && (modelsToIgnore.indexOf(this.refModel.name) === -1)) {
+      result = this.refModel.createJSONSample(modelsToIgnore);
+    } else {
+      if (this.isCollection) {
+        result = this.toSampleValue(this.refDataType);
+      } else {
+        result = this.toSampleValue(this.dataType);
+      }
+    }
+    if (this.isCollection) {
+      return [result];
+    } else {
+      return result;
+    }
+  };
+
+  SwaggerModelProperty.prototype.toSampleValue = function (value) {
+    var result;
+    if ((typeof this.defaultValue !== 'undefined') && this.defaultValue !== null) {
+      result = this.defaultValue;
+    } else if (value === "integer") {
+      result = 0;
+    } else if (value === "boolean") {
+      result = false;
+    } else if (value === "double" || value === "number") {
+      result = 0.0;
+    } else if (value === "string") {
+      result = "";
+    } else {
+      result = value;
+    }
+    return result;
+  };
+
+  SwaggerModelProperty.prototype.toString = function () {
+    var req = this.required ? 'propReq' : 'propOpt';
+    var str = '<span class="propName ' + req + '">' + this.name + '</span> (<span class="propType">' + this.dataTypeWithRef + '</span>';
+    if (!this.required) {
+      str += ', <span class="propOptKey">optional</span>';
+    }
+    str += ')';
+    if (this.values != null) {
+      str += " = <span class='propVals'>['" + this.values.join("' or '") + "']</span>";
+    }
+    if (this.descr != null) {
+      str += ': <span class="propDesc">' + this.descr + '</span>';
+    }
+    return str;
+  };
+
+  var SwaggerOperation = function (nickname, path, method, parameters, summary, notes, type, responseMessages, resource, consumes, produces, authorizations, deprecated) {
+    var _this = this;
+
+    var errors = [];
+    this.nickname = (nickname || errors.push("SwaggerOperations must have a nickname."));
+    this.path = (path || errors.push("SwaggerOperation " + nickname + " is missing path."));
+    this.method = (method || errors.push("SwaggerOperation " + nickname + " is missing method."));
+    this.parameters = parameters != null ? parameters : [];
+    this.summary = summary;
+    this.notes = notes;
+    this.type = type;
+    this.responseMessages = (responseMessages || []);
+    this.resource = (resource || errors.push("Resource is required"));
+    this.consumes = consumes;
+    this.produces = produces;
+    this.authorizations = authorizations;
+    this.deprecated = deprecated;
+    this["do"] = __bind(this["do"], this);
+
+    if (errors.length > 0) {
+      console.error('SwaggerOperation errors', errors, arguments);
+      this.resource.api.fail(errors);
+    }
+
+    this.path = this.path.replace('{format}', 'json');
+    this.method = this.method.toLowerCase();
+    this.isGetMethod = this.method === "get";
+
+    this.resourceName = this.resource.name;
+    if (typeof this.type !== 'undefined' && this.type === 'void')
+      this.type = null;
+    else {
+      this.responseClassSignature = this.getSignature(this.type, this.resource.models);
+      this.responseSampleJSON = this.getSampleJSON(this.type, this.resource.models);
+    }
+
+    for (var i = 0; i < this.parameters.length; i++) {
+      var param = this.parameters[i];
+      // might take this away
+      param.name = param.name || param.type || param.dataType;
+
+      // for 1.1 compatibility
+      var type = param.type || param.dataType;
+      if (type === 'array') {
+        type = 'array[' + (param.items.$ref ? param.items.$ref : param.items.type) + ']';
+      }
+      param.type = type;
+
+      if (type && type.toLowerCase() === 'boolean') {
+        param.allowableValues = {};
+        param.allowableValues.values = ["true", "false"];
+      }
+      param.signature = this.getSignature(type, this.resource.models);
+      param.sampleJSON = this.getSampleJSON(type, this.resource.models);
+
+      var enumValue = param["enum"];
+      if (enumValue != null) {
+        param.isList = true;
+        param.allowableValues = {};
+        param.allowableValues.descriptiveValues = [];
+
+        for (var j = 0; j < enumValue.length; j++) {
+          var v = enumValue[j];
+          if (param.defaultValue != null) {
+            param.allowableValues.descriptiveValues.push({
+              value: String(v),
+              isDefault: (v === param.defaultValue)
+            });
+          }
+          else {
+            param.allowableValues.descriptiveValues.push({
+              value: String(v),
+              isDefault: false
+            });
+          }
+        }
+      }
+      else if (param.allowableValues != null) {
+        if (param.allowableValues.valueType === "RANGE")
+          param.isRange = true;
+        else
+          param.isList = true;
+        if (param.allowableValues != null) {
+          param.allowableValues.descriptiveValues = [];
+          if (param.allowableValues.values) {
+            for (var j = 0; j < param.allowableValues.values.length; j++) {
+              var v = param.allowableValues.values[j];
+              if (param.defaultValue != null) {
+                param.allowableValues.descriptiveValues.push({
+                  value: String(v),
+                  isDefault: (v === param.defaultValue)
+                });
+              }
+              else {
+                param.allowableValues.descriptiveValues.push({
+                  value: String(v),
+                  isDefault: false
+                });
+              }
+            }
+          }
+        }
+      }
+      param.defaultValue = parameterMacro(param.defaultValue);
+    }
+    this.resource[this.nickname] = function (args, callback, error) {
+      return _this["do"](args, callback, error);
+    };
+    this.resource[this.nickname].help = function () {
+      return _this.help();
+    };
+  }
+
+  SwaggerOperation.prototype.isListType = function (type) {
+    if (type && type.indexOf('[') >= 0) {
+      return type.substring(type.indexOf('[') + 1, type.indexOf(']'));
+    } else {
+      return void 0;
+    }
+  };
+
+  SwaggerOperation.prototype.getSignature = function (type, models) {
+    var isPrimitive, listType;
+    listType = this.isListType(type);
+    isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true;
+    if (isPrimitive) {
+      return type;
+    } else {
+      if (listType != null) {
+        return models[listType].getMockSignature();
+      } else {
+        return models[type].getMockSignature();
+      }
+    }
+  };
+
+  SwaggerOperation.prototype.getSampleJSON = function (type, models) {
+    var isPrimitive, listType, val;
+    listType = this.isListType(type);
+    isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true;
+    val = isPrimitive ? void 0 : (listType != null ? models[listType].createJSONSample() : models[type].createJSONSample());
+    if (val) {
+      val = listType ? [val] : val;
+      if (typeof val == "string")
+        return val;
+      else if (typeof val === "object") {
+        var t = val;
+        if (val instanceof Array && val.length > 0) {
+          t = val[0];
+        }
+        if (t.nodeName) {
+          var xmlString = new XMLSerializer().serializeToString(t);
+          return this.formatXml(xmlString);
+        }
+        else
+          return JSON.stringify(val, null, 2);
+      }
+      else
+        return val;
+    }
+  };
+
+  SwaggerOperation.prototype["do"] = function (args, opts, callback, error) {
+    var key, param, params, possibleParams, req, requestContentType, responseContentType, value, _i, _len, _ref;
+    if (args == null) {
+      args = {};
+    }
+    if (opts == null) {
+      opts = {};
+    }
+    requestContentType = null;
+    responseContentType = null;
+    if ((typeof args) === "function") {
+      error = opts;
+      callback = args;
+      args = {};
+    }
+    if ((typeof opts) === "function") {
+      error = callback;
+      callback = opts;
+    }
+    if (error == null) {
+      error = function (xhr, textStatus, error) {
+        return log(xhr, textStatus, error);
+      };
+    }
+    if (callback == null) {
+      callback = function (response) {
+        var content;
+        content = null;
+        if (response != null) {
+          content = response.data;
+        } else {
+          content = "no data";
+        }
+        return log("default callback: " + content);
+      };
+    }
+    params = {};
+    params.headers = [];
+    if (args.headers != null) {
+      params.headers = args.headers;
+      delete args.headers;
+    }
+
+    var possibleParams = [];
+    for (var i = 0; i < this.parameters.length; i++) {
+      var param = this.parameters[i];
+      if (param.paramType === 'header') {
+        if (args[param.name])
+          params.headers[param.name] = args[param.name];
+      }
+      else if (param.paramType === 'form' || param.paramType.toLowerCase() === 'file')
+        possibleParams.push(param);
+    }
+
+    if (args.body != null) {
+      params.body = args.body;
+      delete args.body;
+    }
+
+    if (possibleParams) {
+      var key;
+      for (key in possibleParams) {
+        var value = possibleParams[key];
+        if (args[value.name]) {
+          params[value.name] = args[value.name];
+        }
+      }
+    }
+
+    req = new SwaggerRequest(this.method, this.urlify(args), params, opts, callback, error, this);
+    if (opts.mock != null) {
+      return req;
+    } else {
+      return true;
+    }
+  };
+
+  SwaggerOperation.prototype.pathJson = function () {
+    return this.path.replace("{format}", "json");
+  };
+
+  SwaggerOperation.prototype.pathXml = function () {
+    return this.path.replace("{format}", "xml");
+  };
+
+  SwaggerOperation.prototype.encodePathParam = function (pathParam) {
+    var encParts, part, parts, _i, _len;
+    pathParam = pathParam.toString();
+    if (pathParam.indexOf("/") === -1) {
+      return encodeURIComponent(pathParam);
+    } else {
+      parts = pathParam.split("/");
+      encParts = [];
+      for (_i = 0, _len = parts.length; _i < _len; _i++) {
+        part = parts[_i];
+        encParts.push(encodeURIComponent(part));
+      }
+      return encParts.join("/");
+    }
+  };
+
+  SwaggerOperation.prototype.urlify = function (args) {
+    var url = this.resource.basePath + this.pathJson();
+    var params = this.parameters;
+    for (var i = 0; i < params.length; i++) {
+      var param = params[i];
+      if (param.paramType === 'path') {
+        if (args[param.name]) {
+          // apply path params and remove from args
+          var reg = new RegExp('\\{\\s*?' + param.name + '.*?\\}(?=\\s*?(\\/|$))', 'gi');
+          url = url.replace(reg, this.encodePathParam(args[param.name]));
+          delete args[param.name];
+        }
+        else
+          throw "" + param.name + " is a required path param.";
+      }
+    }
+
+    var queryParams = "";
+    for (var i = 0; i < params.length; i++) {
+      var param = params[i];
+      if (queryParams !== '')
+        queryParams += '&';    
+      if (Array.isArray(param)) {
+        var j;   
+        var output = '';   
+        for(j = 0; j < param.length; j++) {    
+          if(j > 0)    
+            output += ',';   
+          output += encodeURIComponent(param[j]);    
+        }    
+        queryParams += encodeURIComponent(param.name) + '=' + output;    
+      }    
+      else {   
+        queryParams += encodeURIComponent(param.name) + '=' + encodeURIComponent(args[param.name]);                
+      }
+    }
+    return url;
+  };
+
+  SwaggerOperation.prototype.supportHeaderParams = function () {
+    return this.resource.api.supportHeaderParams;
+  };
+
+  SwaggerOperation.prototype.supportedSubmitMethods = function () {
+    return this.resource.api.supportedSubmitMethods;
+  };
+
+  SwaggerOperation.prototype.getQueryParams = function (args) {
+    return this.getMatchingParams(['query'], args);
+  };
+
+  SwaggerOperation.prototype.getHeaderParams = function (args) {
+    return this.getMatchingParams(['header'], args);
+  };
+
+  SwaggerOperation.prototype.getMatchingParams = function (paramTypes, args) {
+    var matchingParams = {};
+    var params = this.parameters;
+    for (var i = 0; i < params.length; i++) {
+      param = params[i];
+      if (args && args[param.name])
+        matchingParams[param.name] = args[param.name];
+    }
+    var headers = this.resource.api.headers;
+    var name;
+    for (name in headers) {
+      var value = headers[name];
+      matchingParams[name] = value;
+    }
+    return matchingParams;
+  };
+
+  SwaggerOperation.prototype.help = function () {
+    var msg = "";
+    var params = this.parameters;
+    for (var i = 0; i < params.length; i++) {
+      var param = params[i];
+      if (msg !== "")
+        msg += "\n";
+      msg += "* " + param.name + (param.required ? ' (required)' : '') + " - " + param.description;
+    }
+    return msg;
+  };
+
+
+  SwaggerOperation.prototype.formatXml = function (xml) {
+    var contexp, formatted, indent, lastType, lines, ln, pad, reg, transitions, wsexp, _fn, _i, _len;
+    reg = /(>)(<)(\/*)/g;
+    wsexp = /[ ]*(.*)[ ]+\n/g;
+    contexp = /(<.+>)(.+\n)/g;
+    xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2');
+    pad = 0;
+    formatted = '';
+    lines = xml.split('\n');
+    indent = 0;
+    lastType = 'other';
+    transitions = {
+      'single->single': 0,
+      'single->closing': -1,
+      'single->opening': 0,
+      'single->other': 0,
+      'closing->single': 0,
+      'closing->closing': -1,
+      'closing->opening': 0,
+      'closing->other': 0,
+      'opening->single': 1,
+      'opening->closing': 0,
+      'opening->opening': 1,
+      'opening->other': 1,
+      'other->single': 0,
+      'other->closing': -1,
+      'other->opening': 0,
+      'other->other': 0
+    };
+    _fn = function (ln) {
+      var fromTo, j, key, padding, type, types, value;
+      types = {
+        single: Boolean(ln.match(/<.+\/>/)),
+        closing: Boolean(ln.match(/<\/.+>/)),
+        opening: Boolean(ln.match(/<[^!?].*>/))
+      };
+      type = ((function () {
+        var _results;
+        _results = [];
+        for (key in types) {
+          value = types[key];
+          if (value) {
+            _results.push(key);
+          }
+        }
+        return _results;
+      })())[0];
+      type = type === void 0 ? 'other' : type;
+      fromTo = lastType + '->' + type;
+      lastType = type;
+      padding = '';
+      indent += transitions[fromTo];
+      padding = ((function () {
+        var _j, _ref5, _results;
+        _results = [];
+        for (j = _j = 0, _ref5 = indent; 0 <= _ref5 ? _j < _ref5 : _j > _ref5; j = 0 <= _ref5 ? ++_j : --_j) {
+          _results.push('  ');
+        }
+        return _results;
+      })()).join('');
+      if (fromTo === 'opening->closing') {
+        return formatted = formatted.substr(0, formatted.length - 1) + ln + '\n';
+      } else {
+        return formatted += padding + ln + '\n';
+      }
+    };
+    for (_i = 0, _len = lines.length; _i < _len; _i++) {
+      ln = lines[_i];
+      _fn(ln);
+    }
+    return formatted;
+  };
+
+  var SwaggerRequest = function (type, url, params, opts, successCallback, errorCallback, operation, execution) {
+    var _this = this;
+    var errors = [];
+    this.useJQuery = (typeof operation.resource.useJQuery !== 'undefined' ? operation.resource.useJQuery : null);
+    this.type = (type || errors.push("SwaggerRequest type is required (get/post/put/delete/patch/options)."));
+    this.url = (url || errors.push("SwaggerRequest url is required."));
+    this.params = params;
+    this.opts = opts;
+    this.successCallback = (successCallback || errors.push("SwaggerRequest successCallback is required."));
+    this.errorCallback = (errorCallback || errors.push("SwaggerRequest error callback is required."));
+    this.operation = (operation || errors.push("SwaggerRequest operation is required."));
+    this.execution = execution;
+    this.headers = (params.headers || {});
+
+    if (errors.length > 0) {
+      throw errors;
+    }
+
+    this.type = this.type.toUpperCase();
+
+    // set request, response content type headers
+    var headers = this.setHeaders(params, this.operation);
+    var body = params.body;
+
+    // encode the body for form submits
+    if (headers["Content-Type"]) {
+      var values = {};
+      var i;
+      var operationParams = this.operation.parameters;
+      for (i = 0; i < operationParams.length; i++) {
+        var param = operationParams[i];
+        if (param.paramType === "form")
+          values[param.name] = param;
+      }
+
+      if (headers["Content-Type"].indexOf("application/x-www-form-urlencoded") === 0) {
+        var encoded = "";
+        var key, value;
+        for (key in values) {
+          value = this.params[key];
+          if (typeof value !== 'undefined') {
+            if (encoded !== "")
+              encoded += "&";
+            encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value);
+          }
+        }
+        body = encoded;
+      }
+      else if (headers["Content-Type"].indexOf("multipart/form-data") === 0) {
+        // encode the body for form submits
+        var data = "";
+        var boundary = "----SwaggerFormBoundary" + Date.now();
+        var key, value;
+        for (key in values) {
+          value = this.params[key];
+          if (typeof value !== 'undefined') {
+            data += '--' + boundary + '\n';
+            data += 'Content-Disposition: form-data; name="' + key + '"';
+            data += '\n\n';
+            data += value + "\n";
+          }
+        }
+        data += "--" + boundary + "--\n";
+        headers["Content-Type"] = "multipart/form-data; boundary=" + boundary;
+        body = data;
+      }
+    }
+
+    var obj;
+    if (!((this.headers != null) && (this.headers.mock != null))) {
+      obj = {
+        url: this.url,
+        method: this.type,
+        headers: headers,
+        body: body,
+        useJQuery: this.useJQuery,
+        on: {
+          error: function (response) {
+            return _this.errorCallback(response, _this.opts.parent);
+          },
+          redirect: function (response) {
+            return _this.successCallback(response, _this.opts.parent);
+          },
+          307: function (response) {
+            return _this.successCallback(response, _this.opts.parent);
+          },
+          response: function (response) {
+            return _this.successCallback(response, _this.opts.parent);
+          }
+        }
+      };
+      var e;
+      if (typeof window !== 'undefined') {
+        e = window;
+      } else {
+        e = exports;
+      }
+      var status = e.authorizations.apply(obj, this.operation.authorizations);
+      if (opts.mock == null) {
+        if (status !== false) {
+          new SwaggerHttp().execute(obj);
+        } else {
+          obj.canceled = true;
+        }
+      } else {
+        return obj;
+      }
+    }
+    return obj;
+  };
+
+  SwaggerRequest.prototype.setHeaders = function (params, operation) {
+    // default type
+    var accepts = "application/json";
+    var consumes = "application/json";
+
+    var allDefinedParams = this.operation.parameters;
+    var definedFormParams = [];
+    var definedFileParams = [];
+    var body = params.body;
+    var headers = {};
+
+    // get params from the operation and set them in definedFileParams, definedFormParams, headers
+    var i;
+    for (i = 0; i < allDefinedParams.length; i++) {
+      var param = allDefinedParams[i];
+      if (param.paramType === "form")
+        definedFormParams.push(param);
+      else if (param.paramType === "file")
+        definedFileParams.push(param);
+      else if (param.paramType === "header" && this.params.headers) {
+        var key = param.name;
+        var headerValue = this.params.headers[param.name];
+        if (typeof this.params.headers[param.name] !== 'undefined')
+          headers[key] = headerValue;
+      }
+    }
+
+    // if there's a body, need to set the accepts header via requestContentType
+    if (body && (this.type === "POST" || this.type === "PUT" || this.type === "PATCH" || this.type === "DELETE")) {
+      if (this.opts.requestContentType)
+        consumes = this.opts.requestContentType;
+    } else {
+      // if any form params, content type must be set
+      if (definedFormParams.length > 0) {
+        if (definedFileParams.length > 0)
+          consumes = "multipart/form-data";
+        else
+          consumes = "application/x-www-form-urlencoded";
+      }
+      else if (this.type === "DELETE")
+        body = "{}";
+      else if (this.type != "DELETE")
+        accepts = null;
+    }
+
+    if (consumes && this.operation.consumes) {
+      if (this.operation.consumes.indexOf(consumes) === -1) {
+        log("server doesn't consume " + consumes + ", try " + JSON.stringify(this.operation.consumes));
+        consumes = this.operation.consumes[0];
+      }
+    }
+
+    if (this.opts.responseContentType) {
+      accepts = this.opts.responseContentType;
+    } else {
+      accepts = "application/json";
+    }
+    if (accepts && this.operation.produces) {
+      if (this.operation.produces.indexOf(accepts) === -1) {
+        log("server can't produce " + accepts);
+        accepts = this.operation.produces[0];
+      }
+    }
+
+    if ((consumes && body !== "") || (consumes === "application/x-www-form-urlencoded"))
+      headers["Content-Type"] = consumes;
+    if (accepts)
+      headers["Accept"] = accepts;
+    return headers;
+  }
+
+  SwaggerRequest.prototype.asCurl = function () {
+    var results = [];
+    if (this.headers) {
+      var key;
+      for (key in this.headers) {
+        results.push("--header \"" + key + ": " + this.headers[v] + "\"");
+      }
+    }
+    return "curl " + (results.join(" ")) + " " + this.url;
+  };
+
+  /**
+   * SwaggerHttp is a wrapper for executing requests
+   */
+  var SwaggerHttp = function () { };
+
+  SwaggerHttp.prototype.execute = function (obj) {
+    if (obj && (typeof obj.useJQuery === 'boolean'))
+      this.useJQuery = obj.useJQuery;
+    else
+      this.useJQuery = this.isIE8();
+
+    if (this.useJQuery)
+      return new JQueryHttpClient().execute(obj);
+    else
+      return new ShredHttpClient().execute(obj);
+  }
+
+  SwaggerHttp.prototype.isIE8 = function () {
+    var detectedIE = false;
+    if (typeof navigator !== 'undefined' && navigator.userAgent) {
+      nav = navigator.userAgent.toLowerCase();
+      if (nav.indexOf('msie') !== -1) {
+        var version = parseInt(nav.split('msie')[1]);
+        if (version <= 8) {
+          detectedIE = true;
+        }
+      }
+    }
+    return detectedIE;
+  };
+
+  /*
+   * JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic.
+   * NOTE: when jQuery is available it will export both '$' and 'jQuery' to the global space.
+   *     Since we are using closures here we need to alias it for internal use.
+   */
+  var JQueryHttpClient = function (options) {
+    "use strict";
+    if (!jQuery) {
+      var jQuery = window.jQuery;
+    }
+  }
+
+  JQueryHttpClient.prototype.execute = function (obj) {
+    var cb = obj.on;
+    var request = obj;
+
+    obj.type = obj.method;
+    obj.cache = false;
+
+    obj.beforeSend = function (xhr) {
+      var key, results;
+      if (obj.headers) {
+        results = [];
+        var key;
+        for (key in obj.headers) {
+          if (key.toLowerCase() === "content-type") {
+            results.push(obj.contentType = obj.headers[key]);
+          } else if (key.toLowerCase() === "accept") {
+            results.push(obj.accepts = obj.headers[key]);
+          } else {
+            results.push(xhr.setRequestHeader(key, obj.headers[key]));
+          }
+        }
+        return results;
+      }
+    };
+
+    obj.data = obj.body;
+    obj.complete = function (response, textStatus, opts) {
+      var headers = {},
+        headerArray = response.getAllResponseHeaders().split("\n");
+
+      for (var i = 0; i < headerArray.length; i++) {
+        var toSplit = headerArray[i].trim();
+        if (toSplit.length === 0)
+          continue;
+        var separator = toSplit.indexOf(":");
+        if (separator === -1) {
+          // Name but no value in the header
+          headers[toSplit] = null;
+          continue;
+        }
+        var name = toSplit.substring(0, separator).trim(),
+          value = toSplit.substring(separator + 1).trim();
+        headers[name] = value;
+      }
+
+      var out = {
+        url: request.url,
+        method: request.method,
+        status: response.status,
+        data: response.responseText,
+        headers: headers
+      };
+
+      var contentType = (headers["content-type"] || headers["Content-Type"] || null)
+
+      if (contentType != null) {
+        if (contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) {
+          if (response.responseText && response.responseText !== "")
+            out.obj = JSON.parse(response.responseText);
+          else
+            out.obj = {}
+        }
+      }
+
+      if (response.status >= 200 && response.status < 300)
+        cb.response(out);
+      else if (response.status === 0 || (response.status >= 400 && response.status < 599))
+        cb.error(out);
+      else
+        return cb.response(out);
+    };
+
+    jQuery.support.cors = true;
+    return jQuery.ajax(obj);
+  }
+
+  /*
+   * ShredHttpClient is a light-weight, node or browser HTTP client
+   */
+  var ShredHttpClient = function (options) {
+    this.options = (options || {});
+    this.isInitialized = false;
+
+    var identity, toString;
+
+    if (typeof window !== 'undefined') {
+      this.Shred = require("./shred");
+      this.content = require("./shred/content");
+    }
+    else
+      this.Shred = require("shred");
+    this.shred = new this.Shred();
+  }
+
+  ShredHttpClient.prototype.initShred = function () {
+    this.isInitialized = true;
+    this.registerProcessors(this.shred);
+  }
+
+  ShredHttpClient.prototype.registerProcessors = function (shred) {
+    var identity = function (x) {
+      return x;
+    };
+    var toString = function (x) {
+      return x.toString();
+    };
+
+    if (typeof window !== 'undefined') {
+      this.content.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+        parser: identity,
+        stringify: toString
+      });
+    } else {
+      this.Shred.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+        parser: identity,
+        stringify: toString
+      });
+    }
+  }
+
+  ShredHttpClient.prototype.execute = function (obj) {
+    if (!this.isInitialized)
+      this.initShred();
+
+    var cb = obj.on, res;
+
+    var transform = function (response) {
+      var out = {
+        headers: response._headers,
+        url: response.request.url,
+        method: response.request.method,
+        status: response.status,
+        data: response.content.data
+      };
+
+      var headers = response._headers.normalized || response._headers;
+      var contentType = (headers["content-type"] || headers["Content-Type"] || null)
+      if (contentType != null) {
+        if (contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) {
+          if (response.content.data && response.content.data !== "")
+            out.obj = JSON.parse(response.content.data);
+          else
+            out.obj = {}
+        }
+      }
+      return out;
+    };
+
+    // Transform an error into a usable response-like object
+    var transformError = function (error) {
+      var out = {
+        // Default to a status of 0 - The client will treat this as a generic permissions sort of error
+        status: 0,
+        data: error.message || error
+      };
+
+      if (error.code) {
+        out.obj = error;
+
+        if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
+          // We can tell the client that this should be treated as a missing resource and not as a permissions thing
+          out.status = 404;
+        }
+      }
+
+      return out;
+    };
+
+    var res = {
+      error: function (response) {
+        if (obj)
+          return cb.error(transform(response));
+      },
+      // Catch the Shred error raised when the request errors as it is made (i.e. No Response is coming)
+      request_error: function (err) {
+        if (obj)
+          return cb.error(transformError(err));
+      },
+      redirect: function (response) {
+        if (obj)
+          return cb.redirect(transform(response));
+      },
+      307: function (response) {
+        if (obj)
+          return cb.redirect(transform(response));
+      },
+      response: function (response) {
+        if (obj)
+          return cb.response(transform(response));
+      }
+    };
+    if (obj) {
+      obj.on = res;
+    }
+    return this.shred.request(obj);
+  };
+
+  /**
+   * SwaggerAuthorizations applys the correct authorization to an operation being executed
+   */
+  var SwaggerAuthorizations = function () {
+    this.authz = {};
+  };
+
+  SwaggerAuthorizations.prototype.add = function (name, auth) {
+    this.authz[name] = auth;
+    return auth;
+  };
+
+  SwaggerAuthorizations.prototype.remove = function (name) {
+    return delete this.authz[name];
+  };
+
+  SwaggerAuthorizations.prototype.apply = function (obj, authorizations) {
+    var status = null;
+    var key, value, result;
+
+    // if the "authorizations" key is undefined, or has an empty array, add all keys
+    if (typeof authorizations === 'undefined' || Object.keys(authorizations).length == 0) {
+      for (key in this.authz) {
+        value = this.authz[key];
+        result = value.apply(obj, authorizations);
+        if (result === true)
+          status = true;
+      }
+    }
+    else {
+      for (name in authorizations) {
+        for (key in this.authz) {
+          if (key == name) {
+            value = this.authz[key];
+            result = value.apply(obj, authorizations);
+            if (result === true)
+              status = true;
+          }
+        }
+      }
+    }
+
+    return status;
+  };
+
+  /**
+   * ApiKeyAuthorization allows a query param or header to be injected
+   */
+  var ApiKeyAuthorization = function (name, value, type, delimiter) {
+    this.name = name;
+    this.value = value;
+    this.type = type;
+    this.delimiter = delimiter;
+  };
+
+  ApiKeyAuthorization.prototype.apply = function (obj, authorizations) {
+    if (this.type === "query") {
+      if (obj.url.indexOf('?') > 0)
+        obj.url = obj.url + "&" + this.name + "=" + this.value;
+      else
+        obj.url = obj.url + "?" + this.name + "=" + this.value;
+      return true;
+    } else if (this.type === "header") {
+      if (typeof obj.headers[this.name] !== 'undefined') {
+        if (typeof this.delimiter !== 'undefined')
+          obj.headers[this.name] = obj.headers[this.name] + this.delimiter + this.value;
+      }
+      else
+        obj.headers[this.name] = this.value;
+      return true;
+    }
+  };
+
+  var CookieAuthorization = function (cookie) {
+    this.cookie = cookie;
+  }
+
+  CookieAuthorization.prototype.apply = function (obj, authorizations) {
+    obj.cookieJar = obj.cookieJar || CookieJar();
+    obj.cookieJar.setCookie(this.cookie);
+    return true;
+  }
+
+  /**
+   * Password Authorization is a basic auth implementation
+   */
+  var PasswordAuthorization = function (name, username, password) {
+    this.name = name;
+    this.username = username;
+    this.password = password;
+    this._btoa = null;
+    if (typeof window !== 'undefined')
+      this._btoa = btoa;
+    else
+      this._btoa = require("btoa");
+  };
+
+  PasswordAuthorization.prototype.apply = function (obj, authorizations) {
+    var base64encoder = this._btoa;
+    obj.headers["Authorization"] = "Basic " + base64encoder(this.username + ":" + this.password);
+    return true;
+  };
+
+  var e = (typeof window !== 'undefined' ? window : exports);
+
+  var sampleModels = {};
+  var cookies = {};
+
+  e.parameterMacro = parameterMacro;
+  e.modelPropertyMacro = modelPropertyMacro;
+  e.SampleModels = sampleModels;
+  e.SwaggerHttp = SwaggerHttp;
+  e.SwaggerRequest = SwaggerRequest;
+  e.authorizations = new SwaggerAuthorizations();
+  e.ApiKeyAuthorization = ApiKeyAuthorization;
+  e.PasswordAuthorization = PasswordAuthorization;
+  e.CookieAuthorization = CookieAuthorization;
+  e.JQueryHttpClient = JQueryHttpClient;
+  e.ShredHttpClient = ShredHttpClient;
+  e.SwaggerOperation = SwaggerOperation;
+  e.SwaggerModel = SwaggerModel;
+  e.SwaggerModelProperty = SwaggerModelProperty;
+  e.SwaggerResource = SwaggerResource;
+  e.SwaggerApi = SwaggerApi;
+  e.log = log;
+
+})();
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/underscore-min.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/underscore-min.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/lib/underscore-min.js	(revision 5961)
@@ -0,0 +1,32 @@
+// Underscore.js 1.3.3
+// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+(function(){function r(a,c,d){if(a===c)return 0!==a||1/a==1/c;if(null==a||null==c)return a===c;a._chain&&(a=a._wrapped);c._chain&&(c=c._wrapped);if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return!1;switch(e){case "[object String]":return a==""+c;case "[object Number]":return a!=+a?c!=+c:0==a?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
+c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if("object"!=typeof a||"object"!=typeof c)return!1;for(var f=d.length;f--;)if(d[f]==a)return!0;d.push(a);var f=0,g=!0;if("[object Array]"==e){if(f=a.length,g=f==c.length)for(;f--&&(g=f in a==f in c&&r(a[f],c[f],d)););}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return!1;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,h)&&!f--)break;
+g=!f}}d.pop();return g}var s=this,I=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,J=k.unshift,l=p.toString,K=p.hasOwnProperty,y=k.forEach,z=k.map,A=k.reduce,B=k.reduceRight,C=k.filter,D=k.every,E=k.some,q=k.indexOf,F=k.lastIndexOf,p=Array.isArray,L=Object.keys,t=Function.prototype.bind,b=function(a){return new m(a)};"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(exports=module.exports=b),exports._=b):s._=b;b.VERSION="1.3.3";var j=b.each=b.forEach=function(a,
+c,d){if(a!=null)if(y&&a.forEach===y)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===o)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===o)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(z&&a.map===z)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(A&&
+a.reduce===A){e&&(c=b.bind(c,e));return f?a.reduce(c,d):a.reduce(c)}j(a,function(a,b,i){if(f)d=c.call(e,d,a,b,i);else{d=a;f=true}});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(B&&a.reduceRight===B){e&&(c=b.bind(c,e));return f?a.reduceRight(c,d):a.reduceRight(c)}var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=function(a,
+c,b){var e;G(a,function(a,g,h){if(c.call(b,a,g,h)){e=a;return true}});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(C&&a.filter===C)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(D&&a.every===D)return a.every(c,b);j(a,function(a,g,h){if(!(e=e&&c.call(b,
+a,g,h)))return o});return!!e};var G=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(E&&a.some===E)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;if(q&&a.indexOf===q)return a.indexOf(c)!=-1;return b=G(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
+function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&
+(e={value:a,computed:b})});return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){d=Math.floor(Math.random()*(f+1));b[f]=b[d];b[d]=a});return b};b.sortBy=function(a,c,d){var e=b.isFunction(c)?c:function(a){return a[c]};return b.pluck(b.map(a,function(a,b,c){return{value:a,criteria:e.call(d,a,b,c)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c===void 0?1:d===void 0?-1:c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};
+j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:b.isArray(a)||b.isArguments(a)?i.call(a):a.toArray&&b.isFunction(a.toArray)?a.toArray():b.values(a)};b.size=function(a){return b.isArray(a)?a.length:b.keys(a).length};b.first=b.head=b.take=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,
+0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,
+e=[];a.length<3&&(c=true);b.reduce(d,function(d,g,h){if(c?b.last(d)!==g||!d.length:!b.include(d,g)){d.push(g);e.push(a[h])}return d},[]);return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1),true);return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=
+i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,d){if(a==null)return-1;var e;if(d){d=b.sortedIndex(a,c);return a[d]===c?d:-1}if(q&&a.indexOf===q)return a.indexOf(c);d=0;for(e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(F&&a.lastIndexOf===F)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){if(arguments.length<=
+1){b=a||0;a=0}for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;){g[f++]=a;a=a+d}return g};var H=function(){};b.bind=function(a,c){var d,e;if(a.bind===t&&t)return t.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));H.prototype=a.prototype;var b=new H,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=
+i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(null,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i,j=b.debounce(function(){h=
+g=false},c);return function(){d=this;e=arguments;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);j()},c));g?h=true:i=a.apply(d,e);j();g=true;return i}};b.debounce=function(a,b,d){var e;return function(){var f=this,g=arguments;d&&!e&&a.apply(f,g);clearTimeout(e);e=setTimeout(function(){e=null;d||a.apply(f,g)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));
+return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=L||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&
+c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.pick=function(a){var c={};j(b.flatten(i.call(arguments,1)),function(b){b in a&&(c[b]=a[b])});return c};b.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty=
+function(a){if(a==null)return true;if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};b.isArguments(arguments)||(b.isArguments=function(a){return!(!a||!b.has(a,"callee"))});b.isFunction=function(a){return l.call(a)=="[object Function]"};
+b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isFinite=function(a){return b.isNumber(a)&&isFinite(a)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,
+b){return K.call(a,b)};b.noConflict=function(){s._=I;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.result=function(a,c){if(a==null)return null;var d=a[c];return b.isFunction(d)?d.call(a):d};b.mixin=function(a){j(b.functions(a),function(c){M(c,b[c]=a[c])})};var N=0;b.uniqueId=
+function(a){var b=N++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var u=/.^/,n={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},v;for(v in n)n[n[v]]=v;var O=/\\|'|\r|\n|\t|\u2028|\u2029/g,P=/\\(\\|'|r|n|t|u2028|u2029)/g,w=function(a){return a.replace(P,function(a,b){return n[b]})};b.template=function(a,c,d){d=b.defaults(d||{},b.templateSettings);a="__p+='"+a.replace(O,function(a){return"\\"+n[a]}).replace(d.escape||
+u,function(a,b){return"'+\n_.escape("+w(b)+")+\n'"}).replace(d.interpolate||u,function(a,b){return"'+\n("+w(b)+")+\n'"}).replace(d.evaluate||u,function(a,b){return"';\n"+w(b)+"\n;__p+='"})+"';\n";d.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",e=new Function(d.variable||"obj","_",a);if(c)return e(c,b);c=function(a){return e.call(this,a,b)};c.source="function("+(d.variable||"obj")+"){\n"+a+"}";return c};
+b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var x=function(a,c){return c?b(a).chain():a},M=function(a,c){m.prototype[a]=function(){var a=i.call(arguments);J.call(a,this._wrapped);return x(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return x(d,
+this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return x(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/o2c.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/o2c.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/o2c.html	(revision 5961)
@@ -0,0 +1,15 @@
+<script>
+var qp = null;
+if(window.location.hash) {
+  qp = location.hash.substring(1);
+}
+else {
+  qp = location.search.substring(1);
+}
+qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
+  function(key, value) {
+    return key===""?value:decodeURIComponent(value) }
+  ):{}
+window.opener.onOAuthComplete(qp);
+window.close();
+</script>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/swagger-ui.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/swagger-ui.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/swagger-ui.js	(revision 5961)
@@ -0,0 +1,2669 @@
+// swagger-ui.js
+// version 2.1.0-alpha.4
+$(function() {
+
+	// Helper function for vertically aligning DOM elements
+	// http://www.seodenver.com/simple-vertical-align-plugin-for-jquery/
+	$.fn.vAlign = function() {
+		return this.each(function(i){
+		var ah = $(this).height();
+		var ph = $(this).parent().height();
+		var mh = (ph - ah) / 2;
+		$(this).css('margin-top', mh);
+		});
+	};
+
+	$.fn.stretchFormtasticInputWidthToParent = function() {
+		return this.each(function(i){
+		var p_width = $(this).closest("form").innerWidth();
+		var p_padding = parseInt($(this).closest("form").css('padding-left') ,10) + parseInt($(this).closest("form").css('padding-right'), 10);
+		var this_padding = parseInt($(this).css('padding-left'), 10) + parseInt($(this).css('padding-right'), 10);
+		$(this).css('width', p_width - p_padding - this_padding);
+		});
+	};
+
+	$('form.formtastic li.string input, form.formtastic textarea').stretchFormtasticInputWidthToParent();
+
+	// Vertically center these paragraphs
+	// Parent may need a min-height for this to work..
+	$('ul.downplayed li div.content p').vAlign();
+
+	// When a sandbox form is submitted..
+	$("form.sandbox").submit(function(){
+
+		var error_free = true;
+
+		// Cycle through the forms required inputs
+ 		$(this).find("input.required").each(function() {
+
+			// Remove any existing error styles from the input
+			$(this).removeClass('error');
+
+			// Tack the error style on if the input is empty..
+			if ($(this).val() == '') {
+				$(this).addClass('error');
+				$(this).wiggle();
+				error_free = false;
+			}
+
+		});
+
+		return error_free;
+	});
+
+});
+
+function clippyCopiedCallback(a) {
+  $('#api_key_copied').fadeIn().delay(1000).fadeOut();
+
+  // var b = $("#clippy_tooltip_" + a);
+  // b.length != 0 && (b.attr("title", "copied!").trigger("tipsy.reload"), setTimeout(function() {
+  //   b.attr("title", "copy to clipboard")
+  // },
+  // 500))
+}
+
+// Logging function that accounts for browsers that don't have window.console
+log = function(){
+  log.history = log.history || [];
+  log.history.push(arguments);
+  if(this.console){
+    console.log( Array.prototype.slice.call(arguments)[0] );
+  }
+};
+
+// Handle browsers that do console incorrectly (IE9 and below, see http://stackoverflow.com/a/5539378/7913)
+if (Function.prototype.bind && console && typeof console.log == "object") {
+    [
+      "log","info","warn","error","assert","dir","clear","profile","profileEnd"
+    ].forEach(function (method) {
+        console[method] = this.bind(console[method], console);
+    }, Function.prototype.call);
+}
+
+var Docs = {
+
+	shebang: function() {
+
+		// If shebang has an operation nickname in it..
+		// e.g. /docs/#!/words/get_search
+		var fragments = $.param.fragment().split('/');
+		fragments.shift(); // get rid of the bang
+
+		switch (fragments.length) {
+			case 1:
+				// Expand all operations for the resource and scroll to it
+				var dom_id = 'resource_' + fragments[0];
+
+				Docs.expandEndpointListForResource(fragments[0]);
+				$("#"+dom_id).slideto({highlight: false});
+				break;
+			case 2:
+				// Refer to the endpoint DOM element, e.g. #words_get_search
+
+        // Expand Resource
+        Docs.expandEndpointListForResource(fragments[0]);
+        $("#"+dom_id).slideto({highlight: false});
+
+        // Expand operation
+				var li_dom_id = fragments.join('_');
+				var li_content_dom_id = li_dom_id + "_content";
+
+
+				Docs.expandOperation($('#'+li_content_dom_id));
+				$('#'+li_dom_id).slideto({highlight: false});
+				break;
+		}
+
+	},
+
+	toggleEndpointListForResource: function(resource) {
+		var elem = $('li#resource_' + Docs.escapeResourceName(resource) + ' ul.endpoints');
+		if (elem.is(':visible')) {
+			Docs.collapseEndpointListForResource(resource);
+		} else {
+			Docs.expandEndpointListForResource(resource);
+		}
+	},
+
+	// Expand resource
+	expandEndpointListForResource: function(resource) {
+		var resource = Docs.escapeResourceName(resource);
+		if (resource == '') {
+			$('.resource ul.endpoints').slideDown();
+			return;
+		}
+		
+		$('li#resource_' + resource).addClass('active');
+
+		var elem = $('li#resource_' + resource + ' ul.endpoints');
+		elem.slideDown();
+	},
+
+	// Collapse resource and mark as explicitly closed
+	collapseEndpointListForResource: function(resource) {
+		var resource = Docs.escapeResourceName(resource);
+		$('li#resource_' + resource).removeClass('active');
+
+		var elem = $('li#resource_' + resource + ' ul.endpoints');
+		elem.slideUp();
+	},
+
+	expandOperationsForResource: function(resource) {
+		// Make sure the resource container is open..
+		Docs.expandEndpointListForResource(resource);
+		
+		if (resource == '') {
+			$('.resource ul.endpoints li.operation div.content').slideDown();
+			return;
+		}
+
+		$('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() {
+			Docs.expandOperation($(this));
+		});
+	},
+
+	collapseOperationsForResource: function(resource) {
+		// Make sure the resource container is open..
+		Docs.expandEndpointListForResource(resource);
+
+		$('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() {
+			Docs.collapseOperation($(this));
+		});
+	},
+
+	escapeResourceName: function(resource) {
+		return resource.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g, "\\$&");
+	},
+
+	expandOperation: function(elem) {
+		elem.slideDown();
+	},
+
+	collapseOperation: function(elem) {
+		elem.slideUp();
+	}
+};(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['apikey_button_view'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression;
+
+
+  buffer += "<div class='auth_button' id='apikey_button'><img class='auth_icon' alt='apply api key' src='images/apikey.jpeg'></div>\n<div class='auth_container' id='apikey_container'>\n  <div class='key_input_container'>\n    <div class='auth_label'>";
+  if (stack1 = helpers.keyName) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.keyName; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</div>\n    <input placeholder=\"api_key\" class=\"auth_input\" id=\"input_apiKey_entry\" name=\"apiKey\" type=\"text\"/>\n    <div class='auth_submit'><a class='auth_submit_button' id=\"apply_api_key\" href=\"#\">apply</a></div>\n  </div>\n</div>\n\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['basic_auth_button_view'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  
+
+
+  return "<div class='auth_button' id='basic_auth_button'><img class='auth_icon' src='images/password.jpeg'></div>\n<div class='auth_container' id='basic_auth_container'>\n  <div class='key_input_container'>\n    <div class=\"auth_label\">Username</div>\n    <input placeholder=\"username\" class=\"auth_input\" id=\"input_username\" name=\"username\" type=\"text\"/>\n    <div class=\"auth_label\">Password</div>\n    <input placeholder=\"password\" class=\"auth_input\" id=\"input_password\" name=\"password\" type=\"password\"/>\n    <div class='auth_submit'><a class='auth_submit_button' id=\"apply_basic_auth\" href=\"#\">apply</a></div>\n  </div>\n</div>\n\n";
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['content_type'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n  ";
+  stack1 = helpers.each.call(depth0, depth0.produces, {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n";
+  return buffer;
+  }
+function program2(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n	<option value=\"";
+  stack1 = (typeof depth0 === functionType ? depth0.apply(depth0) : depth0);
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\">";
+  stack1 = (typeof depth0 === functionType ? depth0.apply(depth0) : depth0);
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</option>\n	";
+  return buffer;
+  }
+
+function program4(depth0,data) {
+  
+  
+  return "\n  <option value=\"application/json\">application/json</option>\n";
+  }
+
+  buffer += "<label for=\"contentType\"></label>\n<select name=\"contentType\">\n";
+  stack1 = helpers['if'].call(depth0, depth0.produces, {hash:{},inverse:self.program(4, program4, data),fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n</select>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['main'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, stack2, functionType="function", escapeExpression=this.escapeExpression, self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1, stack2;
+  buffer += "\n  <div class=\"info_title\">"
+    + escapeExpression(((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.title)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
+    + "</div>\n  <div class=\"info_description\">";
+  stack2 = ((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.description)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1);
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "</div>\n  ";
+  stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.termsOfServiceUrl), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "\n  ";
+  stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.contact), {hash:{},inverse:self.noop,fn:self.program(4, program4, data),data:data});
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "\n  ";
+  stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.license), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data});
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "\n  ";
+  return buffer;
+  }
+function program2(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "<div class=\"info_tos\"><a href=\""
+    + escapeExpression(((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.termsOfServiceUrl)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
+    + "\">Terms of service</a></div>";
+  return buffer;
+  }
+
+function program4(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "<div class='info_contact'><a href=\"mailto:"
+    + escapeExpression(((stack1 = ((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.contact)),stack1 == null || stack1 === false ? stack1 : stack1.name)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
+    + "\">Contact the developer</a></div>";
+  return buffer;
+  }
+
+function program6(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "<div class='info_license'><a href='"
+    + escapeExpression(((stack1 = ((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.license)),stack1 == null || stack1 === false ? stack1 : stack1.url)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
+    + "'>"
+    + escapeExpression(((stack1 = ((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.license)),stack1 == null || stack1 === false ? stack1 : stack1.name)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
+    + "</a></div>";
+  return buffer;
+  }
+
+function program8(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n    , <span style=\"font-variant: small-caps\">api version</span>: "
+    + escapeExpression(((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.version)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
+    + "\n    ";
+  return buffer;
+  }
+
+function program10(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n    <span style=\"float:right\"><a href=\"";
+  if (stack1 = helpers.validatorUrl) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.validatorUrl; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "/debug?url=";
+  if (stack1 = helpers.url) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.url; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\"><img id=\"validator\" src=\"";
+  if (stack1 = helpers.validatorUrl) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.validatorUrl; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "?url=";
+  if (stack1 = helpers.url) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.url; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\"></a>\n    </span>\n    ";
+  return buffer;
+  }
+
+  buffer += "<div class='info' id='api_info'>\n  ";
+  stack1 = helpers['if'].call(depth0, depth0.info, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n</div>\n<div class='container' id='resources_container'>\n  <ul id='resources'></ul>\n\n  <div class=\"footer\">\n    <br>\n    <br>\n    <h4 style=\"color: #999\">[ <span style=\"font-variant: small-caps\">base url</span>: ";
+  if (stack1 = helpers.basePath) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.basePath; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\n    ";
+  stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.version), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "]\n    ";
+  stack2 = helpers['if'].call(depth0, depth0.validatorUrl, {hash:{},inverse:self.noop,fn:self.program(10, program10, data),data:data});
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "\n    </h4>\n    </div>\n</div>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['operation'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, options, functionType="function", escapeExpression=this.escapeExpression, self=this, blockHelperMissing=helpers.blockHelperMissing;
+
+function program1(depth0,data) {
+  
+  
+  return "deprecated";
+  }
+
+function program3(depth0,data) {
+  
+  
+  return "\n            <h4>Warning: Deprecated</h4>\n        ";
+  }
+
+function program5(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n        <h4>Implementation Notes</h4>\n        <p>";
+  if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</p>\n        ";
+  return buffer;
+  }
+
+function program7(depth0,data) {
+  
+  
+  return "\n        <div class=\"auth\">\n        <span class=\"api-ic ic-error\"></span>";
+  }
+
+function program9(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n          <div id=\"api_information_panel\" style=\"top: 526px; left: 776px; display: none;\">\n          ";
+  stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(10, program10, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n          </div>\n        ";
+  return buffer;
+  }
+function program10(depth0,data) {
+  
+  var buffer = "", stack1, stack2;
+  buffer += "\n            <div title='";
+  stack2 = ((stack1 = depth0.description),typeof stack1 === functionType ? stack1.apply(depth0) : stack1);
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "'>"
+    + escapeExpression(((stack1 = depth0.scope),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))
+    + "</div>\n          ";
+  return buffer;
+  }
+
+function program12(depth0,data) {
+  
+  
+  return "</div>";
+  }
+
+function program14(depth0,data) {
+  
+  
+  return "\n        <div class='access'>\n          <span class=\"api-ic ic-off\" title=\"click to authenticate\"></span>\n        </div>\n        ";
+  }
+
+function program16(depth0,data) {
+  
+  
+  return "\n          <h4>Response Class</h4>\n          <p><span class=\"model-signature\" /></p>\n          <br/>\n          <div class=\"response-content-type\" />\n        ";
+  }
+
+function program18(depth0,data) {
+  
+  
+  return "\n          <h4>Parameters</h4>\n          <table class='fullwidth'>\n          <thead>\n            <tr>\n            <th style=\"width: 100px; max-width: 100px\">Parameter</th>\n            <th style=\"width: 310px; max-width: 310px\">Value</th>\n            <th style=\"width: 200px; max-width: 200px\">Description</th>\n            <th style=\"width: 100px; max-width: 100px\">Parameter Type</th>\n            <th style=\"width: 220px; max-width: 230px\">Data Type</th>\n            </tr>\n          </thead>\n          <tbody class=\"operation-params\">\n\n          </tbody>\n          </table>\n          ";
+  }
+
+function program20(depth0,data) {
+  
+  
+  return "\n          <div style='margin:0;padding:0;display:inline'></div>\n          <h4>Response Messages</h4>\n          <table class='fullwidth'>\n            <thead>\n            <tr>\n              <th>HTTP Status Code</th>\n              <th>Reason</th>\n              <th>Response Model</th>\n            </tr>\n            </thead>\n            <tbody class=\"operation-status\">\n            \n            </tbody>\n          </table>\n          ";
+  }
+
+function program22(depth0,data) {
+  
+  
+  return "\n          ";
+  }
+
+function program24(depth0,data) {
+  
+  
+  return "\n          <div class='sandbox_header'>\n            <input class='submit' name='commit' type='button' value='Try it out!' />\n            <a href='#' class='response_hider' style='display:none'>Hide Response</a>\n            <span class='response_throbber' style='display:none'></span>\n          </div>\n          ";
+  }
+
+  buffer += "\n  <ul class='operations' >\n    <li class='";
+  if (stack1 = helpers.method) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.method; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + " operation' id='";
+  if (stack1 = helpers.parentId) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.parentId; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "_";
+  if (stack1 = helpers.nickname) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.nickname; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>\n      <div class='heading'>\n        <h3>\n          <span class='http_method'>\n          <a href='#!/";
+  if (stack1 = helpers.parentId) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.parentId; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "/";
+  if (stack1 = helpers.nickname) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.nickname; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' class=\"toggleOperation\">";
+  if (stack1 = helpers.method) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.method; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</a>\n          </span>\n          <span class='path'>\n          <a href='#!/";
+  if (stack1 = helpers.parentId) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.parentId; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "/";
+  if (stack1 = helpers.nickname) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.nickname; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' class=\"toggleOperation ";
+  stack1 = helpers['if'].call(depth0, depth0.deprecated, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\">";
+  if (stack1 = helpers.path) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.path; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</a>\n          </span>\n        </h3>\n        <ul class='options'>\n          <li>\n          <a href='#!/";
+  if (stack1 = helpers.parentId) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.parentId; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "/";
+  if (stack1 = helpers.nickname) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.nickname; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' class=\"toggleOperation\">";
+  if (stack1 = helpers.summary) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.summary; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</a>\n          </li>\n        </ul>\n      </div>\n      <div class='content' id='";
+  if (stack1 = helpers.parentId) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.parentId; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "_";
+  if (stack1 = helpers.nickname) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.nickname; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "_content' style='display:none'>\n        ";
+  stack1 = helpers['if'].call(depth0, depth0.deprecated, {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        ";
+  stack1 = helpers['if'].call(depth0, depth0.description, {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        ";
+  options = {hash:{},inverse:self.noop,fn:self.program(7, program7, data),data:data};
+  if (stack1 = helpers.oauth) { stack1 = stack1.call(depth0, options); }
+  else { stack1 = depth0.oauth; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if (!helpers.oauth) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        ";
+  stack1 = helpers.each.call(depth0, depth0.oauth, {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        ";
+  options = {hash:{},inverse:self.noop,fn:self.program(12, program12, data),data:data};
+  if (stack1 = helpers.oauth) { stack1 = stack1.call(depth0, options); }
+  else { stack1 = depth0.oauth; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if (!helpers.oauth) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        ";
+  options = {hash:{},inverse:self.noop,fn:self.program(14, program14, data),data:data};
+  if (stack1 = helpers.oauth) { stack1 = stack1.call(depth0, options); }
+  else { stack1 = depth0.oauth; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if (!helpers.oauth) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        ";
+  stack1 = helpers['if'].call(depth0, depth0.type, {hash:{},inverse:self.noop,fn:self.program(16, program16, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        <form accept-charset='UTF-8' class='sandbox'>\n          <div style='margin:0;padding:0;display:inline'></div>\n          ";
+  stack1 = helpers['if'].call(depth0, depth0.parameters, {hash:{},inverse:self.noop,fn:self.program(18, program18, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n          ";
+  stack1 = helpers['if'].call(depth0, depth0.responseMessages, {hash:{},inverse:self.noop,fn:self.program(20, program20, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n          ";
+  stack1 = helpers['if'].call(depth0, depth0.isReadOnly, {hash:{},inverse:self.program(24, program24, data),fn:self.program(22, program22, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n        </form>\n        <div class='response' style='display:none'>\n          <h4>Request URL</h4>\n          <div class='block request_url'></div>\n          <h4>Response Body</h4>\n          <div class='block response_body'></div>\n          <h4>Response Code</h4>\n          <div class='block response_code'></div>\n          <h4>Response Headers</h4>\n          <div class='block response_headers'></div>\n        </div>\n      </div>\n    </li>\n  </ul>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['param'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n		";
+  stack1 = helpers['if'].call(depth0, depth0.isFile, {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n	";
+  return buffer;
+  }
+function program2(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n			<input type=\"file\" name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'/>\n			<div class=\"parameter-content-type\" />\n		";
+  return buffer;
+  }
+
+function program4(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n			";
+  stack1 = helpers['if'].call(depth0, depth0['default'], {hash:{},inverse:self.program(7, program7, data),fn:self.program(5, program5, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n		";
+  return buffer;
+  }
+function program5(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<textarea class='body-textarea' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>";
+  if (stack1 = helpers['default']) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0['default']; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</textarea>\n			";
+  return buffer;
+  }
+
+function program7(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<textarea class='body-textarea' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'></textarea>\n				<br />\n				<div class=\"parameter-content-type\" />\n			";
+  return buffer;
+  }
+
+function program9(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n		";
+  stack1 = helpers['if'].call(depth0, depth0.isFile, {hash:{},inverse:self.program(10, program10, data),fn:self.program(2, program2, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n	";
+  return buffer;
+  }
+function program10(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n			";
+  stack1 = helpers['if'].call(depth0, depth0['default'], {hash:{},inverse:self.program(13, program13, data),fn:self.program(11, program11, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n		";
+  return buffer;
+  }
+function program11(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<input class='parameter' minlength='0' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' placeholder='' type='text' value='";
+  if (stack1 = helpers['default']) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0['default']; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'/>\n			";
+  return buffer;
+  }
+
+function program13(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<input class='parameter' minlength='0' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' placeholder='' type='text' value=''/>\n			";
+  return buffer;
+  }
+
+  buffer += "<td class='code'>";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</td>\n<td>\n\n	";
+  stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(9, program9, data),fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n\n</td>\n<td>";
+  if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td>";
+  if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td>\n	<span class=\"model-signature\"></span>\n</td>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['param_list'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, stack2, options, self=this, helperMissing=helpers.helperMissing, functionType="function", escapeExpression=this.escapeExpression;
+
+function program1(depth0,data) {
+  
+  
+  return " multiple='multiple'";
+  }
+
+function program3(depth0,data) {
+  
+  
+  return "\n    ";
+  }
+
+function program5(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n      ";
+  stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(8, program8, data),fn:self.program(6, program6, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n    ";
+  return buffer;
+  }
+function program6(depth0,data) {
+  
+  
+  return "\n      ";
+  }
+
+function program8(depth0,data) {
+  
+  var buffer = "", stack1, stack2, options;
+  buffer += "\n        ";
+  options = {hash:{},inverse:self.program(11, program11, data),fn:self.program(9, program9, data),data:data};
+  stack2 = ((stack1 = helpers.isArray || depth0.isArray),stack1 ? stack1.call(depth0, depth0, options) : helperMissing.call(depth0, "isArray", depth0, options));
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "\n      ";
+  return buffer;
+  }
+function program9(depth0,data) {
+  
+  
+  return "\n        ";
+  }
+
+function program11(depth0,data) {
+  
+  
+  return "\n          <option selected=\"\" value=''></option>\n        ";
+  }
+
+function program13(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n      ";
+  stack1 = helpers['if'].call(depth0, depth0.isDefault, {hash:{},inverse:self.program(16, program16, data),fn:self.program(14, program14, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n    ";
+  return buffer;
+  }
+function program14(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n        <option selected=\"\" value='";
+  if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>";
+  if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + " (default)</option>\n      ";
+  return buffer;
+  }
+
+function program16(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n        <option value='";
+  if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>";
+  if (stack1 = helpers.value) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.value; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</option>\n      ";
+  return buffer;
+  }
+
+  buffer += "<td class='code'>";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</td>\n<td>\n  <select ";
+  options = {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data};
+  stack2 = ((stack1 = helpers.isArray || depth0.isArray),stack1 ? stack1.call(depth0, depth0, options) : helperMissing.call(depth0, "isArray", depth0, options));
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += " class='parameter' name='";
+  if (stack2 = helpers.name) { stack2 = stack2.call(depth0, {hash:{},data:data}); }
+  else { stack2 = depth0.name; stack2 = typeof stack2 === functionType ? stack2.apply(depth0) : stack2; }
+  buffer += escapeExpression(stack2)
+    + "'>\n    ";
+  stack2 = helpers['if'].call(depth0, depth0.required, {hash:{},inverse:self.program(5, program5, data),fn:self.program(3, program3, data),data:data});
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "\n    ";
+  stack2 = helpers.each.call(depth0, ((stack1 = depth0.allowableValues),stack1 == null || stack1 === false ? stack1 : stack1.descriptiveValues), {hash:{},inverse:self.noop,fn:self.program(13, program13, data),data:data});
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "\n  </select>\n</td>\n<td>";
+  if (stack2 = helpers.description) { stack2 = stack2.call(depth0, {hash:{},data:data}); }
+  else { stack2 = depth0.description; stack2 = typeof stack2 === functionType ? stack2.apply(depth0) : stack2; }
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "</td>\n<td>";
+  if (stack2 = helpers.paramType) { stack2 = stack2.call(depth0, {hash:{},data:data}); }
+  else { stack2 = depth0.paramType; stack2 = typeof stack2 === functionType ? stack2.apply(depth0) : stack2; }
+  if(stack2 || stack2 === 0) { buffer += stack2; }
+  buffer += "</td>\n<td><span class=\"model-signature\"></span></td>";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['param_readonly'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n        <textarea class='body-textarea' readonly='readonly' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>";
+  if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</textarea>\n    ";
+  return buffer;
+  }
+
+function program3(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n        ";
+  stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(6, program6, data),fn:self.program(4, program4, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n    ";
+  return buffer;
+  }
+function program4(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n            ";
+  if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\n        ";
+  return buffer;
+  }
+
+function program6(depth0,data) {
+  
+  
+  return "\n            (empty)\n        ";
+  }
+
+  buffer += "<td class='code'>";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</td>\n<td>\n    ";
+  stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(3, program3, data),fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n</td>\n<td>";
+  if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td>";
+  if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td><span class=\"model-signature\"></span></td>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['param_readonly_required'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n        <textarea class='body-textarea'  readonly='readonly' placeholder='(required)' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>";
+  if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</textarea>\n    ";
+  return buffer;
+  }
+
+function program3(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n        ";
+  stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(6, program6, data),fn:self.program(4, program4, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n    ";
+  return buffer;
+  }
+function program4(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n            ";
+  if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\n        ";
+  return buffer;
+  }
+
+function program6(depth0,data) {
+  
+  
+  return "\n            (empty)\n        ";
+  }
+
+  buffer += "<td class='code required'>";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</td>\n<td>\n    ";
+  stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(3, program3, data),fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n</td>\n<td>";
+  if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td>";
+  if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td><span class=\"model-signature\"></span></td>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['param_required'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n		";
+  stack1 = helpers['if'].call(depth0, depth0.isFile, {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n	";
+  return buffer;
+  }
+function program2(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n			<input type=\"file\" name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'/>\n		";
+  return buffer;
+  }
+
+function program4(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n			";
+  stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(7, program7, data),fn:self.program(5, program5, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n		";
+  return buffer;
+  }
+function program5(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<textarea class='body-textarea' placeholder='(required)' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>";
+  if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</textarea>\n			";
+  return buffer;
+  }
+
+function program7(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<textarea class='body-textarea' placeholder='(required)' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'></textarea>\n				<br />\n				<div class=\"parameter-content-type\" />\n			";
+  return buffer;
+  }
+
+function program9(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n		";
+  stack1 = helpers['if'].call(depth0, depth0.isFile, {hash:{},inverse:self.program(12, program12, data),fn:self.program(10, program10, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n	";
+  return buffer;
+  }
+function program10(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n			<input class='parameter' class='required' type='file' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'/>\n		";
+  return buffer;
+  }
+
+function program12(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n			";
+  stack1 = helpers['if'].call(depth0, depth0.defaultValue, {hash:{},inverse:self.program(15, program15, data),fn:self.program(13, program13, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n		";
+  return buffer;
+  }
+function program13(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<input class='parameter required' minlength='1' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' placeholder='(required)' type='text' value='";
+  if (stack1 = helpers.defaultValue) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.defaultValue; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'/>\n			";
+  return buffer;
+  }
+
+function program15(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n				<input class='parameter required' minlength='1' name='";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' placeholder='(required)' type='text' value=''/>\n			";
+  return buffer;
+  }
+
+  buffer += "<td class='code required'>";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</td>\n<td>\n	";
+  stack1 = helpers['if'].call(depth0, depth0.isBody, {hash:{},inverse:self.program(9, program9, data),fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n</td>\n<td>\n	<strong>";
+  if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</strong>\n</td>\n<td>";
+  if (stack1 = helpers.paramType) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.paramType; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td><span class=\"model-signature\"></span></td>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['parameter_content_type'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n  ";
+  stack1 = helpers.each.call(depth0, depth0.consumes, {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n";
+  return buffer;
+  }
+function program2(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n  <option value=\"";
+  stack1 = (typeof depth0 === functionType ? depth0.apply(depth0) : depth0);
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\">";
+  stack1 = (typeof depth0 === functionType ? depth0.apply(depth0) : depth0);
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</option>\n  ";
+  return buffer;
+  }
+
+function program4(depth0,data) {
+  
+  
+  return "\n  <option value=\"application/json\">application/json</option>\n";
+  }
+
+  buffer += "<label for=\"parameterContentType\"></label>\n<select name=\"parameterContentType\">\n";
+  stack1 = helpers['if'].call(depth0, depth0.consumes, {hash:{},inverse:self.program(4, program4, data),fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n</select>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['resource'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, options, functionType="function", escapeExpression=this.escapeExpression, self=this, blockHelperMissing=helpers.blockHelperMissing;
+
+function program1(depth0,data) {
+  
+  
+  return " : ";
+  }
+
+function program3(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "<li>\n      <a href='";
+  if (stack1 = helpers.url) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.url; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "'>Raw</a>\n    </li>";
+  return buffer;
+  }
+
+  buffer += "<div class='heading'>\n  <h2>\n    <a href='#!/";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' class=\"toggleEndpointList\" data-id=\"";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\">";
+  if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</a> ";
+  options = {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data};
+  if (stack1 = helpers.summary) { stack1 = stack1.call(depth0, options); }
+  else { stack1 = depth0.summary; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if (!helpers.summary) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  if (stack1 = helpers.summary) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.summary; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n  </h2>\n  <ul class='options'>\n    <li>\n      <a href='#!/";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' id='endpointListTogger_";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "' class=\"toggleEndpointList\" data-id=\"";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\">Show/Hide</a>\n    </li>\n    <li>\n      <a href='#' class=\"collapseResource\" data-id=\"";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "\">\n        List Operations\n      </a>\n    </li>\n    <li>\n      <a href='#' class=\"expandResource\" data-id=";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + ">\n        Expand Operations\n      </a>\n    </li>\n    ";
+  options = {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data};
+  if (stack1 = helpers.url) { stack1 = stack1.call(depth0, options); }
+  else { stack1 = depth0.url; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if (!helpers.url) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n  </ul>\n</div>\n<ul class='endpoints' id='";
+  if (stack1 = helpers.id) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "_endpoint_list' style='display:none'>\n\n</ul>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['response_content_type'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", self=this;
+
+function program1(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n  ";
+  stack1 = helpers.each.call(depth0, depth0.produces, {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n";
+  return buffer;
+  }
+function program2(depth0,data) {
+  
+  var buffer = "", stack1;
+  buffer += "\n  <option value=\"";
+  stack1 = (typeof depth0 === functionType ? depth0.apply(depth0) : depth0);
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\">";
+  stack1 = (typeof depth0 === functionType ? depth0.apply(depth0) : depth0);
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</option>\n  ";
+  return buffer;
+  }
+
+function program4(depth0,data) {
+  
+  
+  return "\n  <option value=\"application/json\">application/json</option>\n";
+  }
+
+  buffer += "<label for=\"responseContentType\"></label>\n<select name=\"responseContentType\">\n";
+  stack1 = helpers['if'].call(depth0, depth0.produces, {hash:{},inverse:self.program(4, program4, data),fn:self.program(1, program1, data),data:data});
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n</select>\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['signature'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression;
+
+
+  buffer += "<div>\n<ul class=\"signature-nav\">\n  <li><a class=\"description-link\" href=\"#\">Model</a></li>\n  <li><a class=\"snippet-link\" href=\"#\">Model Schema</a></li>\n</ul>\n<div>\n\n<div class=\"signature-container\">\n  <div class=\"description\">\n    ";
+  if (stack1 = helpers.signature) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.signature; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "\n  </div>\n\n  <div class=\"snippet\">\n    <pre><code>";
+  if (stack1 = helpers.sampleJSON) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.sampleJSON; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</code></pre>\n    <small class=\"notice\"></small>\n  </div>\n</div>\n\n";
+  return buffer;
+  });
+})();
+
+(function() {
+  var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['status_code'] = template(function (Handlebars,depth0,helpers,partials,data) {
+  this.compilerInfo = [4,'>= 1.0.0'];
+helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
+  var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression;
+
+
+  buffer += "<td width='15%' class='code'>";
+  if (stack1 = helpers.code) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.code; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  buffer += escapeExpression(stack1)
+    + "</td>\n<td>";
+  if (stack1 = helpers.message) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
+  else { stack1 = depth0.message; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
+  if(stack1 || stack1 === 0) { buffer += stack1; }
+  buffer += "</td>\n<td width='50%'><span class=\"model-signature\" /></td>";
+  return buffer;
+  });
+})();
+
+
+
+// Generated by CoffeeScript 1.6.3
+(function() {
+  var ApiKeyButton, BasicAuthButton, ContentTypeView, HeaderView, MainView, OperationView, ParameterContentTypeView, ParameterView, ResourceView, ResponseContentTypeView, SignatureView, StatusCodeView, SwaggerUi, _ref, _ref1, _ref10, _ref11, _ref12, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  SwaggerUi = (function(_super) {
+    __extends(SwaggerUi, _super);
+
+    function SwaggerUi() {
+      _ref = SwaggerUi.__super__.constructor.apply(this, arguments);
+      return _ref;
+    }
+
+    SwaggerUi.prototype.dom_id = "swagger_ui";
+
+    SwaggerUi.prototype.options = null;
+
+    SwaggerUi.prototype.api = null;
+
+    SwaggerUi.prototype.headerView = null;
+
+    SwaggerUi.prototype.mainView = null;
+
+    SwaggerUi.prototype.initialize = function(options) {
+      var _this = this;
+      if (options == null) {
+        options = {};
+      }
+      if (options.dom_id != null) {
+        this.dom_id = options.dom_id;
+        delete options.dom_id;
+      }
+      if ($('#' + this.dom_id) == null) {
+        $('body').append('<div id="' + this.dom_id + '"></div>');
+      }
+      this.options = options;
+      this.options.success = function() {
+        return _this.render();
+      };
+      this.options.progress = function(d) {
+        return _this.showMessage(d);
+      };
+      this.options.failure = function(d) {
+        if (_this.api && _this.api.isValid === false) {
+          log("not a valid 2.0 spec, loading legacy client");
+          _this.api = new SwaggerApi(_this.options);
+          return _this.api.build();
+        } else {
+          return _this.onLoadFailure(d);
+        }
+      };
+      this.headerView = new HeaderView({
+        el: $('#header')
+      });
+      return this.headerView.on('update-swagger-ui', function(data) {
+        return _this.updateSwaggerUi(data);
+      });
+    };
+
+    SwaggerUi.prototype.setOption = function(option, value) {
+      return this.options[option] = value;
+    };
+
+    SwaggerUi.prototype.getOption = function(option) {
+      return this.options[option];
+    };
+
+    SwaggerUi.prototype.updateSwaggerUi = function(data) {
+      this.options.url = data.url;
+      return this.load();
+    };
+
+    SwaggerUi.prototype.load = function() {
+      var url, _ref1;
+      if ((_ref1 = this.mainView) != null) {
+        _ref1.clear();
+      }
+      url = this.options.url;
+      if (url.indexOf("http") !== 0) {
+        url = this.buildUrl(window.location.href.toString(), url);
+      }
+      this.options.url = url;
+      this.headerView.update(url);
+      this.api = new SwaggerClient(this.options);
+      return this.api.build();
+    };
+
+    SwaggerUi.prototype.render = function() {
+      var _this = this;
+      this.showMessage('Finished Loading Resource Information. Rendering Swagger UI...');
+      this.mainView = new MainView({
+        model: this.api,
+        el: $('#' + this.dom_id),
+        swaggerOptions: this.options
+      }).render();
+      this.showMessage();
+      switch (this.options.docExpansion) {
+        case "full":
+          Docs.expandOperationsForResource('');
+          break;
+        case "list":
+          Docs.collapseOperationsForResource('');
+      }
+      if (this.options.onComplete) {
+        this.options.onComplete(this.api, this);
+      }
+      return setTimeout(function() {
+        return Docs.shebang();
+      }, 400);
+    };
+
+    SwaggerUi.prototype.buildUrl = function(base, url) {
+      var endOfPath, parts;
+      log("base is " + base);
+      if (url.indexOf("/") === 0) {
+        parts = base.split("/");
+        base = parts[0] + "//" + parts[2];
+        return base + url;
+      } else {
+        endOfPath = base.length;
+        if (base.indexOf("?") > -1) {
+          endOfPath = Math.min(endOfPath, base.indexOf("?"));
+        }
+        if (base.indexOf("#") > -1) {
+          endOfPath = Math.min(endOfPath, base.indexOf("#"));
+        }
+        base = base.substring(0, endOfPath);
+        if (base.indexOf("/", base.length - 1) !== -1) {
+          return base + url;
+        }
+        return base + "/" + url;
+      }
+    };
+
+    SwaggerUi.prototype.showMessage = function(data) {
+      if (data == null) {
+        data = '';
+      }
+      $('#message-bar').removeClass('message-fail');
+      $('#message-bar').addClass('message-success');
+      return $('#message-bar').html(data);
+    };
+
+    SwaggerUi.prototype.onLoadFailure = function(data) {
+      var val;
+      if (data == null) {
+        data = '';
+      }
+      $('#message-bar').removeClass('message-success');
+      $('#message-bar').addClass('message-fail');
+      val = $('#message-bar').html(data);
+      if (this.options.onFailure != null) {
+        this.options.onFailure(data);
+      }
+      return val;
+    };
+
+    return SwaggerUi;
+
+  })(Backbone.Router);
+
+  window.SwaggerUi = SwaggerUi;
+
+  HeaderView = (function(_super) {
+    __extends(HeaderView, _super);
+
+    function HeaderView() {
+      _ref1 = HeaderView.__super__.constructor.apply(this, arguments);
+      return _ref1;
+    }
+
+    HeaderView.prototype.events = {
+      'click #show-pet-store-icon': 'showPetStore',
+      'click #show-wordnik-dev-icon': 'showWordnikDev',
+      'click #explore': 'showCustom',
+      'keyup #input_baseUrl': 'showCustomOnKeyup',
+      'keyup #input_apiKey': 'showCustomOnKeyup'
+    };
+
+    HeaderView.prototype.initialize = function() {};
+
+    HeaderView.prototype.showPetStore = function(e) {
+      return this.trigger('update-swagger-ui', {
+        url: "http://petstore.swagger.wordnik.com/api/api-docs"
+      });
+    };
+
+    HeaderView.prototype.showWordnikDev = function(e) {
+      return this.trigger('update-swagger-ui', {
+        url: "http://api.wordnik.com/v4/resources.json"
+      });
+    };
+
+    HeaderView.prototype.showCustomOnKeyup = function(e) {
+      if (e.keyCode === 13) {
+        return this.showCustom();
+      }
+    };
+
+    HeaderView.prototype.showCustom = function(e) {
+      if (e != null) {
+        e.preventDefault();
+      }
+      return this.trigger('update-swagger-ui', {
+        url: $('#input_baseUrl').val(),
+        apiKey: $('#input_apiKey').val()
+      });
+    };
+
+    HeaderView.prototype.update = function(url, apiKey, trigger) {
+      if (trigger == null) {
+        trigger = false;
+      }
+      $('#input_baseUrl').val(url);
+      if (trigger) {
+        return this.trigger('update-swagger-ui', {
+          url: url
+        });
+      }
+    };
+
+    return HeaderView;
+
+  })(Backbone.View);
+
+  MainView = (function(_super) {
+    var sorters;
+
+    __extends(MainView, _super);
+
+    function MainView() {
+      _ref2 = MainView.__super__.constructor.apply(this, arguments);
+      return _ref2;
+    }
+
+    sorters = {
+      'alpha': function(a, b) {
+        return a.path.localeCompare(b.path);
+      },
+      'method': function(a, b) {
+        return a.method.localeCompare(b.method);
+      }
+    };
+
+    MainView.prototype.initialize = function(opts) {
+      var auth, key, name, url, value, _ref3;
+      if (opts == null) {
+        opts = {};
+      }
+      this.model.auths = [];
+      _ref3 = this.model.securityDefinitions;
+      for (key in _ref3) {
+        value = _ref3[key];
+        auth = {
+          name: key,
+          type: value.type,
+          value: value
+        };
+        this.model.auths.push(auth);
+      }
+      if (this.model.info && this.model.info.license && typeof this.model.info.license === 'string') {
+        name = this.model.info.license;
+        url = this.model.info.licenseUrl;
+        this.model.info.license = {};
+        this.model.info.license.name = name;
+        this.model.info.license.url = url;
+      }
+      if (!this.model.info) {
+        this.model.info = {};
+      }
+      if (!this.model.info.version) {
+        this.model.info.version = this.model.apiVersion;
+      }
+      if (this.model.swaggerVersion === "2.0") {
+        if ("validatorUrl" in opts.swaggerOptions) {
+          return this.model.validatorUrl = opts.swaggerOptions.validatorUrl;
+        } else if (this.model.url.match(/https?:\/\/localhost/)) {
+          return this.model.validatorUrl = this.model.url;
+        } else {
+          return this.model.validatorUrl = "http://online.swagger.io/validator";
+        }
+      }
+    };
+
+    MainView.prototype.render = function() {
+      var auth, button, counter, id, name, resource, resources, _i, _len, _ref3;
+      if (this.model.securityDefinitions) {
+        for (name in this.model.securityDefinitions) {
+          auth = this.model.securityDefinitions[name];
+          if (auth.type === "apiKey" && $("#apikey_button").length === 0) {
+            button = new ApiKeyButton({
+              model: auth
+            }).render().el;
+            $('.auth_main_container').append(button);
+          }
+          if (auth.type === "basicAuth" && $("#basic_auth_button").length === 0) {
+            button = new BasicAuthButton({
+              model: auth
+            }).render().el;
+            $('.auth_main_container').append(button);
+          }
+        }
+      }
+      $(this.el).html(Handlebars.templates.main(this.model));
+      resources = {};
+      counter = 0;
+      _ref3 = this.model.apisArray;
+      for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
+        resource = _ref3[_i];
+        id = resource.name;
+        while (typeof resources[id] !== 'undefined') {
+          id = id + "_" + counter;
+          counter += 1;
+        }
+        resource.id = id;
+        resources[id] = resource;
+        this.addResource(resource, this.model.auths);
+      }
+      return this;
+    };
+
+    MainView.prototype.addResource = function(resource, auths) {
+      var resourceView;
+      resource.id = resource.id.replace(/\s/g, '_');
+      resourceView = new ResourceView({
+        model: resource,
+        tagName: 'li',
+        id: 'resource_' + resource.id,
+        className: 'resource',
+        auths: auths,
+        swaggerOptions: this.options.swaggerOptions
+      });
+      return $('#resources').append(resourceView.render().el);
+    };
+
+    MainView.prototype.clear = function() {
+      return $(this.el).html('');
+    };
+
+    return MainView;
+
+  })(Backbone.View);
+
+  ResourceView = (function(_super) {
+    __extends(ResourceView, _super);
+
+    function ResourceView() {
+      _ref3 = ResourceView.__super__.constructor.apply(this, arguments);
+      return _ref3;
+    }
+
+    ResourceView.prototype.initialize = function(opts) {
+      if (opts == null) {
+        opts = {};
+      }
+      this.auths = opts.auths;
+      if ("" === this.model.description) {
+        return this.model.description = null;
+      }
+    };
+
+    ResourceView.prototype.render = function() {
+      var counter, id, methods, operation, _i, _len, _ref4;
+      $(this.el).html(Handlebars.templates.resource(this.model));
+      methods = {};
+      if (this.model.description) {
+        this.model.summary = this.model.description;
+      }
+      _ref4 = this.model.operationsArray;
+      for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
+        operation = _ref4[_i];
+        counter = 0;
+        id = operation.nickname;
+        while (typeof methods[id] !== 'undefined') {
+          id = id + "_" + counter;
+          counter += 1;
+        }
+        methods[id] = operation;
+        operation.nickname = id;
+        operation.parentId = this.model.id;
+        this.addOperation(operation);
+      }
+      $('.toggleEndpointList', this.el).click(this.callDocs.bind(this, 'toggleEndpointListForResource'));
+      $('.collapseResource', this.el).click(this.callDocs.bind(this, 'collapseOperationsForResource'));
+      $('.expandResource', this.el).click(this.callDocs.bind(this, 'expandOperationsForResource'));
+      return this;
+    };
+
+    ResourceView.prototype.addOperation = function(operation) {
+      var operationView;
+      operation.number = this.number;
+      operationView = new OperationView({
+        model: operation,
+        tagName: 'li',
+        className: 'endpoint',
+        swaggerOptions: this.options.swaggerOptions,
+        auths: this.auths
+      });
+      $('.endpoints', $(this.el)).append(operationView.render().el);
+      return this.number++;
+    };
+
+    ResourceView.prototype.callDocs = function(fnName, e) {
+      e.preventDefault();
+      return Docs[fnName](e.currentTarget.getAttribute('data-id'));
+    };
+
+    return ResourceView;
+
+  })(Backbone.View);
+
+  OperationView = (function(_super) {
+    __extends(OperationView, _super);
+
+    function OperationView() {
+      _ref4 = OperationView.__super__.constructor.apply(this, arguments);
+      return _ref4;
+    }
+
+    OperationView.prototype.invocationUrl = null;
+
+    OperationView.prototype.events = {
+      'submit .sandbox': 'submitOperation',
+      'click .submit': 'submitOperation',
+      'click .response_hider': 'hideResponse',
+      'click .toggleOperation': 'toggleOperationContent',
+      'mouseenter .api-ic': 'mouseEnter',
+      'mouseout .api-ic': 'mouseExit'
+    };
+
+    OperationView.prototype.initialize = function(opts) {
+      if (opts == null) {
+        opts = {};
+      }
+      this.auths = opts.auths;
+      return this;
+    };
+
+    OperationView.prototype.mouseEnter = function(e) {
+      var elem, hgh, pos, scMaxX, scMaxY, scX, scY, wd, x, y;
+      elem = $(e.currentTarget.parentNode).find('#api_information_panel');
+      x = e.pageX;
+      y = e.pageY;
+      scX = $(window).scrollLeft();
+      scY = $(window).scrollTop();
+      scMaxX = scX + $(window).width();
+      scMaxY = scY + $(window).height();
+      wd = elem.width();
+      hgh = elem.height();
+      if (x + wd > scMaxX) {
+        x = scMaxX - wd;
+      }
+      if (x < scX) {
+        x = scX;
+      }
+      if (y + hgh > scMaxY) {
+        y = scMaxY - hgh;
+      }
+      if (y < scY) {
+        y = scY;
+      }
+      pos = {};
+      pos.top = y;
+      pos.left = x;
+      elem.css(pos);
+      return $(e.currentTarget.parentNode).find('#api_information_panel').show();
+    };
+
+    OperationView.prototype.mouseExit = function(e) {
+      return $(e.currentTarget.parentNode).find('#api_information_panel').hide();
+    };
+
+    OperationView.prototype.render = function() {
+      var a, auth, auths, code, contentTypeModel, isMethodSubmissionSupported, k, key, o, param, ref, responseContentTypeView, responseSignatureView, schema, schemaObj, signatureModel, statusCode, type, v, value, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref10, _ref11, _ref5, _ref6, _ref7, _ref8, _ref9;
+      isMethodSubmissionSupported = true;
+      if (!isMethodSubmissionSupported) {
+        this.model.isReadOnly = true;
+      }
+      this.model.description = this.model.description || this.model.notes;
+      if (this.model.description) {
+        this.model.description = this.model.description.replace(/(?:\r\n|\r|\n)/g, '<br />');
+      }
+      this.model.oauth = null;
+      if (this.model.authorizations) {
+        if (Array.isArray(this.model.authorizations)) {
+          _ref5 = this.model.authorizations;
+          for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
+            auths = _ref5[_i];
+            for (key in auths) {
+              auth = auths[key];
+              for (a in this.auths) {
+                auth = this.auths[a];
+                if (auth.type === 'oauth2') {
+                  this.model.oauth = {};
+                  this.model.oauth.scopes = [];
+                  _ref6 = auth.value.scopes;
+                  for (k in _ref6) {
+                    v = _ref6[k];
+                    o = {
+                      scope: k,
+                      description: v
+                    };
+                    this.model.oauth.scopes.push(o);
+                  }
+                }
+              }
+            }
+          }
+        } else {
+          _ref7 = this.model.authorizations;
+          for (k in _ref7) {
+            v = _ref7[k];
+            if (k === "oauth2") {
+              if (this.model.oauth === null) {
+                this.model.oauth = {};
+              }
+              if (this.model.oauth.scopes === void 0) {
+                this.model.oauth.scopes = [];
+              }
+              for (_j = 0, _len1 = v.length; _j < _len1; _j++) {
+                o = v[_j];
+                this.model.oauth.scopes.push(o);
+              }
+            }
+          }
+        }
+      }
+      if (typeof this.model.responses !== 'undefined') {
+        this.model.responseMessages = [];
+        _ref8 = this.model.responses;
+        for (code in _ref8) {
+          value = _ref8[code];
+          schema = null;
+          schemaObj = this.model.responses[code].schema;
+          if (schemaObj && schemaObj['$ref']) {
+            schema = schemaObj['$ref'];
+            if (schema.indexOf('#/definitions/') === 0) {
+              schema = schema.substring('#/definitions/'.length);
+            }
+          }
+          this.model.responseMessages.push({
+            code: code,
+            message: value.description,
+            responseModel: schema
+          });
+        }
+      }
+      if (typeof this.model.responseMessages === 'undefined') {
+        this.model.responseMessages = [];
+      }
+      $(this.el).html(Handlebars.templates.operation(this.model));
+      if (this.model.responseClassSignature && this.model.responseClassSignature !== 'string') {
+        signatureModel = {
+          sampleJSON: this.model.responseSampleJSON,
+          isParam: false,
+          signature: this.model.responseClassSignature
+        };
+        responseSignatureView = new SignatureView({
+          model: signatureModel,
+          tagName: 'div'
+        });
+        $('.model-signature', $(this.el)).append(responseSignatureView.render().el);
+      } else {
+        this.model.responseClassSignature = 'string';
+        $('.model-signature', $(this.el)).html(this.model.type);
+      }
+      contentTypeModel = {
+        isParam: false
+      };
+      contentTypeModel.consumes = this.model.consumes;
+      contentTypeModel.produces = this.model.produces;
+      _ref9 = this.model.parameters;
+      for (_k = 0, _len2 = _ref9.length; _k < _len2; _k++) {
+        param = _ref9[_k];
+        type = param.type || param.dataType;
+        if (typeof type === 'undefined') {
+          schema = param.schema;
+          if (schema && schema['$ref']) {
+            ref = schema['$ref'];
+            if (ref.indexOf('#/definitions/') === 0) {
+              type = ref.substring('#/definitions/'.length);
+            } else {
+              type = ref;
+            }
+          }
+        }
+        if (type && type.toLowerCase() === 'file') {
+          if (!contentTypeModel.consumes) {
+            contentTypeModel.consumes = 'multipart/form-data';
+          }
+        }
+        param.type = type;
+      }
+      responseContentTypeView = new ResponseContentTypeView({
+        model: contentTypeModel
+      });
+      $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el);
+      _ref10 = this.model.parameters;
+      for (_l = 0, _len3 = _ref10.length; _l < _len3; _l++) {
+        param = _ref10[_l];
+        this.addParameter(param, contentTypeModel.consumes);
+      }
+      _ref11 = this.model.responseMessages;
+      for (_m = 0, _len4 = _ref11.length; _m < _len4; _m++) {
+        statusCode = _ref11[_m];
+        this.addStatusCode(statusCode);
+      }
+      return this;
+    };
+
+    OperationView.prototype.addParameter = function(param, consumes) {
+      var paramView;
+      param.consumes = consumes;
+      paramView = new ParameterView({
+        model: param,
+        tagName: 'tr',
+        readOnly: this.model.isReadOnly
+      });
+      return $('.operation-params', $(this.el)).append(paramView.render().el);
+    };
+
+    OperationView.prototype.addStatusCode = function(statusCode) {
+      var statusCodeView;
+      statusCodeView = new StatusCodeView({
+        model: statusCode,
+        tagName: 'tr'
+      });
+      return $('.operation-status', $(this.el)).append(statusCodeView.render().el);
+    };
+
+    OperationView.prototype.submitOperation = function(e) {
+      var error_free, form, isFileUpload, map, o, opts, val, _i, _j, _k, _len, _len1, _len2, _ref5, _ref6, _ref7;
+      if (e != null) {
+        e.preventDefault();
+      }
+      form = $('.sandbox', $(this.el));
+      error_free = true;
+      form.find("input.required").each(function() {
+        var _this = this;
+        $(this).removeClass("error");
+        if (jQuery.trim($(this).val()) === "") {
+          $(this).addClass("error");
+          $(this).wiggle({
+            callback: function() {
+              return $(_this).focus();
+            }
+          });
+          return error_free = false;
+        }
+      });
+      if (error_free) {
+        map = {};
+        opts = {
+          parent: this
+        };
+        isFileUpload = false;
+        _ref5 = form.find("input");
+        for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
+          o = _ref5[_i];
+          if ((o.value != null) && jQuery.trim(o.value).length > 0) {
+            map[o.name] = o.value;
+          }
+          if (o.type === "file") {
+            isFileUpload = true;
+          }
+        }
+        _ref6 = form.find("textarea");
+        for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) {
+          o = _ref6[_j];
+          if ((o.value != null) && jQuery.trim(o.value).length > 0) {
+            map[o.name] = o.value;
+          }
+        }
+        _ref7 = form.find("select");
+        for (_k = 0, _len2 = _ref7.length; _k < _len2; _k++) {
+          o = _ref7[_k];
+          val = this.getSelectedValue(o);
+          if ((val != null) && jQuery.trim(val).length > 0) {
+            map[o.name] = val;
+          }
+        }
+        opts.responseContentType = $("div select[name=responseContentType]", $(this.el)).val();
+        opts.requestContentType = $("div select[name=parameterContentType]", $(this.el)).val();
+        $(".response_throbber", $(this.el)).show();
+        if (isFileUpload) {
+          return this.handleFileUpload(map, form);
+        } else {
+          return this.model["do"](map, opts, this.showCompleteStatus, this.showErrorStatus, this);
+        }
+      }
+    };
+
+    OperationView.prototype.success = function(response, parent) {
+      return parent.showCompleteStatus(response);
+    };
+
+    OperationView.prototype.handleFileUpload = function(map, form) {
+      var bodyParam, el, headerParams, o, obj, param, params, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref5, _ref6, _ref7, _ref8,
+        _this = this;
+      _ref5 = form.serializeArray();
+      for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
+        o = _ref5[_i];
+        if ((o.value != null) && jQuery.trim(o.value).length > 0) {
+          map[o.name] = o.value;
+        }
+      }
+      bodyParam = new FormData();
+      params = 0;
+      _ref6 = this.model.parameters;
+      for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) {
+        param = _ref6[_j];
+        if (param.paramType === 'form') {
+          if (param.type.toLowerCase() !== 'file' && map[param.name] !== void 0) {
+            bodyParam.append(param.name, map[param.name]);
+          }
+        }
+      }
+      headerParams = {};
+      _ref7 = this.model.parameters;
+      for (_k = 0, _len2 = _ref7.length; _k < _len2; _k++) {
+        param = _ref7[_k];
+        if (param.paramType === 'header') {
+          headerParams[param.name] = map[param.name];
+        }
+      }
+      _ref8 = form.find('input[type~="file"]');
+      for (_l = 0, _len3 = _ref8.length; _l < _len3; _l++) {
+        el = _ref8[_l];
+        if (typeof el.files[0] !== 'undefined') {
+          bodyParam.append($(el).attr('name'), el.files[0]);
+          params += 1;
+        }
+      }
+      this.invocationUrl = this.model.supportHeaderParams() ? (headerParams = this.model.getHeaderParams(map), this.model.urlify(map, false)) : this.model.urlify(map, true);
+      $(".request_url", $(this.el)).html("<pre></pre>");
+      $(".request_url pre", $(this.el)).text(this.invocationUrl);
+      obj = {
+        type: this.model.method,
+        url: this.invocationUrl,
+        headers: headerParams,
+        data: bodyParam,
+        dataType: 'json',
+        contentType: false,
+        processData: false,
+        error: function(data, textStatus, error) {
+          return _this.showErrorStatus(_this.wrap(data), _this);
+        },
+        success: function(data) {
+          return _this.showResponse(data, _this);
+        },
+        complete: function(data) {
+          return _this.showCompleteStatus(_this.wrap(data), _this);
+        }
+      };
+      if (window.authorizations) {
+        window.authorizations.apply(obj);
+      }
+      if (params === 0) {
+        obj.data.append("fake", "true");
+      }
+      jQuery.ajax(obj);
+      return false;
+    };
+
+    OperationView.prototype.wrap = function(data) {
+      var h, headerArray, headers, i, o, _i, _len;
+      headers = {};
+      headerArray = data.getAllResponseHeaders().split("\r");
+      for (_i = 0, _len = headerArray.length; _i < _len; _i++) {
+        i = headerArray[_i];
+        h = i.split(':');
+        if (h[0] !== void 0 && h[1] !== void 0) {
+          headers[h[0].trim()] = h[1].trim();
+        }
+      }
+      o = {};
+      o.content = {};
+      o.content.data = data.responseText;
+      o.headers = headers;
+      o.request = {};
+      o.request.url = this.invocationUrl;
+      o.status = data.status;
+      return o;
+    };
+
+    OperationView.prototype.getSelectedValue = function(select) {
+      var opt, options, _i, _len, _ref5;
+      if (!select.multiple) {
+        return select.value;
+      } else {
+        options = [];
+        _ref5 = select.options;
+        for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
+          opt = _ref5[_i];
+          if (opt.selected) {
+            options.push(opt.value);
+          }
+        }
+        if (options.length > 0) {
+          return options;
+        } else {
+          return null;
+        }
+      }
+    };
+
+    OperationView.prototype.hideResponse = function(e) {
+      if (e != null) {
+        e.preventDefault();
+      }
+      $(".response", $(this.el)).slideUp();
+      return $(".response_hider", $(this.el)).fadeOut();
+    };
+
+    OperationView.prototype.showResponse = function(response) {
+      var prettyJson;
+      prettyJson = JSON.stringify(response, null, "\t").replace(/\n/g, "<br>");
+      return $(".response_body", $(this.el)).html(escape(prettyJson));
+    };
+
+    OperationView.prototype.showErrorStatus = function(data, parent) {
+      return parent.showStatus(data);
+    };
+
+    OperationView.prototype.showCompleteStatus = function(data, parent) {
+      return parent.showStatus(data);
+    };
+
+    OperationView.prototype.formatXml = function(xml) {
+      var contexp, formatted, indent, lastType, lines, ln, pad, reg, transitions, wsexp, _fn, _i, _len;
+      reg = /(>)(<)(\/*)/g;
+      wsexp = /[ ]*(.*)[ ]+\n/g;
+      contexp = /(<.+>)(.+\n)/g;
+      xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2');
+      pad = 0;
+      formatted = '';
+      lines = xml.split('\n');
+      indent = 0;
+      lastType = 'other';
+      transitions = {
+        'single->single': 0,
+        'single->closing': -1,
+        'single->opening': 0,
+        'single->other': 0,
+        'closing->single': 0,
+        'closing->closing': -1,
+        'closing->opening': 0,
+        'closing->other': 0,
+        'opening->single': 1,
+        'opening->closing': 0,
+        'opening->opening': 1,
+        'opening->other': 1,
+        'other->single': 0,
+        'other->closing': -1,
+        'other->opening': 0,
+        'other->other': 0
+      };
+      _fn = function(ln) {
+        var fromTo, j, key, padding, type, types, value;
+        types = {
+          single: Boolean(ln.match(/<.+\/>/)),
+          closing: Boolean(ln.match(/<\/.+>/)),
+          opening: Boolean(ln.match(/<[^!?].*>/))
+        };
+        type = ((function() {
+          var _results;
+          _results = [];
+          for (key in types) {
+            value = types[key];
+            if (value) {
+              _results.push(key);
+            }
+          }
+          return _results;
+        })())[0];
+        type = type === void 0 ? 'other' : type;
+        fromTo = lastType + '->' + type;
+        lastType = type;
+        padding = '';
+        indent += transitions[fromTo];
+        padding = ((function() {
+          var _j, _ref5, _results;
+          _results = [];
+          for (j = _j = 0, _ref5 = indent; 0 <= _ref5 ? _j < _ref5 : _j > _ref5; j = 0 <= _ref5 ? ++_j : --_j) {
+            _results.push('  ');
+          }
+          return _results;
+        })()).join('');
+        if (fromTo === 'opening->closing') {
+          return formatted = formatted.substr(0, formatted.length - 1) + ln + '\n';
+        } else {
+          return formatted += padding + ln + '\n';
+        }
+      };
+      for (_i = 0, _len = lines.length; _i < _len; _i++) {
+        ln = lines[_i];
+        _fn(ln);
+      }
+      return formatted;
+    };
+
+    OperationView.prototype.showStatus = function(response) {
+      var code, content, contentType, e, headers, json, opts, pre, response_body, response_body_el, url;
+      if (response.content === void 0) {
+        content = response.data;
+        url = response.url;
+      } else {
+        content = response.content.data;
+        url = response.request.url;
+      }
+      headers = response.headers;
+      contentType = null;
+      if (headers) {
+        contentType = headers["Content-Type"] || headers["content-type"];
+        if (contentType) {
+          contentType = contentType.split(";")[0].trim();
+        }
+      }
+      if (!content) {
+        code = $('<code />').text("no content");
+        pre = $('<pre class="json" />').append(code);
+      } else if (contentType === "application/json" || /\+json$/.test(contentType)) {
+        json = null;
+        try {
+          json = JSON.stringify(JSON.parse(content), null, "  ");
+        } catch (_error) {
+          e = _error;
+          json = "can't parse JSON.  Raw result:\n\n" + content;
+        }
+        code = $('<code />').text(json);
+        pre = $('<pre class="json" />').append(code);
+      } else if (contentType === "application/xml" || /\+xml$/.test(contentType)) {
+        code = $('<code />').text(this.formatXml(content));
+        pre = $('<pre class="xml" />').append(code);
+      } else if (contentType === "text/html") {
+        code = $('<code />').html(_.escape(content));
+        pre = $('<pre class="xml" />').append(code);
+      } else if (/^image\//.test(contentType)) {
+        pre = $('<img>').attr('src', url);
+      } else {
+        code = $('<code />').text(content);
+        pre = $('<pre class="json" />').append(code);
+      }
+      response_body = pre;
+      $(".request_url", $(this.el)).html("<pre></pre>");
+      $(".request_url pre", $(this.el)).text(url);
+      $(".response_code", $(this.el)).html("<pre>" + response.status + "</pre>");
+      $(".response_body", $(this.el)).html(response_body);
+      $(".response_headers", $(this.el)).html("<pre>" + _.escape(JSON.stringify(response.headers, null, "  ")).replace(/\n/g, "<br>") + "</pre>");
+      $(".response", $(this.el)).slideDown();
+      $(".response_hider", $(this.el)).show();
+      $(".response_throbber", $(this.el)).hide();
+      response_body_el = $('.response_body', $(this.el))[0];
+      opts = this.options.swaggerOptions;
+      if (opts.highlightSizeThreshold && response.data.length > opts.highlightSizeThreshold) {
+        return response_body_el;
+      } else {
+        return hljs.highlightBlock(response_body_el);
+      }
+    };
+
+    OperationView.prototype.toggleOperationContent = function() {
+      var elem;
+      elem = $('#' + Docs.escapeResourceName(this.model.parentId) + "_" + this.model.nickname + "_content");
+      if (elem.is(':visible')) {
+        return Docs.collapseOperation(elem);
+      } else {
+        return Docs.expandOperation(elem);
+      }
+    };
+
+    return OperationView;
+
+  })(Backbone.View);
+
+  StatusCodeView = (function(_super) {
+    __extends(StatusCodeView, _super);
+
+    function StatusCodeView() {
+      _ref5 = StatusCodeView.__super__.constructor.apply(this, arguments);
+      return _ref5;
+    }
+
+    StatusCodeView.prototype.initialize = function() {};
+
+    StatusCodeView.prototype.render = function() {
+      var responseModel, responseModelView, template;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      if (swaggerUi.api.models.hasOwnProperty(this.model.responseModel)) {
+        responseModel = {
+          sampleJSON: JSON.stringify(swaggerUi.api.models[this.model.responseModel].createJSONSample(), null, 2),
+          isParam: false,
+          signature: swaggerUi.api.models[this.model.responseModel].getMockSignature()
+        };
+        responseModelView = new SignatureView({
+          model: responseModel,
+          tagName: 'div'
+        });
+        $('.model-signature', this.$el).append(responseModelView.render().el);
+      } else {
+        $('.model-signature', this.$el).html('');
+      }
+      return this;
+    };
+
+    StatusCodeView.prototype.template = function() {
+      return Handlebars.templates.status_code;
+    };
+
+    return StatusCodeView;
+
+  })(Backbone.View);
+
+  ParameterView = (function(_super) {
+    __extends(ParameterView, _super);
+
+    function ParameterView() {
+      _ref6 = ParameterView.__super__.constructor.apply(this, arguments);
+      return _ref6;
+    }
+
+    ParameterView.prototype.initialize = function() {
+      return Handlebars.registerHelper('isArray', function(param, opts) {
+        if (param.type.toLowerCase() === 'array' || param.allowMultiple) {
+          return opts.fn(this);
+        } else {
+          return opts.inverse(this);
+        }
+      });
+    };
+
+    ParameterView.prototype.render = function() {
+      var contentTypeModel, isParam, parameterContentTypeView, ref, responseContentTypeView, schema, signatureModel, signatureView, template, type;
+      type = this.model.type || this.model.dataType;
+      if (typeof type === 'undefined') {
+        schema = this.model.schema;
+        if (schema && schema['$ref']) {
+          ref = schema['$ref'];
+          if (ref.indexOf('#/definitions/') === 0) {
+            type = ref.substring('#/definitions/'.length);
+          } else {
+            type = ref;
+          }
+        }
+      }
+      this.model.type = type;
+      this.model.paramType = this.model["in"] || this.model.paramType;
+      if (this.model.paramType === 'body') {
+        this.model.isBody = true;
+      }
+      if (type && type.toLowerCase() === 'file') {
+        this.model.isFile = true;
+      }
+      this.model["default"] = this.model["default"] || this.model.defaultValue;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      signatureModel = {
+        sampleJSON: this.model.sampleJSON,
+        isParam: true,
+        signature: this.model.signature
+      };
+      if (this.model.sampleJSON) {
+        signatureView = new SignatureView({
+          model: signatureModel,
+          tagName: 'div'
+        });
+        $('.model-signature', $(this.el)).append(signatureView.render().el);
+      } else {
+        $('.model-signature', $(this.el)).html(this.model.signature);
+      }
+      isParam = false;
+      if (this.model.isBody) {
+        isParam = true;
+      }
+      contentTypeModel = {
+        isParam: isParam
+      };
+      contentTypeModel.consumes = this.model.consumes;
+      if (isParam) {
+        parameterContentTypeView = new ParameterContentTypeView({
+          model: contentTypeModel
+        });
+        $('.parameter-content-type', $(this.el)).append(parameterContentTypeView.render().el);
+      } else {
+        responseContentTypeView = new ResponseContentTypeView({
+          model: contentTypeModel
+        });
+        $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el);
+      }
+      return this;
+    };
+
+    ParameterView.prototype.template = function() {
+      if (this.model.isList) {
+        return Handlebars.templates.param_list;
+      } else {
+        if (this.options.readOnly) {
+          if (this.model.required) {
+            return Handlebars.templates.param_readonly_required;
+          } else {
+            return Handlebars.templates.param_readonly;
+          }
+        } else {
+          if (this.model.required) {
+            return Handlebars.templates.param_required;
+          } else {
+            return Handlebars.templates.param;
+          }
+        }
+      }
+    };
+
+    return ParameterView;
+
+  })(Backbone.View);
+
+  SignatureView = (function(_super) {
+    __extends(SignatureView, _super);
+
+    function SignatureView() {
+      _ref7 = SignatureView.__super__.constructor.apply(this, arguments);
+      return _ref7;
+    }
+
+    SignatureView.prototype.events = {
+      'click a.description-link': 'switchToDescription',
+      'click a.snippet-link': 'switchToSnippet',
+      'mousedown .snippet': 'snippetToTextArea'
+    };
+
+    SignatureView.prototype.initialize = function() {};
+
+    SignatureView.prototype.render = function() {
+      var template;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      this.switchToSnippet();
+      this.isParam = this.model.isParam;
+      if (this.isParam) {
+        $('.notice', $(this.el)).text('Click to set as parameter value');
+      }
+      return this;
+    };
+
+    SignatureView.prototype.template = function() {
+      return Handlebars.templates.signature;
+    };
+
+    SignatureView.prototype.switchToDescription = function(e) {
+      if (e != null) {
+        e.preventDefault();
+      }
+      $(".snippet", $(this.el)).hide();
+      $(".description", $(this.el)).show();
+      $('.description-link', $(this.el)).addClass('selected');
+      return $('.snippet-link', $(this.el)).removeClass('selected');
+    };
+
+    SignatureView.prototype.switchToSnippet = function(e) {
+      if (e != null) {
+        e.preventDefault();
+      }
+      $(".description", $(this.el)).hide();
+      $(".snippet", $(this.el)).show();
+      $('.snippet-link', $(this.el)).addClass('selected');
+      return $('.description-link', $(this.el)).removeClass('selected');
+    };
+
+    SignatureView.prototype.snippetToTextArea = function(e) {
+      var textArea;
+      if (this.isParam) {
+        if (e != null) {
+          e.preventDefault();
+        }
+        textArea = $('textarea', $(this.el.parentNode.parentNode.parentNode));
+        if ($.trim(textArea.val()) === '') {
+          return textArea.val(this.model.sampleJSON);
+        }
+      }
+    };
+
+    return SignatureView;
+
+  })(Backbone.View);
+
+  ContentTypeView = (function(_super) {
+    __extends(ContentTypeView, _super);
+
+    function ContentTypeView() {
+      _ref8 = ContentTypeView.__super__.constructor.apply(this, arguments);
+      return _ref8;
+    }
+
+    ContentTypeView.prototype.initialize = function() {};
+
+    ContentTypeView.prototype.render = function() {
+      var template;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      $('label[for=contentType]', $(this.el)).text('Response Content Type');
+      return this;
+    };
+
+    ContentTypeView.prototype.template = function() {
+      return Handlebars.templates.content_type;
+    };
+
+    return ContentTypeView;
+
+  })(Backbone.View);
+
+  ResponseContentTypeView = (function(_super) {
+    __extends(ResponseContentTypeView, _super);
+
+    function ResponseContentTypeView() {
+      _ref9 = ResponseContentTypeView.__super__.constructor.apply(this, arguments);
+      return _ref9;
+    }
+
+    ResponseContentTypeView.prototype.initialize = function() {};
+
+    ResponseContentTypeView.prototype.render = function() {
+      var template;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      $('label[for=responseContentType]', $(this.el)).text('Response Content Type');
+      return this;
+    };
+
+    ResponseContentTypeView.prototype.template = function() {
+      return Handlebars.templates.response_content_type;
+    };
+
+    return ResponseContentTypeView;
+
+  })(Backbone.View);
+
+  ParameterContentTypeView = (function(_super) {
+    __extends(ParameterContentTypeView, _super);
+
+    function ParameterContentTypeView() {
+      _ref10 = ParameterContentTypeView.__super__.constructor.apply(this, arguments);
+      return _ref10;
+    }
+
+    ParameterContentTypeView.prototype.initialize = function() {};
+
+    ParameterContentTypeView.prototype.render = function() {
+      var template;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      $('label[for=parameterContentType]', $(this.el)).text('Parameter content type:');
+      return this;
+    };
+
+    ParameterContentTypeView.prototype.template = function() {
+      return Handlebars.templates.parameter_content_type;
+    };
+
+    return ParameterContentTypeView;
+
+  })(Backbone.View);
+
+  ApiKeyButton = (function(_super) {
+    __extends(ApiKeyButton, _super);
+
+    function ApiKeyButton() {
+      _ref11 = ApiKeyButton.__super__.constructor.apply(this, arguments);
+      return _ref11;
+    }
+
+    ApiKeyButton.prototype.initialize = function() {};
+
+    ApiKeyButton.prototype.render = function() {
+      var template;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      return this;
+    };
+
+    ApiKeyButton.prototype.events = {
+      "click #apikey_button": "toggleApiKeyContainer",
+      "click #apply_api_key": "applyApiKey"
+    };
+
+    ApiKeyButton.prototype.applyApiKey = function() {
+      var elem;
+      window.authorizations.add(this.model.name, new ApiKeyAuthorization(this.model.name, $("#input_apiKey_entry").val(), this.model["in"]));
+      window.swaggerUi.load();
+      return elem = $('#apikey_container').show();
+    };
+
+    ApiKeyButton.prototype.toggleApiKeyContainer = function() {
+      var elem;
+      if ($('#apikey_container').length > 0) {
+        elem = $('#apikey_container').first();
+        if (elem.is(':visible')) {
+          return elem.hide();
+        } else {
+          $('.auth_container').hide();
+          return elem.show();
+        }
+      }
+    };
+
+    ApiKeyButton.prototype.template = function() {
+      return Handlebars.templates.apikey_button_view;
+    };
+
+    return ApiKeyButton;
+
+  })(Backbone.View);
+
+  BasicAuthButton = (function(_super) {
+    __extends(BasicAuthButton, _super);
+
+    function BasicAuthButton() {
+      _ref12 = BasicAuthButton.__super__.constructor.apply(this, arguments);
+      return _ref12;
+    }
+
+    BasicAuthButton.prototype.initialize = function() {};
+
+    BasicAuthButton.prototype.render = function() {
+      var template;
+      template = this.template();
+      $(this.el).html(template(this.model));
+      return this;
+    };
+
+    BasicAuthButton.prototype.events = {
+      "click #basic_auth_button": "togglePasswordContainer",
+      "click #apply_basic_auth": "applyPassword"
+    };
+
+    BasicAuthButton.prototype.applyPassword = function() {
+      var elem, password, username;
+      console.log("applying password");
+      username = $(".input_username").val();
+      password = $(".input_password").val();
+      window.authorizations.add(this.model.type, new PasswordAuthorization("basic", username, password));
+      window.swaggerUi.load();
+      return elem = $('#basic_auth_container').hide();
+    };
+
+    BasicAuthButton.prototype.togglePasswordContainer = function() {
+      var elem;
+      if ($('#basic_auth_container').length > 0) {
+        elem = $('#basic_auth_container').show();
+        if (elem.is(':visible')) {
+          return elem.slideUp();
+        } else {
+          $('.auth_container').hide();
+          return elem.show();
+        }
+      }
+    };
+
+    BasicAuthButton.prototype.template = function() {
+      return Handlebars.templates.basic_auth_button_view;
+    };
+
+    return BasicAuthButton;
+
+  })(Backbone.View);
+
+}).call(this);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/swagger-ui.min.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/swagger-ui.min.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/api-docs/swagger-ui.min.js	(revision 5961)
@@ -0,0 +1,1 @@
+$(function(){$.fn.vAlign=function(){return this.each(function(c){var a=$(this).height();var d=$(this).parent().height();var b=(d-a)/2;$(this).css("margin-top",b)})};$.fn.stretchFormtasticInputWidthToParent=function(){return this.each(function(b){var d=$(this).closest("form").innerWidth();var c=parseInt($(this).closest("form").css("padding-left"),10)+parseInt($(this).closest("form").css("padding-right"),10);var a=parseInt($(this).css("padding-left"),10)+parseInt($(this).css("padding-right"),10);$(this).css("width",d-c-a)})};$("form.formtastic li.string input, form.formtastic textarea").stretchFormtasticInputWidthToParent();$("ul.downplayed li div.content p").vAlign();$("form.sandbox").submit(function(){var a=true;$(this).find("input.required").each(function(){$(this).removeClass("error");if($(this).val()==""){$(this).addClass("error");$(this).wiggle();a=false}});return a})});function clippyCopiedCallback(b){$("#api_key_copied").fadeIn().delay(1000).fadeOut()}log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){console.log(Array.prototype.slice.call(arguments)[0])}};if(Function.prototype.bind&&console&&typeof console.log=="object"){["log","info","warn","error","assert","dir","clear","profile","profileEnd"].forEach(function(a){console[a]=this.bind(console[a],console)},Function.prototype.call)}var Docs={shebang:function(){var b=$.param.fragment().split("/");b.shift();switch(b.length){case 1:var d="resource_"+b[0];Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});break;case 2:Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});var c=b.join("_");var a=c+"_content";Docs.expandOperation($("#"+a));$("#"+c).slideto({highlight:false});break}},toggleEndpointListForResource:function(b){var a=$("li#resource_"+Docs.escapeResourceName(b)+" ul.endpoints");if(a.is(":visible")){Docs.collapseEndpointListForResource(b)}else{Docs.expandEndpointListForResource(b)}},expandEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);if(b==""){$(".resource ul.endpoints").slideDown();return}$("li#resource_"+b).addClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideDown()},collapseEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);$("li#resource_"+b).removeClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideUp()},expandOperationsForResource:function(a){Docs.expandEndpointListForResource(a);if(a==""){$(".resource ul.endpoints li.operation div.content").slideDown();return}$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.expandOperation($(this))})},collapseOperationsForResource:function(a){Docs.expandEndpointListForResource(a);$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.collapseOperation($(this))})},escapeResourceName:function(a){return a.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g,"\\$&")},expandOperation:function(a){a.slideDown()},collapseOperation:function(a){a.slideUp()}};(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.apikey_button_view=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+="<div class='auth_button' id='apikey_button'><img class='auth_icon' alt='apply api key' src='images/apikey.jpeg'></div>\n<div class='auth_container' id='apikey_container'>\n  <div class='key_input_container'>\n    <div class='auth_label'>";if(c=d.keyName){c=c.call(k,{hash:{},data:i})}else{c=k.keyName;c=typeof c===f?c.apply(k):c}g+=h(c)+'</div>\n    <input placeholder="api_key" class="auth_input" id="input_apiKey_entry" name="apiKey" type="text"/>\n    <div class=\'auth_submit\'><a class=\'auth_submit_button\' id="apply_api_key" href="#">apply</a></div>\n  </div>\n</div>\n\n';return g})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.basic_auth_button_view=b(function(f,g,d,c,e){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,f.helpers);e=e||{};return'<div class=\'auth_button\' id=\'basic_auth_button\'><img class=\'auth_icon\' src=\'images/password.jpeg\'></div>\n<div class=\'auth_container\' id=\'basic_auth_container\'>\n  <div class=\'key_input_container\'>\n    <div class="auth_label">Username</div>\n    <input placeholder="username" class="auth_input" id="input_username" name="username" type="text"/>\n    <div class="auth_label">Password</div>\n    <input placeholder="password" class="auth_input" id="input_password" name="password" type="password"/>\n    <div class=\'auth_submit\'><a class=\'auth_submit_button\' id="apply_basic_auth" href="#">apply</a></div>\n  </div>\n</div>\n\n'})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n  ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n	<option value="';p=(typeof r===h?r.apply(r):r);if(p||p===0){o+=p}o+='">';p=(typeof r===h?r.apply(r):r);if(p||p===0){o+=p}o+="</option>\n	";return o}function n(p,o){return'\n  <option value="application/json">application/json</option>\n'}i+='<label for="contentType"></label>\n<select name="contentType">\n';c=f["if"].call(l,l.produces,{hash:{},inverse:m.program(4,n,j),fn:m.program(1,e,j),data:j});if(c||c===0){i+=c}i+="\n</select>\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.main=b(function(h,n,g,m,l){this.compilerInfo=[4,">= 1.0.0"];g=this.merge(g,h.helpers);l=l||{};var j="",c,s,i="function",k=this.escapeExpression,q=this;function f(x,w){var t="",v,u;t+='\n  <div class="info_title">'+k(((v=((v=x.info),v==null||v===false?v:v.title)),typeof v===i?v.apply(x):v))+'</div>\n  <div class="info_description">';u=((v=((v=x.info),v==null||v===false?v:v.description)),typeof v===i?v.apply(x):v);if(u||u===0){t+=u}t+="</div>\n  ";u=g["if"].call(x,((v=x.info),v==null||v===false?v:v.termsOfServiceUrl),{hash:{},inverse:q.noop,fn:q.program(2,d,w),data:w});if(u||u===0){t+=u}t+="\n  ";u=g["if"].call(x,((v=x.info),v==null||v===false?v:v.contact),{hash:{},inverse:q.noop,fn:q.program(4,r,w),data:w});if(u||u===0){t+=u}t+="\n  ";u=g["if"].call(x,((v=x.info),v==null||v===false?v:v.license),{hash:{},inverse:q.noop,fn:q.program(6,p,w),data:w});if(u||u===0){t+=u}t+="\n  ";return t}function d(w,v){var t="",u;t+='<div class="info_tos"><a href="'+k(((u=((u=w.info),u==null||u===false?u:u.termsOfServiceUrl)),typeof u===i?u.apply(w):u))+'">Terms of service</a></div>';return t}function r(w,v){var t="",u;t+="<div class='info_contact'><a href=\"mailto:"+k(((u=((u=((u=w.info),u==null||u===false?u:u.contact)),u==null||u===false?u:u.name)),typeof u===i?u.apply(w):u))+'">Contact the developer</a></div>';return t}function p(w,v){var t="",u;t+="<div class='info_license'><a href='"+k(((u=((u=((u=w.info),u==null||u===false?u:u.license)),u==null||u===false?u:u.url)),typeof u===i?u.apply(w):u))+"'>"+k(((u=((u=((u=w.info),u==null||u===false?u:u.license)),u==null||u===false?u:u.name)),typeof u===i?u.apply(w):u))+"</a></div>";return t}function o(w,v){var t="",u;t+='\n    , <span style="font-variant: small-caps">api version</span>: '+k(((u=((u=w.info),u==null||u===false?u:u.version)),typeof u===i?u.apply(w):u))+"\n    ";return t}function e(w,v){var t="",u;t+='\n    <span style="float:right"><a href="';if(u=g.validatorUrl){u=u.call(w,{hash:{},data:v})}else{u=w.validatorUrl;u=typeof u===i?u.apply(w):u}t+=k(u)+"/debug?url=";if(u=g.url){u=u.call(w,{hash:{},data:v})}else{u=w.url;u=typeof u===i?u.apply(w):u}t+=k(u)+'"><img id="validator" src="';if(u=g.validatorUrl){u=u.call(w,{hash:{},data:v})}else{u=w.validatorUrl;u=typeof u===i?u.apply(w):u}t+=k(u)+"?url=";if(u=g.url){u=u.call(w,{hash:{},data:v})}else{u=w.url;u=typeof u===i?u.apply(w):u}t+=k(u)+'"></a>\n    </span>\n    ';return t}j+="<div class='info' id='api_info'>\n  ";c=g["if"].call(n,n.info,{hash:{},inverse:q.noop,fn:q.program(1,f,l),data:l});if(c||c===0){j+=c}j+="\n</div>\n<div class='container' id='resources_container'>\n  <ul id='resources'></ul>\n\n  <div class=\"footer\">\n    <br>\n    <br>\n    <h4 style=\"color: #999\">[ <span style=\"font-variant: small-caps\">base url</span>: ";if(c=g.basePath){c=c.call(n,{hash:{},data:l})}else{c=n.basePath;c=typeof c===i?c.apply(n):c}j+=k(c)+"\n    ";s=g["if"].call(n,((c=n.info),c==null||c===false?c:c.version),{hash:{},inverse:q.noop,fn:q.program(8,o,l),data:l});if(s||s===0){j+=s}j+="]\n    ";s=g["if"].call(n,n.validatorUrl,{hash:{},inverse:q.noop,fn:q.program(10,e,l),data:l});if(s||s===0){j+=s}j+="\n    </h4>\n    </div>\n</div>\n";return j})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.operation=b(function(j,u,s,o,A){this.compilerInfo=[4,">= 1.0.0"];s=this.merge(s,j.helpers);A=A||{};var t="",k,f,e="function",d=this.escapeExpression,r=this,c=s.blockHelperMissing;function q(C,B){return"deprecated"}function p(C,B){return"\n            <h4>Warning: Deprecated</h4>\n        "}function n(E,D){var B="",C;B+="\n        <h4>Implementation Notes</h4>\n        <p>";if(C=s.description){C=C.call(E,{hash:{},data:D})}else{C=E.description;C=typeof C===e?C.apply(E):C}if(C||C===0){B+=C}B+="</p>\n        ";return B}function m(C,B){return'\n        <div class="auth">\n        <span class="api-ic ic-error"></span>'}function i(E,D){var B="",C;B+='\n          <div id="api_information_panel" style="top: 526px; left: 776px; display: none;">\n          ';C=s.each.call(E,E,{hash:{},inverse:r.noop,fn:r.program(10,z,D),data:D});if(C||C===0){B+=C}B+="\n          </div>\n        ";return B}function z(F,E){var B="",D,C;B+="\n            <div title='";C=((D=F.description),typeof D===e?D.apply(F):D);if(C||C===0){B+=C}B+="'>"+d(((D=F.scope),typeof D===e?D.apply(F):D))+"</div>\n          ";return B}function y(C,B){return"</div>"}function x(C,B){return'\n        <div class=\'access\'>\n          <span class="api-ic ic-off" title="click to authenticate"></span>\n        </div>\n        '}function w(C,B){return'\n          <h4>Response Class</h4>\n          <p><span class="model-signature" /></p>\n          <br/>\n          <div class="response-content-type" />\n        '}function v(C,B){return'\n          <h4>Parameters</h4>\n          <table class=\'fullwidth\'>\n          <thead>\n            <tr>\n            <th style="width: 100px; max-width: 100px">Parameter</th>\n            <th style="width: 310px; max-width: 310px">Value</th>\n            <th style="width: 200px; max-width: 200px">Description</th>\n            <th style="width: 100px; max-width: 100px">Parameter Type</th>\n            <th style="width: 220px; max-width: 230px">Data Type</th>\n            </tr>\n          </thead>\n          <tbody class="operation-params">\n\n          </tbody>\n          </table>\n          '}function l(C,B){return"\n          <div style='margin:0;padding:0;display:inline'></div>\n          <h4>Response Messages</h4>\n          <table class='fullwidth'>\n            <thead>\n            <tr>\n              <th>HTTP Status Code</th>\n              <th>Reason</th>\n              <th>Response Model</th>\n            </tr>\n            </thead>\n            <tbody class=\"operation-status\">\n            \n            </tbody>\n          </table>\n          "}function h(C,B){return"\n          "}function g(C,B){return"\n          <div class='sandbox_header'>\n            <input class='submit' name='commit' type='button' value='Try it out!' />\n            <a href='#' class='response_hider' style='display:none'>Hide Response</a>\n            <span class='response_throbber' style='display:none'></span>\n          </div>\n          "}t+="\n  <ul class='operations' >\n    <li class='";if(k=s.method){k=k.call(u,{hash:{},data:A})}else{k=u.method;k=typeof k===e?k.apply(u):k}t+=d(k)+" operation' id='";if(k=s.parentId){k=k.call(u,{hash:{},data:A})}else{k=u.parentId;k=typeof k===e?k.apply(u):k}t+=d(k)+"_";if(k=s.nickname){k=k.call(u,{hash:{},data:A})}else{k=u.nickname;k=typeof k===e?k.apply(u):k}t+=d(k)+"'>\n      <div class='heading'>\n        <h3>\n          <span class='http_method'>\n          <a href='#!/";if(k=s.parentId){k=k.call(u,{hash:{},data:A})}else{k=u.parentId;k=typeof k===e?k.apply(u):k}t+=d(k)+"/";if(k=s.nickname){k=k.call(u,{hash:{},data:A})}else{k=u.nickname;k=typeof k===e?k.apply(u):k}t+=d(k)+'\' class="toggleOperation">';if(k=s.method){k=k.call(u,{hash:{},data:A})}else{k=u.method;k=typeof k===e?k.apply(u):k}t+=d(k)+"</a>\n          </span>\n          <span class='path'>\n          <a href='#!/";if(k=s.parentId){k=k.call(u,{hash:{},data:A})}else{k=u.parentId;k=typeof k===e?k.apply(u):k}t+=d(k)+"/";if(k=s.nickname){k=k.call(u,{hash:{},data:A})}else{k=u.nickname;k=typeof k===e?k.apply(u):k}t+=d(k)+"' class=\"toggleOperation ";k=s["if"].call(u,u.deprecated,{hash:{},inverse:r.noop,fn:r.program(1,q,A),data:A});if(k||k===0){t+=k}t+='">';if(k=s.path){k=k.call(u,{hash:{},data:A})}else{k=u.path;k=typeof k===e?k.apply(u):k}t+=d(k)+"</a>\n          </span>\n        </h3>\n        <ul class='options'>\n          <li>\n          <a href='#!/";if(k=s.parentId){k=k.call(u,{hash:{},data:A})}else{k=u.parentId;k=typeof k===e?k.apply(u):k}t+=d(k)+"/";if(k=s.nickname){k=k.call(u,{hash:{},data:A})}else{k=u.nickname;k=typeof k===e?k.apply(u):k}t+=d(k)+'\' class="toggleOperation">';if(k=s.summary){k=k.call(u,{hash:{},data:A})}else{k=u.summary;k=typeof k===e?k.apply(u):k}if(k||k===0){t+=k}t+="</a>\n          </li>\n        </ul>\n      </div>\n      <div class='content' id='";if(k=s.parentId){k=k.call(u,{hash:{},data:A})}else{k=u.parentId;k=typeof k===e?k.apply(u):k}t+=d(k)+"_";if(k=s.nickname){k=k.call(u,{hash:{},data:A})}else{k=u.nickname;k=typeof k===e?k.apply(u):k}t+=d(k)+"_content' style='display:none'>\n        ";k=s["if"].call(u,u.deprecated,{hash:{},inverse:r.noop,fn:r.program(3,p,A),data:A});if(k||k===0){t+=k}t+="\n        ";k=s["if"].call(u,u.description,{hash:{},inverse:r.noop,fn:r.program(5,n,A),data:A});if(k||k===0){t+=k}t+="\n        ";f={hash:{},inverse:r.noop,fn:r.program(7,m,A),data:A};if(k=s.oauth){k=k.call(u,f)}else{k=u.oauth;k=typeof k===e?k.apply(u):k}if(!s.oauth){k=c.call(u,k,f)}if(k||k===0){t+=k}t+="\n        ";k=s.each.call(u,u.oauth,{hash:{},inverse:r.noop,fn:r.program(9,i,A),data:A});if(k||k===0){t+=k}t+="\n        ";f={hash:{},inverse:r.noop,fn:r.program(12,y,A),data:A};if(k=s.oauth){k=k.call(u,f)}else{k=u.oauth;k=typeof k===e?k.apply(u):k}if(!s.oauth){k=c.call(u,k,f)}if(k||k===0){t+=k}t+="\n        ";f={hash:{},inverse:r.noop,fn:r.program(14,x,A),data:A};if(k=s.oauth){k=k.call(u,f)}else{k=u.oauth;k=typeof k===e?k.apply(u):k}if(!s.oauth){k=c.call(u,k,f)}if(k||k===0){t+=k}t+="\n        ";k=s["if"].call(u,u.type,{hash:{},inverse:r.noop,fn:r.program(16,w,A),data:A});if(k||k===0){t+=k}t+="\n        <form accept-charset='UTF-8' class='sandbox'>\n          <div style='margin:0;padding:0;display:inline'></div>\n          ";k=s["if"].call(u,u.parameters,{hash:{},inverse:r.noop,fn:r.program(18,v,A),data:A});if(k||k===0){t+=k}t+="\n          ";k=s["if"].call(u,u.responseMessages,{hash:{},inverse:r.noop,fn:r.program(20,l,A),data:A});if(k||k===0){t+=k}t+="\n          ";k=s["if"].call(u,u.isReadOnly,{hash:{},inverse:r.program(24,g,A),fn:r.program(22,h,A),data:A});if(k||k===0){t+=k}t+="\n        </form>\n        <div class='response' style='display:none'>\n          <h4>Request URL</h4>\n          <div class='block request_url'></div>\n          <h4>Response Body</h4>\n          <div class='block response_body'></div>\n          <h4>Response Code</h4>\n          <div class='block response_code'></div>\n          <h4>Response Headers</h4>\n          <div class='block response_headers'></div>\n        </div>\n      </div>\n    </li>\n  </ul>\n";return t})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param=b(function(f,q,o,j,t){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);t=t||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(y,x){var v="",w;v+="\n		";w=o["if"].call(y,y.isFile,{hash:{},inverse:n.program(4,k,x),fn:n.program(2,l,x),data:x});if(w||w===0){v+=w}v+="\n	";return v}function l(y,x){var v="",w;v+='\n			<input type="file" name=\'';if(w=o.name){w=w.call(y,{hash:{},data:x})}else{w=y.name;w=typeof w===d?w.apply(y):w}v+=c(w)+'\'/>\n			<div class="parameter-content-type" />\n		';return v}function k(y,x){var v="",w;v+="\n			";w=o["if"].call(y,y["default"],{hash:{},inverse:n.program(7,h,x),fn:n.program(5,i,x),data:x});if(w||w===0){v+=w}v+="\n		";return v}function i(y,x){var v="",w;v+="\n				<textarea class='body-textarea' name='";if(w=o.name){w=w.call(y,{hash:{},data:x})}else{w=y.name;w=typeof w===d?w.apply(y):w}v+=c(w)+"'>";if(w=o["default"]){w=w.call(y,{hash:{},data:x})}else{w=y["default"];w=typeof w===d?w.apply(y):w}v+=c(w)+"</textarea>\n			";return v}function h(y,x){var v="",w;v+="\n				<textarea class='body-textarea' name='";if(w=o.name){w=w.call(y,{hash:{},data:x})}else{w=y.name;w=typeof w===d?w.apply(y):w}v+=c(w)+'\'></textarea>\n				<br />\n				<div class="parameter-content-type" />\n			';return v}function e(y,x){var v="",w;v+="\n		";w=o["if"].call(y,y.isFile,{hash:{},inverse:n.program(10,u,x),fn:n.program(2,l,x),data:x});if(w||w===0){v+=w}v+="\n	";return v}function u(y,x){var v="",w;v+="\n			";w=o["if"].call(y,y["default"],{hash:{},inverse:n.program(13,r,x),fn:n.program(11,s,x),data:x});if(w||w===0){v+=w}v+="\n		";return v}function s(y,x){var v="",w;v+="\n				<input class='parameter' minlength='0' name='";if(w=o.name){w=w.call(y,{hash:{},data:x})}else{w=y.name;w=typeof w===d?w.apply(y):w}v+=c(w)+"' placeholder='' type='text' value='";if(w=o["default"]){w=w.call(y,{hash:{},data:x})}else{w=y["default"];w=typeof w===d?w.apply(y):w}v+=c(w)+"'/>\n			";return v}function r(y,x){var v="",w;v+="\n				<input class='parameter' minlength='0' name='";if(w=o.name){w=w.call(y,{hash:{},data:x})}else{w=y.name;w=typeof w===d?w.apply(y):w}v+=c(w)+"' placeholder='' type='text' value=''/>\n			";return v}p+="<td class='code'>";if(g=o.name){g=g.call(q,{hash:{},data:t})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"</td>\n<td>\n\n	";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,t),fn:n.program(1,m,t),data:t});if(g||g===0){p+=g}p+="\n\n</td>\n<td>";if(g=o.description){g=g.call(q,{hash:{},data:t})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="</td>\n<td>";if(g=o.paramType){g=g.call(q,{hash:{},data:t})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='</td>\n<td>\n	<span class="model-signature"></span>\n</td>\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_list=b(function(h,t,r,m,y){this.compilerInfo=[4,">= 1.0.0"];r=this.merge(r,h.helpers);y=y||{};var s="",j,g,e,p=this,q=r.helperMissing,d="function",c=this.escapeExpression;function o(A,z){return" multiple='multiple'"}function n(A,z){return"\n    "}function l(C,B){var z="",A;z+="\n      ";A=r["if"].call(C,C.defaultValue,{hash:{},inverse:p.program(8,i,B),fn:p.program(6,k,B),data:B});if(A||A===0){z+=A}z+="\n    ";return z}function k(A,z){return"\n      "}function i(E,D){var z="",C,B,A;z+="\n        ";A={hash:{},inverse:p.program(11,x,D),fn:p.program(9,f,D),data:D};B=((C=r.isArray||E.isArray),C?C.call(E,E,A):q.call(E,"isArray",E,A));if(B||B===0){z+=B}z+="\n      ";return z}function f(A,z){return"\n        "}function x(A,z){return"\n          <option selected=\"\" value=''></option>\n        "}function w(C,B){var z="",A;z+="\n      ";A=r["if"].call(C,C.isDefault,{hash:{},inverse:p.program(16,u,B),fn:p.program(14,v,B),data:B});if(A||A===0){z+=A}z+="\n    ";return z}function v(C,B){var z="",A;z+='\n        <option selected="" value=\'';if(A=r.value){A=A.call(C,{hash:{},data:B})}else{A=C.value;A=typeof A===d?A.apply(C):A}z+=c(A)+"'>";if(A=r.value){A=A.call(C,{hash:{},data:B})}else{A=C.value;A=typeof A===d?A.apply(C):A}z+=c(A)+" (default)</option>\n      ";return z}function u(C,B){var z="",A;z+="\n        <option value='";if(A=r.value){A=A.call(C,{hash:{},data:B})}else{A=C.value;A=typeof A===d?A.apply(C):A}z+=c(A)+"'>";if(A=r.value){A=A.call(C,{hash:{},data:B})}else{A=C.value;A=typeof A===d?A.apply(C):A}z+=c(A)+"</option>\n      ";return z}s+="<td class='code'>";if(j=r.name){j=j.call(t,{hash:{},data:y})}else{j=t.name;j=typeof j===d?j.apply(t):j}s+=c(j)+"</td>\n<td>\n  <select ";e={hash:{},inverse:p.noop,fn:p.program(1,o,y),data:y};g=((j=r.isArray||t.isArray),j?j.call(t,t,e):q.call(t,"isArray",t,e));if(g||g===0){s+=g}s+=" class='parameter' name='";if(g=r.name){g=g.call(t,{hash:{},data:y})}else{g=t.name;g=typeof g===d?g.apply(t):g}s+=c(g)+"'>\n    ";g=r["if"].call(t,t.required,{hash:{},inverse:p.program(5,l,y),fn:p.program(3,n,y),data:y});if(g||g===0){s+=g}s+="\n    ";g=r.each.call(t,((j=t.allowableValues),j==null||j===false?j:j.descriptiveValues),{hash:{},inverse:p.noop,fn:p.program(13,w,y),data:y});if(g||g===0){s+=g}s+="\n  </select>\n</td>\n<td>";if(g=r.description){g=g.call(t,{hash:{},data:y})}else{g=t.description;g=typeof g===d?g.apply(t):g}if(g||g===0){s+=g}s+="</td>\n<td>";if(g=r.paramType){g=g.call(t,{hash:{},data:y})}else{g=t.paramType;g=typeof g===d?g.apply(t):g}if(g||g===0){s+=g}s+='</td>\n<td><span class="model-signature"></span></td>';return s})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n        <textarea class='body-textarea' readonly='readonly' name='";if(r=f.name){r=r.call(t,{hash:{},data:s})}else{r=t.name;r=typeof r===h?r.apply(t):r}q+=j(r)+"'>";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"</textarea>\n    ";return q}function c(t,s){var q="",r;q+="\n        ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n    ";return q}function p(t,s){var q="",r;q+="\n            ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n        ";return q}function n(r,q){return"\n            (empty)\n        "}i+="<td class='code'>";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"</td>\n<td>\n    ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n</td>\n<td>";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="</td>\n<td>";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='</td>\n<td><span class="model-signature"></span></td>\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly_required=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n        <textarea class='body-textarea'  readonly='readonly' placeholder='(required)' name='";if(r=f.name){r=r.call(t,{hash:{},data:s})}else{r=t.name;r=typeof r===h?r.apply(t):r}q+=j(r)+"'>";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"</textarea>\n    ";return q}function c(t,s){var q="",r;q+="\n        ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n    ";return q}function p(t,s){var q="",r;q+="\n            ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n        ";return q}function n(r,q){return"\n            (empty)\n        "}i+="<td class='code required'>";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"</td>\n<td>\n    ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n</td>\n<td>";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="</td>\n<td>";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='</td>\n<td><span class="model-signature"></span></td>\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_required=b(function(f,q,o,j,u){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);u=u||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(z,y){var w="",x;w+="\n		";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(4,k,y),fn:n.program(2,l,y),data:y});if(x||x===0){w+=x}w+="\n	";return w}function l(z,y){var w="",x;w+='\n			<input type="file" name=\'';if(x=o.name){x=x.call(z,{hash:{},data:y})}else{x=z.name;x=typeof x===d?x.apply(z):x}w+=c(x)+"'/>\n		";return w}function k(z,y){var w="",x;w+="\n			";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(7,h,y),fn:n.program(5,i,y),data:y});if(x||x===0){w+=x}w+="\n		";return w}function i(z,y){var w="",x;w+="\n				<textarea class='body-textarea' placeholder='(required)' name='";if(x=o.name){x=x.call(z,{hash:{},data:y})}else{x=z.name;x=typeof x===d?x.apply(z):x}w+=c(x)+"'>";if(x=o.defaultValue){x=x.call(z,{hash:{},data:y})}else{x=z.defaultValue;x=typeof x===d?x.apply(z):x}w+=c(x)+"</textarea>\n			";return w}function h(z,y){var w="",x;w+="\n				<textarea class='body-textarea' placeholder='(required)' name='";if(x=o.name){x=x.call(z,{hash:{},data:y})}else{x=z.name;x=typeof x===d?x.apply(z):x}w+=c(x)+'\'></textarea>\n				<br />\n				<div class="parameter-content-type" />\n			';return w}function e(z,y){var w="",x;w+="\n		";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(12,t,y),fn:n.program(10,v,y),data:y});if(x||x===0){w+=x}w+="\n	";return w}function v(z,y){var w="",x;w+="\n			<input class='parameter' class='required' type='file' name='";if(x=o.name){x=x.call(z,{hash:{},data:y})}else{x=z.name;x=typeof x===d?x.apply(z):x}w+=c(x)+"'/>\n		";return w}function t(z,y){var w="",x;w+="\n			";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(15,r,y),fn:n.program(13,s,y),data:y});if(x||x===0){w+=x}w+="\n		";return w}function s(z,y){var w="",x;w+="\n				<input class='parameter required' minlength='1' name='";if(x=o.name){x=x.call(z,{hash:{},data:y})}else{x=z.name;x=typeof x===d?x.apply(z):x}w+=c(x)+"' placeholder='(required)' type='text' value='";if(x=o.defaultValue){x=x.call(z,{hash:{},data:y})}else{x=z.defaultValue;x=typeof x===d?x.apply(z):x}w+=c(x)+"'/>\n			";return w}function r(z,y){var w="",x;w+="\n				<input class='parameter required' minlength='1' name='";if(x=o.name){x=x.call(z,{hash:{},data:y})}else{x=z.name;x=typeof x===d?x.apply(z):x}w+=c(x)+"' placeholder='(required)' type='text' value=''/>\n			";return w}p+="<td class='code required'>";if(g=o.name){g=g.call(q,{hash:{},data:u})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"</td>\n<td>\n	";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,u),fn:n.program(1,m,u),data:u});if(g||g===0){p+=g}p+="\n</td>\n<td>\n	<strong>";if(g=o.description){g=g.call(q,{hash:{},data:u})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="</strong>\n</td>\n<td>";if(g=o.paramType){g=g.call(q,{hash:{},data:u})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='</td>\n<td><span class="model-signature"></span></td>\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.parameter_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n  ";p=f.each.call(r,r.consumes,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n  <option value="';p=(typeof r===h?r.apply(r):r);if(p||p===0){o+=p}o+='">';p=(typeof r===h?r.apply(r):r);if(p||p===0){o+=p}o+="</option>\n  ";return o}function n(p,o){return'\n  <option value="application/json">application/json</option>\n'}i+='<label for="parameterContentType"></label>\n<select name="parameterContentType">\n';c=f["if"].call(l,l.consumes,{hash:{},inverse:m.program(4,n,j),fn:m.program(1,e,j),data:j});if(c||c===0){i+=c}i+="\n</select>\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.resource=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,p,h="function",j=this.escapeExpression,o=this,n=f.blockHelperMissing;function e(r,q){return" : "}function c(t,s){var q="",r;q+="<li>\n      <a href='";if(r=f.url){r=r.call(t,{hash:{},data:s})}else{r=t.url;r=typeof r===h?r.apply(t):r}q+=j(r)+"'>Raw</a>\n    </li>";return q}i+="<div class='heading'>\n  <h2>\n    <a href='#!/";if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+'\' class="toggleEndpointList" data-id="';if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+'">';if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"</a> ";p={hash:{},inverse:o.noop,fn:o.program(1,e,k),data:k};if(d=f.summary){d=d.call(m,p)}else{d=m.summary;d=typeof d===h?d.apply(m):d}if(!f.summary){d=n.call(m,d,p)}if(d||d===0){i+=d}if(d=f.summary){d=d.call(m,{hash:{},data:k})}else{d=m.summary;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="\n  </h2>\n  <ul class='options'>\n    <li>\n      <a href='#!/";if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+"' id='endpointListTogger_";if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+'\' class="toggleEndpointList" data-id="';if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+'">Show/Hide</a>\n    </li>\n    <li>\n      <a href=\'#\' class="collapseResource" data-id="';if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+'">\n        List Operations\n      </a>\n    </li>\n    <li>\n      <a href=\'#\' class="expandResource" data-id=';if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+">\n        Expand Operations\n      </a>\n    </li>\n    ";p={hash:{},inverse:o.noop,fn:o.program(3,c,k),data:k};if(d=f.url){d=d.call(m,p)}else{d=m.url;d=typeof d===h?d.apply(m):d}if(!f.url){d=n.call(m,d,p)}if(d||d===0){i+=d}i+="\n  </ul>\n</div>\n<ul class='endpoints' id='";if(d=f.id){d=d.call(m,{hash:{},data:k})}else{d=m.id;d=typeof d===h?d.apply(m):d}i+=j(d)+"_endpoint_list' style='display:none'>\n\n</ul>\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.response_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n  ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n  <option value="';p=(typeof r===h?r.apply(r):r);if(p||p===0){o+=p}o+='">';p=(typeof r===h?r.apply(r):r);if(p||p===0){o+=p}o+="</option>\n  ";return o}function n(p,o){return'\n  <option value="application/json">application/json</option>\n'}i+='<label for="responseContentType"></label>\n<select name="responseContentType">\n';c=f["if"].call(l,l.produces,{hash:{},inverse:m.program(4,n,j),fn:m.program(1,e,j),data:j});if(c||c===0){i+=c}i+="\n</select>\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.signature=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+='<div>\n<ul class="signature-nav">\n  <li><a class="description-link" href="#">Model</a></li>\n  <li><a class="snippet-link" href="#">Model Schema</a></li>\n</ul>\n<div>\n\n<div class="signature-container">\n  <div class="description">\n    ';if(c=d.signature){c=c.call(k,{hash:{},data:i})}else{c=k.signature;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+='\n  </div>\n\n  <div class="snippet">\n    <pre><code>';if(c=d.sampleJSON){c=c.call(k,{hash:{},data:i})}else{c=k.sampleJSON;c=typeof c===f?c.apply(k):c}g+=h(c)+'</code></pre>\n    <small class="notice"></small>\n  </div>\n</div>\n\n';return g})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.status_code=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+="<td width='15%' class='code'>";if(c=d.code){c=c.call(k,{hash:{},data:i})}else{c=k.code;c=typeof c===f?c.apply(k):c}g+=h(c)+"</td>\n<td>";if(c=d.message){c=c.call(k,{hash:{},data:i})}else{c=k.message;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+="</td>\n<td width='50%'><span class=\"model-signature\" /></td>";return g})})();(function(){var t,k,l,u,x,q,n,m,p,o,j,r,v,s,i,d,b,B,h,g,f,e,c,a,A,z,w={}.hasOwnProperty,y=function(F,D){for(var C in D){if(w.call(D,C)){F[C]=D[C]}}function E(){this.constructor=F}E.prototype=D.prototype;F.prototype=new E();F.__super__=D.prototype;return F};v=(function(D){y(C,D);function C(){s=C.__super__.constructor.apply(this,arguments);return s}C.prototype.dom_id="swagger_ui";C.prototype.options=null;C.prototype.api=null;C.prototype.headerView=null;C.prototype.mainView=null;C.prototype.initialize=function(E){var F=this;if(E==null){E={}}if(E.dom_id!=null){this.dom_id=E.dom_id;delete E.dom_id}if($("#"+this.dom_id)==null){$("body").append('<div id="'+this.dom_id+'"></div>')}this.options=E;this.options.success=function(){return F.render()};this.options.progress=function(G){return F.showMessage(G)};this.options.failure=function(G){if(F.api&&F.api.isValid===false){log("not a valid 2.0 spec, loading legacy client");F.api=new SwaggerApi(F.options);return F.api.build()}else{return F.onLoadFailure(G)}};this.headerView=new u({el:$("#header")});return this.headerView.on("update-swagger-ui",function(G){return F.updateSwaggerUi(G)})};C.prototype.setOption=function(E,F){return this.options[E]=F};C.prototype.getOption=function(E){return this.options[E]};C.prototype.updateSwaggerUi=function(E){this.options.url=E.url;return this.load()};C.prototype.load=function(){var F,E;if((E=this.mainView)!=null){E.clear()}F=this.options.url;if(F.indexOf("http")!==0){F=this.buildUrl(window.location.href.toString(),F)}this.options.url=F;this.headerView.update(F);this.api=new SwaggerClient(this.options);return this.api.build()};C.prototype.render=function(){var E=this;this.showMessage("Finished Loading Resource Information. Rendering Swagger UI...");this.mainView=new x({model:this.api,el:$("#"+this.dom_id),swaggerOptions:this.options}).render();this.showMessage();switch(this.options.docExpansion){case"full":Docs.expandOperationsForResource("");break;case"list":Docs.collapseOperationsForResource("")}if(this.options.onComplete){this.options.onComplete(this.api,this)}return setTimeout(function(){return Docs.shebang()},400)};C.prototype.buildUrl=function(G,E){var F,H;log("base is "+G);if(E.indexOf("/")===0){H=G.split("/");G=H[0]+"//"+H[2];return G+E}else{F=G.length;if(G.indexOf("?")>-1){F=Math.min(F,G.indexOf("?"))}if(G.indexOf("#")>-1){F=Math.min(F,G.indexOf("#"))}G=G.substring(0,F);if(G.indexOf("/",G.length-1)!==-1){return G+E}return G+"/"+E}};C.prototype.showMessage=function(E){if(E==null){E=""}$("#message-bar").removeClass("message-fail");$("#message-bar").addClass("message-success");return $("#message-bar").html(E)};C.prototype.onLoadFailure=function(E){var F;if(E==null){E=""}$("#message-bar").removeClass("message-success");$("#message-bar").addClass("message-fail");F=$("#message-bar").html(E);if(this.options.onFailure!=null){this.options.onFailure(E)}return F};return C})(Backbone.Router);window.SwaggerUi=v;u=(function(D){y(C,D);function C(){i=C.__super__.constructor.apply(this,arguments);return i}C.prototype.events={"click #show-pet-store-icon":"showPetStore","click #show-wordnik-dev-icon":"showWordnikDev","click #explore":"showCustom","keyup #input_baseUrl":"showCustomOnKeyup","keyup #input_apiKey":"showCustomOnKeyup"};C.prototype.initialize=function(){};C.prototype.showPetStore=function(E){return this.trigger("update-swagger-ui",{url:"http://petstore.swagger.wordnik.com/api/api-docs"})};C.prototype.showWordnikDev=function(E){return this.trigger("update-swagger-ui",{url:"http://api.wordnik.com/v4/resources.json"})};C.prototype.showCustomOnKeyup=function(E){if(E.keyCode===13){return this.showCustom()}};C.prototype.showCustom=function(E){if(E!=null){E.preventDefault()}return this.trigger("update-swagger-ui",{url:$("#input_baseUrl").val(),apiKey:$("#input_apiKey").val()})};C.prototype.update=function(F,G,E){if(E==null){E=false}$("#input_baseUrl").val(F);if(E){return this.trigger("update-swagger-ui",{url:F})}};return C})(Backbone.View);x=(function(C){var D;y(E,C);function E(){h=E.__super__.constructor.apply(this,arguments);return h}D={alpha:function(G,F){return G.path.localeCompare(F.path)},method:function(G,F){return G.method.localeCompare(F.method)}};E.prototype.initialize=function(J){var I,H,G,F,K,L;if(J==null){J={}}this.model.auths=[];L=this.model.securityDefinitions;for(H in L){K=L[H];I={name:H,type:K.type,value:K};this.model.auths.push(I)}if(this.model.info&&this.model.info.license&&typeof this.model.info.license==="string"){G=this.model.info.license;F=this.model.info.licenseUrl;this.model.info.license={};this.model.info.license.name=G;this.model.info.license.url=F}if(!this.model.info){this.model.info={}}if(!this.model.info.version){this.model.info.version=this.model.apiVersion}if(this.model.swaggerVersion==="2.0"){if("validatorUrl" in J.swaggerOptions){return this.model.validatorUrl=J.swaggerOptions.validatorUrl}else{if(this.model.url.match(/https?:\/\/localhost/)){return this.model.validatorUrl=this.model.url}else{return this.model.validatorUrl="http://online.swagger.io/validator"}}}};E.prototype.render=function(){var K,N,F,H,G,L,I,M,O,J;if(this.model.securityDefinitions){for(G in this.model.securityDefinitions){K=this.model.securityDefinitions[G];if(K.type==="apiKey"&&$("#apikey_button").length===0){N=new t({model:K}).render().el;$(".auth_main_container").append(N)}if(K.type==="basicAuth"&&$("#basic_auth_button").length===0){N=new k({model:K}).render().el;$(".auth_main_container").append(N)}}}$(this.el).html(Handlebars.templates.main(this.model));I={};F=0;J=this.model.apisArray;for(M=0,O=J.length;M<O;M++){L=J[M];H=L.name;while(typeof I[H]!=="undefined"){H=H+"_"+F;F+=1}L.id=H;I[H]=L;this.addResource(L,this.model.auths)}return this};E.prototype.addResource=function(H,G){var F;H.id=H.id.replace(/\s/g,"_");F=new p({model:H,tagName:"li",id:"resource_"+H.id,className:"resource",auths:G,swaggerOptions:this.options.swaggerOptions});return $("#resources").append(F.render().el)};E.prototype.clear=function(){return $(this.el).html("")};return E})(Backbone.View);p=(function(D){y(C,D);function C(){g=C.__super__.constructor.apply(this,arguments);return g}C.prototype.initialize=function(E){if(E==null){E={}}this.auths=E.auths;if(""===this.model.description){return this.model.description=null}};C.prototype.render=function(){var F,K,H,G,I,E,J;$(this.el).html(Handlebars.templates.resource(this.model));H={};if(this.model.description){this.model.summary=this.model.description}J=this.model.operationsArray;for(I=0,E=J.length;I<E;I++){G=J[I];F=0;K=G.nickname;while(typeof H[K]!=="undefined"){K=K+"_"+F;F+=1}H[K]=G;G.nickname=K;G.parentId=this.model.id;this.addOperation(G)}$(".toggleEndpointList",this.el).click(this.callDocs.bind(this,"toggleEndpointListForResource"));$(".collapseResource",this.el).click(this.callDocs.bind(this,"collapseOperationsForResource"));$(".expandResource",this.el).click(this.callDocs.bind(this,"expandOperationsForResource"));return this};C.prototype.addOperation=function(E){var F;E.number=this.number;F=new q({model:E,tagName:"li",className:"endpoint",swaggerOptions:this.options.swaggerOptions,auths:this.auths});$(".endpoints",$(this.el)).append(F.render().el);return this.number++};C.prototype.callDocs=function(F,E){E.preventDefault();return Docs[F](E.currentTarget.getAttribute("data-id"))};return C})(Backbone.View);q=(function(D){y(C,D);function C(){f=C.__super__.constructor.apply(this,arguments);return f}C.prototype.invocationUrl=null;C.prototype.events={"submit .sandbox":"submitOperation","click .submit":"submitOperation","click .response_hider":"hideResponse","click .toggleOperation":"toggleOperationContent","mouseenter .api-ic":"mouseEnter","mouseout .api-ic":"mouseExit"};C.prototype.initialize=function(E){if(E==null){E={}}this.auths=E.auths;return this};C.prototype.mouseEnter=function(J){var H,I,M,F,E,N,K,G,O,L;H=$(J.currentTarget.parentNode).find("#api_information_panel");O=J.pageX;L=J.pageY;N=$(window).scrollLeft();K=$(window).scrollTop();F=N+$(window).width();E=K+$(window).height();G=H.width();I=H.height();if(O+G>F){O=F-G}if(O<N){O=N}if(L+I>E){L=E-I}if(L<K){L=K}M={};M.top=L;M.left=O;H.css(M);return $(J.currentTarget.parentNode).find("#api_information_panel").show()};C.prototype.mouseExit=function(E){return $(E.currentTarget.parentNode).find("#api_information_panel").hide()};C.prototype.render=function(){var al,R,aj,F,W,V,af,S,ab,H,Z,G,U,X,ad,ak,E,ao,Y,aa,ai,ah,ag,ae,T,N,L,J,I,ac,an,am,Q,P,O,M,K;V=true;if(!V){this.model.isReadOnly=true}this.model.description=this.model.description||this.model.notes;if(this.model.description){this.model.description=this.model.description.replace(/(?:\r\n|\r|\n)/g,"<br />")}this.model.oauth=null;if(this.model.authorizations){if(Array.isArray(this.model.authorizations)){Q=this.model.authorizations;for(ai=0,T=Q.length;ai<T;ai++){aj=Q[ai];for(S in aj){R=aj[S];for(al in this.auths){R=this.auths[al];if(R.type==="oauth2"){this.model.oauth={};this.model.oauth.scopes=[];P=R.value.scopes;for(af in P){Y=P[af];ab={scope:af,description:Y};this.model.oauth.scopes.push(ab)}}}}}}else{O=this.model.authorizations;for(af in O){Y=O[af];if(af==="oauth2"){if(this.model.oauth===null){this.model.oauth={}}if(this.model.oauth.scopes===void 0){this.model.oauth.scopes=[]}for(ah=0,N=Y.length;ah<N;ah++){ab=Y[ah];this.model.oauth.scopes.push(ab)}}}}}if(typeof this.model.responses!=="undefined"){this.model.responseMessages=[];M=this.model.responses;for(F in M){aa=M[F];X=null;ad=this.model.responses[F].schema;if(ad&&ad["$ref"]){X=ad["$ref"];if(X.indexOf("#/definitions/")===0){X=X.substring("#/definitions/".length)}}this.model.responseMessages.push({code:F,message:aa.description,responseModel:X})}}if(typeof this.model.responseMessages==="undefined"){this.model.responseMessages=[]}$(this.el).html(Handlebars.templates.operation(this.model));if(this.model.responseClassSignature&&this.model.responseClassSignature!=="string"){ak={sampleJSON:this.model.responseSampleJSON,isParam:false,signature:this.model.responseClassSignature};U=new j({model:ak,tagName:"div"});$(".model-signature",$(this.el)).append(U.render().el)}else{this.model.responseClassSignature="string";$(".model-signature",$(this.el)).html(this.model.type)}W={isParam:false};W.consumes=this.model.consumes;W.produces=this.model.produces;K=this.model.parameters;for(ag=0,L=K.length;ag<L;ag++){H=K[ag];ao=H.type||H.dataType;if(typeof ao==="undefined"){X=H.schema;if(X&&X["$ref"]){Z=X["$ref"];if(Z.indexOf("#/definitions/")===0){ao=Z.substring("#/definitions/".length)}else{ao=Z}}}if(ao&&ao.toLowerCase()==="file"){if(!W.consumes){W.consumes="multipart/form-data"}}H.type=ao}G=new o({model:W});$(".response-content-type",$(this.el)).append(G.render().el);an=this.model.parameters;for(ae=0,J=an.length;ae<J;ae++){H=an[ae];this.addParameter(H,W.consumes)}am=this.model.responseMessages;for(ac=0,I=am.length;ac<I;ac++){E=am[ac];this.addStatusCode(E)}return this};C.prototype.addParameter=function(G,E){var F;G.consumes=E;F=new m({model:G,tagName:"tr",readOnly:this.model.isReadOnly});return $(".operation-params",$(this.el)).append(F.render().el)};C.prototype.addStatusCode=function(F){var E;E=new r({model:F,tagName:"tr"});return $(".operation-status",$(this.el)).append(E.render().el)};C.prototype.submitOperation=function(S){var U,K,R,H,M,E,N,Q,P,O,T,J,G,L,I,F;if(S!=null){S.preventDefault()}K=$(".sandbox",$(this.el));U=true;K.find("input.required").each(function(){var V=this;$(this).removeClass("error");if(jQuery.trim($(this).val())===""){$(this).addClass("error");$(this).wiggle({callback:function(){return $(V).focus()}});return U=false}});if(U){H={};E={parent:this};R=false;L=K.find("input");for(Q=0,T=L.length;Q<T;Q++){M=L[Q];if((M.value!=null)&&jQuery.trim(M.value).length>0){H[M.name]=M.value}if(M.type==="file"){R=true}}I=K.find("textarea");for(P=0,J=I.length;P<J;P++){M=I[P];if((M.value!=null)&&jQuery.trim(M.value).length>0){H[M.name]=M.value}}F=K.find("select");for(O=0,G=F.length;O<G;O++){M=F[O];N=this.getSelectedValue(M);if((N!=null)&&jQuery.trim(N).length>0){H[M.name]=N}}E.responseContentType=$("div select[name=responseContentType]",$(this.el)).val();E.requestContentType=$("div select[name=parameterContentType]",$(this.el)).val();$(".response_throbber",$(this.el)).show();if(R){return this.handleFileUpload(H,K)}else{return this.model["do"](H,E,this.showCompleteStatus,this.showErrorStatus,this)}}};C.prototype.success=function(E,F){return F.showCompleteStatus(E)};C.prototype.handleFileUpload=function(V,M){var Q,L,G,R,P,O,T,N,K,J,H,U,Y,X,W,I,F,E,Z,S=this;I=M.serializeArray();for(N=0,U=I.length;N<U;N++){R=I[N];if((R.value!=null)&&jQuery.trim(R.value).length>0){V[R.name]=R.value}}Q=new FormData();T=0;F=this.model.parameters;for(K=0,Y=F.length;K<Y;K++){O=F[K];if(O.paramType==="form"){if(O.type.toLowerCase()!=="file"&&V[O.name]!==void 0){Q.append(O.name,V[O.name])}}}G={};E=this.model.parameters;for(J=0,X=E.length;J<X;J++){O=E[J];if(O.paramType==="header"){G[O.name]=V[O.name]}}Z=M.find('input[type~="file"]');for(H=0,W=Z.length;H<W;H++){L=Z[H];if(typeof L.files[0]!=="undefined"){Q.append($(L).attr("name"),L.files[0]);T+=1}}this.invocationUrl=this.model.supportHeaderParams()?(G=this.model.getHeaderParams(V),this.model.urlify(V,false)):this.model.urlify(V,true);$(".request_url",$(this.el)).html("<pre></pre>");$(".request_url pre",$(this.el)).text(this.invocationUrl);P={type:this.model.method,url:this.invocationUrl,headers:G,data:Q,dataType:"json",contentType:false,processData:false,error:function(ab,ac,aa){return S.showErrorStatus(S.wrap(ab),S)},success:function(aa){return S.showResponse(aa,S)},complete:function(aa){return S.showCompleteStatus(S.wrap(aa),S)}};if(window.authorizations){window.authorizations.apply(P)}if(T===0){P.data.append("fake","true")}jQuery.ajax(P);return false};C.prototype.wrap=function(I){var G,J,L,F,K,H,E;L={};J=I.getAllResponseHeaders().split("\r");for(H=0,E=J.length;H<E;H++){F=J[H];G=F.split(":");if(G[0]!==void 0&&G[1]!==void 0){L[G[0].trim()]=G[1].trim()}}K={};K.content={};K.content.data=I.responseText;K.headers=L;K.request={};K.request.url=this.invocationUrl;K.status=I.status;return K};C.prototype.getSelectedValue=function(E){var H,G,J,F,I;if(!E.multiple){return E.value}else{G=[];I=E.options;for(J=0,F=I.length;J<F;J++){H=I[J];if(H.selected){G.push(H.value)}}if(G.length>0){return G}else{return null}}};C.prototype.hideResponse=function(E){if(E!=null){E.preventDefault()}$(".response",$(this.el)).slideUp();return $(".response_hider",$(this.el)).fadeOut()};C.prototype.showResponse=function(E){var F;F=JSON.stringify(E,null,"\t").replace(/\n/g,"<br>");return $(".response_body",$(this.el)).html(escape(F))};C.prototype.showErrorStatus=function(F,E){return E.showStatus(F)};C.prototype.showCompleteStatus=function(F,E){return E.showStatus(F)};C.prototype.formatXml=function(L){var H,K,F,M,R,N,G,E,P,Q,J,I,O;E=/(>)(<)(\/*)/g;Q=/[ ]*(.*)[ ]+\n/g;H=/(<.+>)(.+\n)/g;L=L.replace(E,"$1\n$2$3").replace(Q,"$1\n").replace(H,"$1\n$2");G=0;K="";R=L.split("\n");F=0;M="other";P={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0};J=function(X){var T,S,V,Z,W,U,Y;U={single:Boolean(X.match(/<.+\/>/)),closing:Boolean(X.match(/<\/.+>/)),opening:Boolean(X.match(/<[^!?].*>/))};W=((function(){var aa;aa=[];for(V in U){Y=U[V];if(Y){aa.push(V)}}return aa})())[0];W=W===void 0?"other":W;T=M+"->"+W;M=W;Z="";F+=P[T];Z=((function(){var ab,ac,aa;aa=[];for(S=ab=0,ac=F;0<=ac?ab<ac:ab>ac;S=0<=ac?++ab:--ab){aa.push("  ")}return aa})()).join("");if(T==="opening->closing"){return K=K.substr(0,K.length-1)+X+"\n"}else{return K+=Z+X+"\n"}};for(I=0,O=R.length;I<O;I++){N=R[I];J(N)}return K};C.prototype.showStatus=function(J){var G,N,P,M,H,Q,E,I,L,K,F;if(J.content===void 0){N=J.data;F=J.url}else{N=J.content.data;F=J.request.url}H=J.headers;P=null;if(H){P=H["Content-Type"]||H["content-type"];if(P){P=P.split(";")[0].trim()}}if(!N){G=$("<code />").text("no content");I=$('<pre class="json" />').append(G)}else{if(P==="application/json"||/\+json$/.test(P)){Q=null;try{Q=JSON.stringify(JSON.parse(N),null,"  ")}catch(O){M=O;Q="can't parse JSON.  Raw result:\n\n"+N}G=$("<code />").text(Q);I=$('<pre class="json" />').append(G)}else{if(P==="application/xml"||/\+xml$/.test(P)){G=$("<code />").text(this.formatXml(N));I=$('<pre class="xml" />').append(G)}else{if(P==="text/html"){G=$("<code />").html(_.escape(N));I=$('<pre class="xml" />').append(G)}else{if(/^image\//.test(P)){I=$("<img>").attr("src",F)}else{G=$("<code />").text(N);I=$('<pre class="json" />').append(G)}}}}}L=I;$(".request_url",$(this.el)).html("<pre></pre>");$(".request_url pre",$(this.el)).text(F);$(".response_code",$(this.el)).html("<pre>"+J.status+"</pre>");$(".response_body",$(this.el)).html(L);$(".response_headers",$(this.el)).html("<pre>"+_.escape(JSON.stringify(J.headers,null,"  ")).replace(/\n/g,"<br>")+"</pre>");$(".response",$(this.el)).slideDown();$(".response_hider",$(this.el)).show();$(".response_throbber",$(this.el)).hide();K=$(".response_body",$(this.el))[0];E=this.options.swaggerOptions;if(E.highlightSizeThreshold&&J.data.length>E.highlightSizeThreshold){return K}else{return hljs.highlightBlock(K)}};C.prototype.toggleOperationContent=function(){var E;E=$("#"+Docs.escapeResourceName(this.model.parentId)+"_"+this.model.nickname+"_content");if(E.is(":visible")){return Docs.collapseOperation(E)}else{return Docs.expandOperation(E)}};return C})(Backbone.View);r=(function(D){y(C,D);function C(){e=C.__super__.constructor.apply(this,arguments);return e}C.prototype.initialize=function(){};C.prototype.render=function(){var F,E,G;G=this.template();$(this.el).html(G(this.model));if(swaggerUi.api.models.hasOwnProperty(this.model.responseModel)){F={sampleJSON:JSON.stringify(swaggerUi.api.models[this.model.responseModel].createJSONSample(),null,2),isParam:false,signature:swaggerUi.api.models[this.model.responseModel].getMockSignature()};E=new j({model:F,tagName:"div"});$(".model-signature",this.$el).append(E.render().el)}else{$(".model-signature",this.$el).html("")}return this};C.prototype.template=function(){return Handlebars.templates.status_code};return C})(Backbone.View);m=(function(D){y(C,D);function C(){c=C.__super__.constructor.apply(this,arguments);return c}C.prototype.initialize=function(){return Handlebars.registerHelper("isArray",function(F,E){if(F.type.toLowerCase()==="array"||F.allowMultiple){return E.fn(this)}else{return E.inverse(this)}})};C.prototype.render=function(){var E,F,I,G,J,H,M,N,L,K;K=this.model.type||this.model.dataType;if(typeof K==="undefined"){H=this.model.schema;if(H&&H["$ref"]){G=H["$ref"];if(G.indexOf("#/definitions/")===0){K=G.substring("#/definitions/".length)}else{K=G}}}this.model.type=K;this.model.paramType=this.model["in"]||this.model.paramType;if(this.model.paramType==="body"){this.model.isBody=true}if(K&&K.toLowerCase()==="file"){this.model.isFile=true}this.model["default"]=this.model["default"]||this.model.defaultValue;L=this.template();$(this.el).html(L(this.model));M={sampleJSON:this.model.sampleJSON,isParam:true,signature:this.model.signature};if(this.model.sampleJSON){N=new j({model:M,tagName:"div"});$(".model-signature",$(this.el)).append(N.render().el)}else{$(".model-signature",$(this.el)).html(this.model.signature)}F=false;if(this.model.isBody){F=true}E={isParam:F};E.consumes=this.model.consumes;if(F){I=new n({model:E});$(".parameter-content-type",$(this.el)).append(I.render().el)}else{J=new o({model:E});$(".response-content-type",$(this.el)).append(J.render().el)}return this};C.prototype.template=function(){if(this.model.isList){return Handlebars.templates.param_list}else{if(this.options.readOnly){if(this.model.required){return Handlebars.templates.param_readonly_required}else{return Handlebars.templates.param_readonly}}else{if(this.model.required){return Handlebars.templates.param_required}else{return Handlebars.templates.param}}}};return C})(Backbone.View);j=(function(D){y(C,D);function C(){a=C.__super__.constructor.apply(this,arguments);return a}C.prototype.events={"click a.description-link":"switchToDescription","click a.snippet-link":"switchToSnippet","mousedown .snippet":"snippetToTextArea"};C.prototype.initialize=function(){};C.prototype.render=function(){var E;E=this.template();$(this.el).html(E(this.model));this.switchToSnippet();this.isParam=this.model.isParam;if(this.isParam){$(".notice",$(this.el)).text("Click to set as parameter value")}return this};C.prototype.template=function(){return Handlebars.templates.signature};C.prototype.switchToDescription=function(E){if(E!=null){E.preventDefault()}$(".snippet",$(this.el)).hide();$(".description",$(this.el)).show();$(".description-link",$(this.el)).addClass("selected");return $(".snippet-link",$(this.el)).removeClass("selected")};C.prototype.switchToSnippet=function(E){if(E!=null){E.preventDefault()}$(".description",$(this.el)).hide();$(".snippet",$(this.el)).show();$(".snippet-link",$(this.el)).addClass("selected");return $(".description-link",$(this.el)).removeClass("selected")};C.prototype.snippetToTextArea=function(E){var F;if(this.isParam){if(E!=null){E.preventDefault()}F=$("textarea",$(this.el.parentNode.parentNode.parentNode));if($.trim(F.val())===""){return F.val(this.model.sampleJSON)}}};return C})(Backbone.View);l=(function(C){y(D,C);function D(){A=D.__super__.constructor.apply(this,arguments);return A}D.prototype.initialize=function(){};D.prototype.render=function(){var E;E=this.template();$(this.el).html(E(this.model));$("label[for=contentType]",$(this.el)).text("Response Content Type");return this};D.prototype.template=function(){return Handlebars.templates.content_type};return D})(Backbone.View);o=(function(C){y(D,C);function D(){z=D.__super__.constructor.apply(this,arguments);return z}D.prototype.initialize=function(){};D.prototype.render=function(){var E;E=this.template();$(this.el).html(E(this.model));$("label[for=responseContentType]",$(this.el)).text("Response Content Type");return this};D.prototype.template=function(){return Handlebars.templates.response_content_type};return D})(Backbone.View);n=(function(D){y(C,D);function C(){d=C.__super__.constructor.apply(this,arguments);return d}C.prototype.initialize=function(){};C.prototype.render=function(){var E;E=this.template();$(this.el).html(E(this.model));$("label[for=parameterContentType]",$(this.el)).text("Parameter content type:");return this};C.prototype.template=function(){return Handlebars.templates.parameter_content_type};return C})(Backbone.View);t=(function(D){y(C,D);function C(){b=C.__super__.constructor.apply(this,arguments);return b}C.prototype.initialize=function(){};C.prototype.render=function(){var E;E=this.template();$(this.el).html(E(this.model));return this};C.prototype.events={"click #apikey_button":"toggleApiKeyContainer","click #apply_api_key":"applyApiKey"};C.prototype.applyApiKey=function(){var E;window.authorizations.add(this.model.name,new ApiKeyAuthorization(this.model.name,$("#input_apiKey_entry").val(),this.model["in"]));window.swaggerUi.load();return E=$("#apikey_container").show()};C.prototype.toggleApiKeyContainer=function(){var E;if($("#apikey_container").length>0){E=$("#apikey_container").first();if(E.is(":visible")){return E.hide()}else{$(".auth_container").hide();return E.show()}}};C.prototype.template=function(){return Handlebars.templates.apikey_button_view};return C})(Backbone.View);k=(function(D){y(C,D);function C(){B=C.__super__.constructor.apply(this,arguments);return B}C.prototype.initialize=function(){};C.prototype.render=function(){var E;E=this.template();$(this.el).html(E(this.model));return this};C.prototype.events={"click #basic_auth_button":"togglePasswordContainer","click #apply_basic_auth":"applyPassword"};C.prototype.applyPassword=function(){var F,E,G;console.log("applying password");G=$(".input_username").val();E=$(".input_password").val();window.authorizations.add(this.model.type,new PasswordAuthorization("basic",G,E));window.swaggerUi.load();return F=$("#basic_auth_container").hide()};C.prototype.togglePasswordContainer=function(){var E;if($("#basic_auth_container").length>0){E=$("#basic_auth_container").show();if(E.is(":visible")){return E.slideUp()}else{$(".auth_container").hide();return E.show()}}};C.prototype.template=function(){return Handlebars.templates.basic_auth_button_view};return C})(Backbone.View)}).call(this);
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/css/adminstyle.css
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/css/adminstyle.css	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/css/adminstyle.css	(revision 5961)
@@ -0,0 +1,28 @@
+div.links {
+    width: 100%;
+}
+
+div.container {
+	width: 100%;
+}
+
+div.treeView {
+    float: left;
+    width: 300px;
+    max-height: 700px;
+    overflow: auto;
+}
+
+div.infoView {
+    margin: 20px 0px 0px 300px;
+}
+
+textArea.contentTextArea {
+	   width: 100%;
+	   height: 500px;
+}
+
+textArea.descriptionTextArea {
+       width: 100%;
+       height: 200px;
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/documentation.jsp
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/documentation.jsp	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/documentation.jsp	(revision 5961)
@@ -0,0 +1,7 @@
+
+<?xml version="1.0" encoding="UTF-8" ?>
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%
+String redirectURL = application.getInitParameter("eu.clarin.cmdi.componentregistry.documentationUrl");
+response.sendRedirect(redirectURL);
+%>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/history.css
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/history.css	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/history.css	(revision 5961)
@@ -0,0 +1,6 @@
+/* This CSS stylesheet defines styles used by required elements in a flex application page that supports browser history */
+
+#ie_historyFrame { width: 0px; height: 0px; display:none }
+#firefox_anchorDiv { width: 0px; height: 0px; display:none }
+#safari_formDiv { width: 0px; height: 0px; display:none }
+#safari_rememberDiv { width: 0px; height: 0px; display:none }
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/history.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/history.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/history.js	(revision 5961)
@@ -0,0 +1,662 @@
+BrowserHistoryUtils = {
+    addEvent: function(elm, evType, fn, useCapture) {
+        useCapture = useCapture || false;
+        if (elm.addEventListener) {
+            elm.addEventListener(evType, fn, useCapture);
+            return true;
+        }
+        else if (elm.attachEvent) {
+            var r = elm.attachEvent('on' + evType, fn);
+            return r;
+        }
+        else {
+            elm['on' + evType] = fn;
+        }
+    }
+}
+
+BrowserHistory = (function() {
+    // type of browser
+    var browser = {
+        ie: false, 
+        firefox: false, 
+        safari: false, 
+        opera: false, 
+        version: -1
+    };
+
+    // if setDefaultURL has been called, our first clue
+    // that the SWF is ready and listening
+    //var swfReady = false;
+
+    // the URL we'll send to the SWF once it is ready
+    //var pendingURL = '';
+
+    // Default app state URL to use when no fragment ID present
+    var defaultHash = '';
+
+    // Last-known app state URL
+    var currentHref = document.location.href;
+
+    // Initial URL (used only by IE)
+    var initialHref = document.location.href;
+
+    // Initial URL (used only by IE)
+    var initialHash = document.location.hash;
+
+    // History frame source URL prefix (used only by IE)
+    var historyFrameSourcePrefix = 'history/historyFrame.html?';
+
+    // History maintenance (used only by Safari)
+    var currentHistoryLength = -1;
+
+    var historyHash = [];
+
+    var initialState = createState(initialHref, initialHref + '#' + initialHash, initialHash);
+
+    var backStack = [];
+    var forwardStack = [];
+
+    var currentObjectId = null;
+
+    //UserAgent detection
+    var useragent = navigator.userAgent.toLowerCase();
+
+    if (useragent.indexOf("opera") != -1) {
+        browser.opera = true;
+    } else if (useragent.indexOf("msie") != -1) {
+        browser.ie = true;
+        browser.version = parseFloat(useragent.substring(useragent.indexOf('msie') + 4));
+    } else if (useragent.indexOf("safari") != -1) {
+        browser.safari = true;
+        browser.version = parseFloat(useragent.substring(useragent.indexOf('safari') + 7));
+    } else if (useragent.indexOf("gecko") != -1) {
+        browser.firefox = true;
+    }
+
+    if (browser.ie == true && browser.version == 7) {
+        window["_ie_firstload"] = false;
+    }
+
+    // Accessor functions for obtaining specific elements of the page.
+    function getHistoryFrame()
+    {
+        return document.getElementById('ie_historyFrame');
+    }
+
+    function getAnchorElement()
+    {
+        return document.getElementById('firefox_anchorDiv');
+    }
+
+    function getFormElement()
+    {
+        return document.getElementById('safari_formDiv');
+    }
+
+    function getRememberElement()
+    {
+        return document.getElementById("safari_remember_field");
+    }
+
+    // Get the Flash player object for performing ExternalInterface callbacks.
+    // Updated for changes to SWFObject2.
+    function getPlayer(id) {
+		if (id && document.getElementById(id)) {
+			var r = document.getElementById(id);
+			if (typeof r.SetVariable != "undefined") {
+				return r;
+			}
+			else {
+				var o = r.getElementsByTagName("object");
+				var e = r.getElementsByTagName("embed");
+				if (o.length > 0 && typeof o[0].SetVariable != "undefined") {
+					return o[0];
+				}
+				else if (e.length > 0 && typeof e[0].SetVariable != "undefined") {
+					return e[0];
+				}
+			}
+		}
+		else {
+			var o = document.getElementsByTagName("object");
+			var e = document.getElementsByTagName("embed");
+			if (e.length > 0 && typeof e[0].SetVariable != "undefined") {
+				return e[0];
+			}
+			else if (o.length > 0 && typeof o[0].SetVariable != "undefined") {
+				return o[0];
+			}
+			else if (o.length > 1 && typeof o[1].SetVariable != "undefined") {
+				return o[1];
+			}
+		}
+		return undefined;
+	}
+    
+    function getPlayers() {
+        var players = [];
+        if (players.length == 0) {
+            var tmp = document.getElementsByTagName('object');
+            players = tmp;
+        }
+        
+        if (players.length == 0 || players[0].object == null) {
+            var tmp = document.getElementsByTagName('embed');
+            players = tmp;
+        }
+        return players;
+    }
+
+	function getIframeHash() {
+		var doc = getHistoryFrame().contentWindow.document;
+		var hash = String(doc.location.search);
+		if (hash.length == 1 && hash.charAt(0) == "?") {
+			hash = "";
+		}
+		else if (hash.length >= 2 && hash.charAt(0) == "?") {
+			hash = hash.substring(1);
+		}
+		return hash;
+	}
+
+    /* Get the current location hash excluding the '#' symbol. */
+    function getHash() {
+       // It would be nice if we could use document.location.hash here,
+       // but it's faulty sometimes.
+       var idx = document.location.href.indexOf('#');
+       return (idx >= 0) ? document.location.href.substr(idx+1) : '';
+    }
+
+    /* Get the current location hash excluding the '#' symbol. */
+    function setHash(hash) {
+       // It would be nice if we could use document.location.hash here,
+       // but it's faulty sometimes.
+       if (hash == '') hash = '#'
+       document.location.hash = hash;
+    }
+
+    function createState(baseUrl, newUrl, flexAppUrl) {
+        return { 'baseUrl': baseUrl, 'newUrl': newUrl, 'flexAppUrl': flexAppUrl, 'title': null };
+    }
+
+    /* Add a history entry to the browser.
+     *   baseUrl: the portion of the location prior to the '#'
+     *   newUrl: the entire new URL, including '#' and following fragment
+     *   flexAppUrl: the portion of the location following the '#' only
+     */
+    function addHistoryEntry(baseUrl, newUrl, flexAppUrl) {
+
+        //delete all the history entries
+        forwardStack = [];
+
+        if (browser.ie) {
+            //Check to see if we are being asked to do a navigate for the first
+            //history entry, and if so ignore, because it's coming from the creation
+            //of the history iframe
+            if (flexAppUrl == defaultHash && document.location.href == initialHref && window['_ie_firstload']) {
+                currentHref = initialHref;
+                return;
+            }
+            if ((!flexAppUrl || flexAppUrl == defaultHash) && window['_ie_firstload']) {
+                newUrl = baseUrl + '#' + defaultHash;
+                flexAppUrl = defaultHash;
+            } else {
+                // for IE, tell the history frame to go somewhere without a '#'
+                // in order to get this entry into the browser history.
+                getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl;
+            }
+            setHash(flexAppUrl);
+        } else {
+
+            //ADR
+            if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) {
+                initialState = createState(baseUrl, newUrl, flexAppUrl);
+            } else if(backStack.length > 0 && backStack[backStack.length - 1].flexAppUrl == flexAppUrl) {
+                backStack[backStack.length - 1] = createState(baseUrl, newUrl, flexAppUrl);
+            }
+
+            if (browser.safari) {
+                // for Safari, submit a form whose action points to the desired URL
+                if (browser.version <= 419.3) {
+                    var file = window.location.pathname.toString();
+                    file = file.substring(file.lastIndexOf("/")+1);
+                    getFormElement().innerHTML = '<form name="historyForm" action="'+file+'#' + flexAppUrl + '" method="GET"></form>';
+                    //get the current elements and add them to the form
+                    var qs = window.location.search.substring(1);
+                    var qs_arr = qs.split("&");
+                    for (var i = 0; i < qs_arr.length; i++) {
+                        var tmp = qs_arr[i].split("=");
+                        var elem = document.createElement("input");
+                        elem.type = "hidden";
+                        elem.name = tmp[0];
+                        elem.value = tmp[1];
+                        document.forms.historyForm.appendChild(elem);
+                    }
+                    document.forms.historyForm.submit();
+                } else {
+                    top.location.hash = flexAppUrl;
+                }
+                // We also have to maintain the history by hand for Safari
+                historyHash[history.length] = flexAppUrl;
+                _storeStates();
+            } else {
+                // Otherwise, write an anchor into the page and tell the browser to go there
+                addAnchor(flexAppUrl);
+                setHash(flexAppUrl);
+            }
+        }
+        backStack.push(createState(baseUrl, newUrl, flexAppUrl));
+    }
+
+    function _storeStates() {
+        if (browser.safari) {
+            getRememberElement().value = historyHash.join(",");
+        }
+    }
+
+    function handleBackButton() {
+        //The "current" page is always at the top of the history stack.
+        var current = backStack.pop();
+        if (!current) { return; }
+        var last = backStack[backStack.length - 1];
+        if (!last && backStack.length == 0){
+            last = initialState;
+        }
+        forwardStack.push(current);
+    }
+
+    function handleForwardButton() {
+        //summary: private method. Do not call this directly.
+
+        var last = forwardStack.pop();
+        if (!last) { return; }
+        backStack.push(last);
+    }
+
+    function handleArbitraryUrl() {
+        //delete all the history entries
+        forwardStack = [];
+    }
+
+    /* Called periodically to poll to see if we need to detect navigation that has occurred */
+    function checkForUrlChange() {
+
+        if (browser.ie) {
+            if (currentHref != document.location.href && currentHref + '#' != document.location.href) {
+                //This occurs when the user has navigated to a specific URL
+                //within the app, and didn't use browser back/forward
+                //IE seems to have a bug where it stops updating the URL it
+                //shows the end-user at this point, but programatically it
+                //appears to be correct.  Do a full app reload to get around
+                //this issue.
+                if (browser.version < 7) {
+                    currentHref = document.location.href;
+                    document.location.reload();
+                } else {
+					if (getHash() != getIframeHash()) {
+						// this.iframe.src = this.blankURL + hash;
+						var sourceToSet = historyFrameSourcePrefix + getHash();
+						getHistoryFrame().src = sourceToSet;
+					}
+                }
+            }
+        }
+
+        if (browser.safari) {
+            // For Safari, we have to check to see if history.length changed.
+            if (currentHistoryLength >= 0 && history.length != currentHistoryLength) {
+                //alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|"));
+                // If it did change, then we have to look the old state up
+                // in our hand-maintained array since document.location.hash
+                // won't have changed, then call back into BrowserManager.
+                currentHistoryLength = history.length;
+                var flexAppUrl = historyHash[currentHistoryLength];
+                if (flexAppUrl == '') {
+                    //flexAppUrl = defaultHash;
+                }
+                //ADR: to fix multiple
+                if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {
+                    var pl = getPlayers();
+                    for (var i = 0; i < pl.length; i++) {
+                        pl[i].browserURLChange(flexAppUrl);
+                    }
+                } else {
+                    getPlayer().browserURLChange(flexAppUrl);
+                }
+                _storeStates();
+            }
+        }
+        if (browser.firefox) {
+            if (currentHref != document.location.href) {
+                var bsl = backStack.length;
+
+                var urlActions = {
+                    back: false, 
+                    forward: false, 
+                    set: false
+                }
+
+                if ((window.location.hash == initialHash || window.location.href == initialHref) && (bsl == 1)) {
+                    urlActions.back = true;
+                    // FIXME: could this ever be a forward button?
+                    // we can't clear it because we still need to check for forwards. Ugg.
+                    // clearInterval(this.locationTimer);
+                    handleBackButton();
+                }
+                
+                // first check to see if we could have gone forward. We always halt on
+                // a no-hash item.
+                if (forwardStack.length > 0) {
+                    if (forwardStack[forwardStack.length-1].flexAppUrl == getHash()) {
+                        urlActions.forward = true;
+                        handleForwardButton();
+                    }
+                }
+
+                // ok, that didn't work, try someplace back in the history stack
+                if ((bsl >= 2) && (backStack[bsl - 2])) {
+                    if (backStack[bsl - 2].flexAppUrl == getHash()) {
+                        urlActions.back = true;
+                        handleBackButton();
+                    }
+                }
+                
+                if (!urlActions.back && !urlActions.forward) {
+                    var foundInStacks = {
+                        back: -1, 
+                        forward: -1
+                    }
+
+                    for (var i = 0; i < backStack.length; i++) {
+                        if (backStack[i].flexAppUrl == getHash() && i != (bsl - 2)) {
+                            arbitraryUrl = true;
+                            foundInStacks.back = i;
+                        }
+                    }
+                    for (var i = 0; i < forwardStack.length; i++) {
+                        if (forwardStack[i].flexAppUrl == getHash() && i != (bsl - 2)) {
+                            arbitraryUrl = true;
+                            foundInStacks.forward = i;
+                        }
+                    }
+                    handleArbitraryUrl();
+                }
+
+                // Firefox changed; do a callback into BrowserManager to tell it.
+                currentHref = document.location.href;
+                var flexAppUrl = getHash();
+                if (flexAppUrl == '') {
+                    //flexAppUrl = defaultHash;
+                }
+                //ADR: to fix multiple
+                if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {
+                    var pl = getPlayers();
+                    for (var i = 0; i < pl.length; i++) {
+                        pl[i].browserURLChange(flexAppUrl);
+                    }
+                } else {
+                    getPlayer().browserURLChange(flexAppUrl);
+                }
+            }
+        }
+        //setTimeout(checkForUrlChange, 50);
+    }
+
+    /* Write an anchor into the page to legitimize it as a URL for Firefox et al. */
+    function addAnchor(flexAppUrl)
+    {
+       if (document.getElementsByName(flexAppUrl).length == 0) {
+           getAnchorElement().innerHTML += "<a name='" + flexAppUrl + "'>" + flexAppUrl + "</a>";
+       }
+    }
+
+    var _initialize = function () {
+        if (browser.ie)
+        {
+            var scripts = document.getElementsByTagName('script');
+            for (var i = 0, s; s = scripts[i]; i++) {
+                if (s.src.indexOf("history.js") > -1) {
+                    var iframe_location = (new String(s.src)).replace("history.js", "historyFrame.html");
+                }
+            }
+            historyFrameSourcePrefix = iframe_location + "?";
+            var src = historyFrameSourcePrefix;
+
+            var iframe = document.createElement("iframe");
+            iframe.id = 'ie_historyFrame';
+            iframe.name = 'ie_historyFrame';
+            //iframe.src = historyFrameSourcePrefix;
+            try {
+                document.body.appendChild(iframe);
+            } catch(e) {
+                setTimeout(function() {
+                    document.body.appendChild(iframe);
+                }, 0);
+            }
+        }
+
+        if (browser.safari)
+        {
+            var rememberDiv = document.createElement("div");
+            rememberDiv.id = 'safari_rememberDiv';
+            document.body.appendChild(rememberDiv);
+            rememberDiv.innerHTML = '<input type="text" id="safari_remember_field" style="width: 500px;">';
+
+            var formDiv = document.createElement("div");
+            formDiv.id = 'safari_formDiv';
+            document.body.appendChild(formDiv);
+
+            var reloader_content = document.createElement('div');
+            reloader_content.id = 'safarireloader';
+            var scripts = document.getElementsByTagName('script');
+            for (var i = 0, s; s = scripts[i]; i++) {
+                if (s.src.indexOf("history.js") > -1) {
+                    html = (new String(s.src)).replace(".js", ".html");
+                }
+            }
+            reloader_content.innerHTML = '<iframe id="safarireloader-iframe" src="about:blank" frameborder="no" scrolling="no"></iframe>';
+            document.body.appendChild(reloader_content);
+            reloader_content.style.position = 'absolute';
+            reloader_content.style.left = reloader_content.style.top = '-9999px';
+            iframe = reloader_content.getElementsByTagName('iframe')[0];
+
+            if (document.getElementById("safari_remember_field").value != "" ) {
+                historyHash = document.getElementById("safari_remember_field").value.split(",");
+            }
+
+        }
+
+        if (browser.firefox)
+        {
+            var anchorDiv = document.createElement("div");
+            anchorDiv.id = 'firefox_anchorDiv';
+            document.body.appendChild(anchorDiv);
+        }
+        
+        //setTimeout(checkForUrlChange, 50);
+    }
+
+    return {
+        historyHash: historyHash, 
+        backStack: function() { return backStack; }, 
+        forwardStack: function() { return forwardStack }, 
+        getPlayer: getPlayer, 
+        initialize: function(src) {
+            _initialize(src);
+        }, 
+        setURL: function(url) {
+            document.location.href = url;
+        }, 
+        getURL: function() {
+            return document.location.href;
+        }, 
+        getTitle: function() {
+            return document.title;
+        }, 
+        setTitle: function(title) {
+            try {
+                backStack[backStack.length - 1].title = title;
+            } catch(e) { }
+            //if on safari, set the title to be the empty string. 
+            if (browser.safari) {
+                if (title == "") {
+                    try {
+                    var tmp = window.location.href.toString();
+                    title = tmp.substring((tmp.lastIndexOf("/")+1), tmp.lastIndexOf("#"));
+                    } catch(e) {
+                        title = "";
+                    }
+                }
+            }
+            document.title = title;
+        }, 
+        setDefaultURL: function(def)
+        {
+            defaultHash = def;
+            def = getHash();
+            //trailing ? is important else an extra frame gets added to the history
+            //when navigating back to the first page.  Alternatively could check
+            //in history frame navigation to compare # and ?.
+            if (browser.ie)
+            {
+                window['_ie_firstload'] = true;
+                var sourceToSet = historyFrameSourcePrefix + def;
+                var func = function() {
+                    getHistoryFrame().src = sourceToSet;
+                    window.location.replace("#" + def);
+                    setInterval(checkForUrlChange, 50);
+                }
+                try {
+                    func();
+                } catch(e) {
+                    window.setTimeout(function() { func(); }, 0);
+                }
+            }
+
+            if (browser.safari)
+            {
+                currentHistoryLength = history.length;
+                if (historyHash.length == 0) {
+                    historyHash[currentHistoryLength] = def;
+                    var newloc = "#" + def;
+                    window.location.replace(newloc);
+                } else {
+                    //alert(historyHash[historyHash.length-1]);
+                }
+                //setHash(def);
+                setInterval(checkForUrlChange, 50);
+            }
+            
+            
+            if (browser.firefox || browser.opera)
+            {
+                var reg = new RegExp("#" + def + "$");
+                if (window.location.toString().match(reg)) {
+                } else {
+                    var newloc ="#" + def;
+                    window.location.replace(newloc);
+                }
+                setInterval(checkForUrlChange, 50);
+                //setHash(def);
+            }
+
+        }, 
+
+        /* Set the current browser URL; called from inside BrowserManager to propagate
+         * the application state out to the container.
+         */
+        setBrowserURL: function(flexAppUrl, objectId) {
+            if (browser.ie && typeof objectId != "undefined") {
+                currentObjectId = objectId;
+            }
+           //fromIframe = fromIframe || false;
+           //fromFlex = fromFlex || false;
+           //alert("setBrowserURL: " + flexAppUrl);
+           //flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ;
+
+           var pos = document.location.href.indexOf('#');
+           var baseUrl = pos != -1 ? document.location.href.substr(0, pos) : document.location.href;
+           var newUrl = baseUrl + '#' + flexAppUrl;
+
+           if (document.location.href != newUrl && document.location.href + '#' != newUrl) {
+               currentHref = newUrl;
+               addHistoryEntry(baseUrl, newUrl, flexAppUrl);
+               currentHistoryLength = history.length;
+           }
+
+           return false;
+        }, 
+
+        browserURLChange: function(flexAppUrl) {
+            var objectId = null;
+            if (browser.ie && currentObjectId != null) {
+                objectId = currentObjectId;
+            }
+            pendingURL = '';
+            
+            if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {
+                var pl = getPlayers();
+                for (var i = 0; i < pl.length; i++) {
+                    try {
+                        pl[i].browserURLChange(flexAppUrl);
+                    } catch(e) { }
+                }
+            } else {
+                try {
+                    getPlayer(objectId).browserURLChange(flexAppUrl);
+                } catch(e) { }
+            }
+
+            currentObjectId = null;
+        }
+
+    }
+
+})();
+
+// Initialization
+
+// Automated unit testing and other diagnostics
+
+function setURL(url)
+{
+    document.location.href = url;
+}
+
+function backButton()
+{
+    history.back();
+}
+
+function forwardButton()
+{
+    history.forward();
+}
+
+function goForwardOrBackInHistory(step)
+{
+    history.go(step);
+}
+
+//BrowserHistoryUtils.addEvent(window, "load", function() { BrowserHistory.initialize(); });
+(function(i) {
+    var u =navigator.userAgent;var e=/*@cc_on!@*/false; 
+    var st = setTimeout;
+    if(/webkit/i.test(u)){
+        st(function(){
+            var dr=document.readyState;
+            if(dr=="loaded"||dr=="complete"){i()}
+            else{st(arguments.callee,10);}},10);
+    } else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){
+        document.addEventListener("DOMContentLoaded",i,false);
+    } else if(e){
+    (function(){
+        var t=document.createElement('doc:rdy');
+        try{t.doScroll('left');
+            i();t=null;
+        }catch(e){st(arguments.callee,0);}})();
+    } else{
+        window.onload=i;
+    }
+})( function() {BrowserHistory.initialize();} );
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/historyFrame.html
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/historyFrame.html	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/history/historyFrame.html	(revision 5961)
@@ -0,0 +1,29 @@
+<html>
+    <head>
+        <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
+        <META HTTP-EQUIV="Expires" CONTENT="-1"> 
+    </head>
+    <body>
+    <script>
+        function processUrl()
+        {
+
+            var pos = url.indexOf("?");
+            url = pos != -1 ? url.substr(pos + 1) : "";
+            if (!parent._ie_firstload) {
+                parent.BrowserHistory.setBrowserURL(url);
+                try {
+                    parent.BrowserHistory.browserURLChange(url);
+                } catch(e) { }
+            } else {
+                parent._ie_firstload = false;
+            }
+        }
+
+        var url = document.location.href;
+        processUrl();
+        document.write(encodeURIComponent(url));
+    </script>
+    Hidden frame for Browser History support.
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/index.jsp
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/index.jsp	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/index.jsp	(revision 5961)
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+	pageEncoding="UTF-8"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html
+	xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+<!--  BEGIN Browser History required section -->
+<link rel="stylesheet" type="text/css" href="history/history.css" />
+<!--  END Browser History required section -->
+
+<title>${title}</title>
+<script src="AC_OETags.js" language="javascript"></script>
+
+<!--  BEGIN Browser History required section -->
+<script src="history/history.js" language="javascript"></script>
+<!--  END Browser History required section -->
+
+<style>
+body {
+	margin: 0px;
+	overflow: hidden
+}
+</style>
+<script type="text/javascript" src="./js/extMouseWheel.js"></script>
+<script language="JavaScript" type="text/javascript">
+<!--
+// -----------------------------------------------------------------------------
+// Globals
+// Major version of Flash required
+var requiredMajorVersion = ${version_major};
+// Minor version of Flash required
+var requiredMinorVersion = ${version_minor};
+// Minor version of Flash required
+var requiredRevision = ${version_revision};
+// -----------------------------------------------------------------------------
+// -->
+</script>
+</head>
+
+<body scroll="no">
+<div id="flashContainerDiv"
+	style="position: absolute; width: 100%; height: 100%"><script
+	language="JavaScript" type="text/javascript">
+<!--
+// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
+var hasProductInstall = DetectFlashVer(6, 0, 65);
+
+// Version check based upon the values defined in globals
+var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
+
+if ( hasProductInstall && !hasRequestedVersion ) {
+	// DO NOT MODIFY THE FOLLOWING FOUR LINES
+	// Location visited after installation is complete if installation is required
+	var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
+	var MMredirectURL = window.location;
+    document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+    var MMdoctitle = document.title;
+
+	AC_FL_RunContent(
+		"src", "playerProductInstall",
+		"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
+		"width", "${width}",
+		"height", "${height}",
+		"align", "middle",
+		"id", "${application}",
+		"quality", "high",
+		"bgcolor", "${bgcolor}",
+		"name", "${application}",
+		"allowScriptAccess","sameDomain",
+		"type", "application/x-shockwave-flash",
+		"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+} else if (hasRequestedVersion) {
+	// if we've detected an acceptable version
+	// embed the Flash Content SWF when all tests are passed
+	AC_FL_RunContent(
+			"src", "${ComponentRegistrySwfName}",
+			"width", "${width}",
+			"height", "${height}",
+			"align", "middle",
+			"id", "${application}",
+			"quality", "high",
+			"bgcolor", "${bgcolor}",
+			"name", "${application}",
+			"allowScriptAccess","sameDomain",
+			"type", "application/x-shockwave-flash",
+			"pluginspage", "http://www.adobe.com/go/getflashplayer",
+			"FlashVars", "serviceRootUrl=<%= application.getInitParameter("eu.clarin.cmdi.componentregistry.serviceRootUrl") %>&userName=${pageContext.request.remoteUser}&itemId=${param.itemId}&view=${param.view}&browserview=${param.browserview}&registrySpace=${param.registrySpace}&groupId=${param.groupId}&debug=${flexDebug}"
+			    
+	);
+  } else {  // flash is too old or we can't detect the plugin
+    var alternateContent = 'This content requires the Adobe Flash Player. '
+   	+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
+    document.write(alternateContent);  // insert non-flash content
+  }
+// -->
+</script>
+<noscript><object
+	classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+	id="${application}" width="${width}" height="${height}"
+	codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
+	<param name="movie" value="${ComponentRegistrySwfName}.swf" />
+	<param name="quality" value="high" />
+	<param name="bgcolor" value="${bgcolor}" />
+	<param name="allowScriptAccess" value="sameDomain" />
+	<embed src="${ComponentRegistrySwfName}.swf" quality="high" bgcolor="${bgcolor}"
+		width="${width}" height="${height}" name="${application}"
+		align="middle" play="true" loop="false" quality="high"
+		allowScriptAccess="sameDomain" type="application/x-shockwave-flash"
+		pluginspage="http://www.adobe.com/go/getflashplayer"
+		FlashVars="serviceRootUrl=<%= application.getInitParameter("eu.clarin.cmdi.componentregistry.serviceRootUrl") %>&userName=${pageContext.request.remoteUser}&item=${param.item}&view=${param.view}&browserview=${param.browserview}&space=${param.space}&debug=${flexDebug}">
+	</embed> 
+</object>
+</noscript>
+</div>
+</body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/js/extMouseWheel.js
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/js/extMouseWheel.js	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/js/extMouseWheel.js	(revision 5961)
@@ -0,0 +1,228 @@
+/* 
+*  Mouse wheel support for OS X - implemented in javascript because Adobe
+*  hasn't implemented it in the mac version of Flash Player  >:(
+*  
+*  Copyright (c) 2007-2008 Ali Rantakari ( http://hasseg.org/blog )
+*  
+*  Requires related ActionScript 3 class:
+*  org.hasseg.externalMouseWheel.ExternalMouseWheelSupport
+*  
+*  
+*  Changelog:
+*  ---------------------------------------------------------------------------------
+*  VERSION 1.0 (Ali Rantakari)
+*  July 2007
+*  
+*  - Initial implementation
+*  
+*  
+*  ---------------------------------------------------------------------------------
+*  VERSION 1.5 (Changes by Pavel Fljot, http://inreflected.com)
+*  Jan 2008
+*  
+*  - Added statement to support Safari under Windows
+*  
+*  
+*  ---------------------------------------------------------------------------------
+*  VERSION 2.0 (Changes by Ali Rantakari)
+*  Apr 2008
+*  
+*  - Changed structure of JavaScript so that everything is encapsulated
+*    inside one top-level function
+*  - Added support for modifier keys (ctrl (i.e. command on a Mac,) alt, shift)
+*  - Fixed code for determining coordinates on different (recent) browsers
+*  - Added support for registering multiple Flash objects and their container DIVs
+*  
+*  
+*  ---------------------------------------------------
+*  This code is licensed under the MIT License:
+*  
+*  Permission is hereby granted, free of charge, to any person obtaining a copy
+*  of this software and associated documentation files (the "Software"), to deal
+*  in the Software without restriction, including without limitation the rights
+*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+*  copies of the Software, and to permit persons to whom the Software is
+*  furnished to do so, subject to the following conditions:
+*  
+*  The above copyright notice and this permission notice shall be included in
+*  all copies or substantial portions of the Software.
+*  
+*  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+*  THE SOFTWARE.
+*/
+
+var extMouseWheel = function()
+{
+	// let's not allow other deltas than +/- 3 because that's what flash player does:
+	var keepDeltaAtPlusMinusThree = true;
+	
+	
+	// an associative array, where the keys are the ids of flash
+	// objects that have registered for the mouse wheel support, and
+	// the values their respective container div elements.
+	var f = [];
+	
+	
+	
+	
+	// helper function courtesy of the Adobe peepz
+	var thisMovie = function(movieName)
+	{
+		if (navigator.appName.indexOf("Microsoft") != -1) {
+			return window[movieName];
+		} else {
+			return document[movieName];
+		}
+	}
+	
+	// helper functions for getting the position of
+	// an element
+	// from:  http://blog.firetree.net/2005/07/04/javascript-find-position/
+	var findPosX = function(obj)
+	{
+		var curleft = 0;
+		if(obj.offsetParent)
+			while(1) 
+			{
+			  curleft += obj.offsetLeft;
+			  if(!obj.offsetParent)
+				break;
+			  obj = obj.offsetParent;
+			}
+		else if(obj.x)
+			curleft += obj.x;
+		return curleft;
+	}
+	var findPosY = function(obj)
+	{
+		var curtop = 0;
+		if(obj.offsetParent)
+			while(1)
+			{
+			  curtop += obj.offsetTop;
+			  if(!obj.offsetParent)
+				break;
+			  obj = obj.offsetParent;
+			}
+		else if(obj.y)
+			curtop += obj.y;
+		return curtop;
+	}
+	
+	// helper function for searching the user-agent string
+	var uaContains = function(str)
+	{
+		return (navigator.userAgent.indexOf(str) != -1);
+	}
+	
+	
+	
+	
+	
+	
+	// Handler for mouse wheel event:
+	var onWheelHandler = function(event)
+	{
+		var delta = 0;
+		if (!event) event = window.event;
+		if (event.wheelDelta)
+		{
+			// Safari
+			delta = event.wheelDelta/120;
+			if (window.opera) delta = -delta;
+		}
+		else if (event.detail) // Firefox
+			delta = -event.detail*3;
+		
+		if (keepDeltaAtPlusMinusThree)
+		{
+			if (delta > 0) delta = 3;
+			else if (delta == 0) delta = 0;
+			else delta = -3;
+		}
+		
+		if (delta)
+		{
+			
+			var thisFlashMovieId = null;
+			for (var j in f)
+				if (f[j] != null && f[j] == event.currentTarget) thisFlashMovieId = j;
+			
+			var thisMouse;
+			
+			if (uaContains("Camino"))
+				thisMouse = {x:event.layerX, y:event.layerY};
+			else if (uaContains('Firefox'))
+				thisMouse = {x:(event.layerX - findPosX(event.currentTarget)), y:(event.layerY - findPosY(event.currentTarget))};
+			else
+				thisMouse = {x:event.offsetX, y:event.offsetY};
+			
+			thisMouse.ctrlKey = (uaContains('Mac')) ? (event.metaKey || event.ctrlKey) : event.ctrlKey;
+			thisMouse.altKey = event.altKey;
+			thisMouse.shiftKey = event.shiftKey;
+			thisMouse.buttonDown = false;
+			
+			if (thisMovie(thisFlashMovieId).dispatchExternalMouseWheelEvent)
+				thisMovie(thisFlashMovieId).dispatchExternalMouseWheelEvent(delta, thisMouse.x, thisMouse.y,
+																			thisMouse.ctrlKey, thisMouse.altKey,
+																			thisMouse.shiftKey, thisMouse.buttonDown);
+		};
+		
+		// Prevent default actions caused by mouse wheel
+		if (event.preventDefault) event.preventDefault();
+		event.returnValue = false;
+		
+	}
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	return {
+		// initialize mouse wheel capturing by setting the listener
+		// (this is called from within the Flash app):
+		initCaptureFor: function(aFlashObjectId)
+		{
+			if (uaContains('Mac') || uaContains('Safari'))
+			{
+				// find flash object's div container
+				var parentdiv = document.getElementById(aFlashObjectId).parentNode;
+				while(parentdiv != null && parentdiv.nodeName != "DIV")
+					parentdiv = parentdiv.parentNode;
+				
+				if (parentdiv != undefined && parentdiv != null)
+				{
+					f[aFlashObjectId] = parentdiv;
+					
+					if (parentdiv.addEventListener) parentdiv.addEventListener('DOMMouseScroll', onWheelHandler, false); // Firefox
+					parentdiv.onmousewheel = onWheelHandler; // Safari
+					
+					return true;
+				}
+				else
+					return false;
+			}
+			else
+				return false;
+		}
+	};
+	
+}();
+
+
+
+
+
+
+
+
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateMineComponent.jsp
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateMineComponent.jsp	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateMineComponent.jsp	(revision 5961)
@@ -0,0 +1,25 @@
+<%-- 
+    Document   : testManipulateComponent
+    Created on : Aug 1, 2014, 3:44:30 PM
+    Author     : olhsha
+--%>
+
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <title>Manipulate component</title>
+    </head>
+    <body>
+        
+        <h3>Manipulate my Component clarin.eu:cr1:larin.eu:cr1:c_1406902201688 (this id is obsolete)</h1>
+        <form action="rest/registry/components/larin.eu:cr1:c_1406902201688" method="post">
+        <input type="text" 
+               id="method" 
+               name="method">
+        <button type="submit">Send</button>
+       </form>
+       
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateMyProfile.jsp
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateMyProfile.jsp	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateMyProfile.jsp	(revision 5961)
@@ -0,0 +1,23 @@
+<%-- 
+    Document   : testManipulateComponent
+    Created on : Aug 1, 2014, 3:44:30 PM
+    Author     : olhsha
+--%>
+
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <title>Manipulate component</title>
+    </head>
+    <body>
+        <h3>Manipulate my Profile clarin.eu:cr1:p_1406902201690 (this id is obsolete) </h1>
+        <form action="rest/registry/profiles/clarin.eu:cr1:p_1406902201690" method="post">
+        <input type="text" 
+               id="method" 
+               name="method">
+        <button type="submit">Send</button>
+        </form> 
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateOldPublicComponent.jsp
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateOldPublicComponent.jsp	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateOldPublicComponent.jsp	(revision 5961)
@@ -0,0 +1,24 @@
+<%-- 
+    Document   : testManipulateComponent
+    Created on : Aug 1, 2014, 3:44:30 PM
+    Author     : olhsha
+--%>
+
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <title>Manipulate component</title>
+    </head>
+    <body>
+        <h3>Manipulate Old Public Component clarin.eu:cr1:c_1349361150637</h1>
+        <form action="rest/registry/components/clarin.eu:cr1:c_1349361150637" method="post">
+        <input type="text" 
+               id="method" 
+               name="method">
+        <button type="submit">Send</button>
+        </form>
+        
+    </body>
+</html>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateOldPublicProfile.jsp
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateOldPublicProfile.jsp	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/main/webapp/testManipulateOldPublicProfile.jsp	(revision 5961)
@@ -0,0 +1,26 @@
+<%-- 
+    Document   : testManipulateComponent
+    Created on : Aug 1, 2014, 3:44:30 PM
+    Author     : olhsha
+--%>
+
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <title>Manipulate component</title>
+    </head>
+    <body>
+        
+        <h3>Manipulate Old Public Profile clarin.eu:cr1:p_1345561703673 </h1>
+        <form action="rest/registry/profiles/clarin.eu:cr1:p_1345561703673" method="post">
+        <input type="text" 
+               id="method" 
+               name="method">
+        <button type="submit">Send</button>
+        </form>
+        
+    </body>
+</html>
+
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/BaseUnitTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/BaseUnitTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/BaseUnitTest.java	(revision 5961)
@@ -0,0 +1,42 @@
+package clarin.cmdi.componentregistry;
+
+import org.custommonkey.xmlunit.XMLTestCase;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.transaction.TransactionConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+
+import clarin.cmdi.componentregistry.impl.database.ComponentRegistryTestDatabase;
+
+/**
+ * Base test with common facilities. Starts a test application context and
+ * enables transaction handling
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:spring-config/applicationContext.xml",
+		"classpath:spring-config/test-applicationContext-fragment.xml" })
+@TransactionConfiguration(defaultRollback = true)
+@Transactional
+public abstract class BaseUnitTest extends XMLTestCase {
+
+	@Autowired
+	protected MDMarshaller marshaller;
+
+	@Autowired
+	protected JdbcTemplate jdbcTemplate;
+
+	@Before
+	public void setupDatabase() {
+		XMLUnit.setIgnoreAttributeOrder(true);
+		ComponentRegistryTestDatabase.resetAndCreateAllTables(jdbcTemplate);
+	}
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/DatesHelperTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/DatesHelperTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/DatesHelperTest.java	(revision 5961)
@@ -0,0 +1,69 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.apache.commons.lang.time.DateUtils;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.util.XmlDateAdapter;
+
+/**
+ *
+ * @author olhsha
+ */
+public class DatesHelperTest {
+
+    /**
+     * Test of parseWorks method, of class DatesHelper.
+     */
+    @Test
+    public void testParseWorks() throws ParseException {
+
+        assertEquals(null, DatesHelper.parseWorks("Wrong date"));
+
+        final String testDate = "2012-09-17T13:40:57+00:00";
+        Date result = DatesHelper.parseWorks(testDate);
+        assertFalse(null == result);
+        Date expectedResult = DateUtils.parseDate(testDate, new String[]{DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern()});
+        assertTrue(expectedResult.equals(result));
+    }
+
+    /**
+     * Test of compareDateStrings method, of class DatesHelper.
+     */
+    @Test
+    public void testCompareDateStrings() {
+        String date1 = "2012-09-17T13:40:57+00:00";
+        String date2 = "2012-09-17T13:40:58+00:00";
+
+        int result1 = DatesHelper.compareDateStrings(date1, date2);
+        assertEquals(1, result1);
+        int result2 = DatesHelper.compareDateStrings(date2, date1);
+        assertEquals(-1, result2);
+
+    }
+
+    /**
+     * Test of getRFCDateTime method, of class DatesHelper.
+     */
+    @Test
+    public void testGetRFCDateTime() {
+        String dateString = "2012-09-17T13:40:57+00:00";
+        String expResult = "Mon, 17 Sep 2012 15:40:57 +0200";
+        String result = DatesHelper.getRFCDateTime(dateString);
+        assertEquals(expResult, result);
+    }
+
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/MDMarshallerTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/MDMarshallerTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/MDMarshallerTest.java	(revision 5961)
@@ -0,0 +1,30 @@
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import java.io.ByteArrayInputStream;
+import junit.framework.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class MDMarshallerTest extends BaseUnitTest{
+
+    private static Logger logger = LoggerFactory.getLogger(MDMarshallerTest.class);
+    
+    @Test
+    public void testMarshalToString() throws Exception {
+	BaseDescription desc = ComponentDescription.createNewDescription();
+	desc.setName("Test \u00CA test");
+	String test = marshaller.marshalToString(desc);
+	logger.info(test);
+	Assert.assertTrue(test.contains("Test \u00CA test"));
+	BaseDescription result = marshaller.unmarshal(ComponentDescription.class, new ByteArrayInputStream(test.getBytes("UTF-8")), null);
+	logger.info(result.getName());
+	Assert.assertEquals(desc.getName(), result.getName());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/OwnerUserTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/OwnerUserTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/OwnerUserTest.java	(revision 5961)
@@ -0,0 +1,53 @@
+package clarin.cmdi.componentregistry;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class OwnerUserTest {
+
+    private OwnerUser instance;
+
+    @Before
+    public void setUp() {
+	instance = new OwnerUser(101);
+    }
+
+    /**
+     * Test of getId method, of class OwnerUser.
+     */
+    @Test
+    public void testGetId() {
+	Number result = instance.getId();
+	assertEquals(101, result);
+    }
+
+    /**
+     * Test of equals method, of class OwnerUser.
+     */
+    @Test
+    public void testEquals() {
+	OwnerUser instance2 = new OwnerUser(101);
+	OwnerUser instance3 = new OwnerUser(102);
+	boolean result = instance.equals(instance2);
+	assertTrue(result);
+	result = instance.equals(instance3);
+	assertFalse(result);
+    }
+
+    /**
+     * Test of hashCode method, of class OwnerUser.
+     */
+    @Test
+    public void testHashCode() {
+	OwnerUser instance2 = new OwnerUser(101);
+	OwnerUser instance3 = new OwnerUser(102);
+	assertTrue(instance.hashCode() == instance2.hashCode());
+	assertFalse(instance.hashCode() == instance3.hashCode());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/RssMarshallingTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/RssMarshallingTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/RssMarshallingTest.java	(revision 5961)
@@ -0,0 +1,54 @@
+package clarin.cmdi.componentregistry;
+
+import clarin.cmdi.componentregistry.rss.Rss;
+import clarin.cmdi.componentregistry.rss.RssChannel;
+import clarin.cmdi.componentregistry.rss.RssItem;
+import java.io.ByteArrayOutputStream;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public class RssMarshallingTest extends BaseUnitTest{
+
+    @Test
+    public void testMarshall() throws Exception {
+	final Rss rss = new Rss();
+        
+        rss.setVersion(2.0);
+
+	final RssChannel channel = new RssChannel();
+	rss.setChannel(channel);
+
+	final RssItem item1 = new RssItem();
+	item1.setTitle("Item 1");
+	item1.setDescription("Description 1");
+	channel.getItem().add(item1);
+
+	final RssItem item2 = new RssItem();
+	item2.setTitle("Item 2");
+	item2.setDescription("Description 2");
+	channel.getItem().add(item2);
+
+	ByteArrayOutputStream os = new ByteArrayOutputStream();
+	marshaller.marshal(rss, os);
+	String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
+		+ "<rss version=\"2.0\""
+                + ">\n"
+		+ "    <channel>\n"
+		+ "        <item>\n"
+		+ "            <title>Item 1</title>\n"
+		+ "            <description>Description 1</description>\n"
+		+ "        </item>\n"
+		+ "        <item>\n"
+		+ "            <title>Item 2</title>\n"
+		+ "            <description>Description 2</description>\n"
+		+ "        </item>\n"
+		+ "    </channel>\n"
+		+ "</rss>";
+	assertEquals(expected.trim(), os.toString().trim());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/TestXmlDateAdapter.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/TestXmlDateAdapter.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/TestXmlDateAdapter.java	(revision 5961)
@@ -0,0 +1,70 @@
+package clarin.cmdi.componentregistry;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.util.XmlDateAdapter;
+
+/**
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+public class TestXmlDateAdapter {
+
+    XmlDateAdapter adapter;
+    GregorianCalendar calendar;
+
+    @Before
+    public void setup() {
+	adapter = new XmlDateAdapter();
+	calendar = new GregorianCalendar();
+	calendar.set(GregorianCalendar.YEAR, 2013);
+	calendar.set(GregorianCalendar.MONTH, 10 - 1); // month is 0-based :(
+	calendar.set(GregorianCalendar.DAY_OF_MONTH, 18);
+	calendar.set(GregorianCalendar.HOUR, 8);
+	calendar.set(GregorianCalendar.MINUTE, 2);
+	calendar.set(GregorianCalendar.SECOND, 37);
+	calendar.set(GregorianCalendar.MILLISECOND, 0);
+	calendar.set(GregorianCalendar.AM_PM, GregorianCalendar.AM);
+	calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
+    }
+
+    @Test
+    public void testFormat1() throws Exception {
+	Date date = calendar.getTime();
+	String s = adapter.marshal(date);
+	assertEquals("2013-10-18T08:02:37+00:00", s);
+    }
+
+    @Test
+    public void testFormat2() throws Exception {
+	calendar.setTimeZone(TimeZone.getTimeZone("CET"));
+	Date date = calendar.getTime();
+	String s = adapter.marshal(date);
+	assertEquals("2013-10-18T06:02:37+00:00", s);
+    }
+
+    @Test
+    public void testParse1() throws Exception {
+	Date date = adapter.unmarshal("2013-10-18T08:02:37+00:00");
+	assertEquals(calendar.getTime(), date);
+    }
+
+    @Test
+    public void testParse2() throws Exception {
+	Date date = adapter.unmarshal("2013-10-18T08:02:37+02:00");
+	Calendar copy = (Calendar)calendar.clone();
+	copy.set(Calendar.HOUR, 6);
+	copy.setTimeZone(TimeZone.getTimeZone("CEST"));
+	assertEquals(copy.getTime(), date);
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/UserCredentialsTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/UserCredentialsTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/UserCredentialsTest.java	(revision 5961)
@@ -0,0 +1,42 @@
+package clarin.cmdi.componentregistry;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.rest.DummyPrincipal;
+import de.mpg.aai.shhaa.model.AuthAttribute;
+import de.mpg.aai.shhaa.model.AuthAttributes;
+import de.mpg.aai.shhaa.model.AuthPrincipal;
+import de.mpg.aai.shhaa.model.BaseAuthAttribute;
+
+public class UserCredentialsTest {
+
+    @Test
+    public void testUserCredentials() throws Exception {
+        UserCredentials creds = new UserCredentials(new DummyPrincipal("noot"));
+        assertEquals("noot", creds.getDisplayName());
+        assertEquals("noot", creds.getPrincipalName());
+        assertEquals(DigestUtils.md5Hex("noot"), creds.getPrincipalNameMD5Hex());
+
+        AuthPrincipal principal = new AuthPrincipal("noot");
+        creds = new UserCredentials(principal);
+        assertEquals("noot", creds.getDisplayName());
+        assertEquals("noot", creds.getPrincipalName());
+        assertEquals(DigestUtils.md5Hex("noot"), creds.getPrincipalNameMD5Hex());
+
+        principal = new AuthPrincipal("noot");
+        Set<AuthAttribute<?>> values = new HashSet<AuthAttribute<?>>();
+        values.add(new BaseAuthAttribute<String>("displayName", "Mr. Noot"));
+        AuthAttributes attributes = new AuthAttributes(values);
+        principal.setAttribues(attributes);
+        creds = new UserCredentials(principal);
+        assertEquals("Mr. Noot", creds.getDisplayName());
+        assertEquals("noot", creds.getPrincipalName());
+        assertEquals(DigestUtils.md5Hex("noot"), creds.getPrincipalNameMD5Hex());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/frontend/CMDItemInfoTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/frontend/CMDItemInfoTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/frontend/CMDItemInfoTest.java	(revision 5961)
@@ -0,0 +1,63 @@
+package clarin.cmdi.componentregistry.frontend;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.ComponentStatus;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+
+public class CMDItemInfoTest extends BaseUnitTest{
+
+    // this is component status "private/public" from the database v.s. registry space public/private
+    @Test
+    public void testGetUserDir() throws Exception {
+	CMDItemInfo info = new CMDItemInfo(marshaller);
+	//info.setDataNode(new FileNode(createFile("users/user1/components/c_123/description.xml"), false));
+	info.setDataNode(new DisplayDataNode("test", false, createDescription(), RegistrySpace.PRIVATE));
+	assertTrue(info.isDeletable());
+	assertFalse(info.isUndeletable());
+	assertTrue(info.isEditable());
+	assertFalse(info.getDataNode().isDeleted());
+	assertEquals(RegistrySpace.PRIVATE, info.getSpace());
+	//info.setDataNode(new FileNode(createFile("users/user1/components/deleted/c_123/description.xml"), true));
+	info.setDataNode(new DisplayDataNode("test", true, createDescription(), RegistrySpace.PRIVATE));
+	assertFalse(info.isDeletable());
+	assertTrue(info.isUndeletable());
+	assertTrue(info.isEditable());
+	assertTrue(info.getDataNode().isDeleted());
+	assertEquals(RegistrySpace.PRIVATE, info.getSpace());
+	//info.setDataNode(new FileNode(createFile("components/c_123/description.xml"), false));
+	info.setDataNode(new DisplayDataNode("test", false, createDescription(), RegistrySpace.PUBLISHED));
+	assertTrue(info.isDeletable());
+	assertFalse(info.isUndeletable());
+	assertTrue(info.isEditable());
+	assertEquals(RegistrySpace.PUBLISHED, info.getSpace());
+	//info.setDataNode(new FileNode(createFile("components/c_123/"), false));
+	info.setDataNode(new DisplayDataNode("test", false));
+	assertFalse(info.isDeletable());
+	assertFalse(info.isUndeletable());
+	assertFalse(info.isEditable());
+	//info.setDataNode(new FileNode(createFile("components/deleted/c_123/description.xml"), true));
+	info.setDataNode(new DisplayDataNode("test", true, createDescription(), RegistrySpace.PUBLISHED));
+	assertFalse(info.isDeletable());
+	assertTrue(info.isUndeletable());
+	assertTrue(info.isEditable());
+	assertEquals(RegistrySpace.PUBLISHED, info.getSpace());
+	assertTrue(info.getDescription().startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<profileDescription"));
+	//info.setDataNode(new FileNode(createFile("components/deleted/c_123/"), true));
+	info.setDataNode(new DisplayDataNode("test", true));
+	assertFalse(info.isDeletable());
+	assertFalse(info.isUndeletable());
+	assertFalse(info.isEditable());
+	assertEquals("", info.getDescription());
+    }
+
+    private BaseDescription createDescription() {
+	return ProfileDescription.createNewDescription();
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/AbstractDescriptionDaoTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/AbstractDescriptionDaoTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/AbstractDescriptionDaoTest.java	(revision 5961)
@@ -0,0 +1,218 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Date;
+import java.util.List;
+
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+
+/**
+ * Base test class for concrete tests to profile and component DAOs
+ * 
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public abstract class AbstractDescriptionDaoTest extends BaseUnitTest {
+
+    @Autowired
+    private UserDao userDao;
+
+    protected abstract ComponentDao getDao();
+
+    @Test
+    public void testInjection() {
+	assertNotNull(jdbcTemplate);
+	assertNotNull(getDao());
+    }
+
+    @Test
+    public void testInsertComponent() throws Exception {
+	Date regDate = new Date();
+
+	BaseDescription description = createNewDescription();
+	description.setName("MyComponent");
+	description.setDescription("MyDescription");
+	description.setCreatorName("Aap");
+	description.setGroupName("MyGroup");
+	description.setDomainName("MyDomain \u00CA");
+	description.setHref("http://MyHref");
+
+	description.setRegistrationDate(regDate);
+
+	String testComponent = getContentString();
+	Number newId = getDao().insertDescription(description, testComponent,
+		true, null);
+	assertNotNull(newId);
+	BaseDescription descr = getDao().getById(newId);
+	assertNotNull(descr);
+	assertEquals("MyComponent", descr.getName());
+	assertEquals("MyDescription", descr.getDescription());
+	assertEquals("Aap", descr.getCreatorName());
+	assertEquals("MyGroup", descr.getGroupName());
+	assertEquals("MyDomain \u00CA", descr.getDomainName());
+	assertEquals("http://MyHref", descr.getHref());
+	assertEquals(regDate, descr.getRegistrationDate());
+	assertEquals(testComponent,
+		getDao().getContent(false, description.getId()));
+    }
+
+    @Test
+    public void testGetDescriptionsOrdered() throws Exception {
+	insert("a", true, null);
+	insert("A", true, null);
+	insert("B", true, null);
+	insert("a", true, null);
+
+	List<BaseDescription> descs = getDao().getPublicDescriptions();
+	assertEquals(4, descs.size());
+	assertEquals("a", descs.get(0).getName()); // ordered by name case
+						   // insensitive then by cmdId
+	assertEquals("A", descs.get(1).getName());
+	assertEquals("a", descs.get(2).getName());
+	assertTrue(descs.get(1).getId().compareTo(descs.get(2).getId()) < 0);
+	assertEquals("B", descs.get(3).getName());
+
+    }
+
+    @Test
+    public void testGetPublicComponents() throws Exception {
+	List<BaseDescription> descriptions = getDao().getPublicDescriptions();
+	assertNotNull(descriptions);
+    }
+
+    @Test
+    public void testGetUserspaceDescriptions() throws Exception {
+	// TODO: test queries empty database and is happy that no results are
+	// returned. Should also test the case where there are userspace
+	// descriptions
+	List<BaseDescription> descriptions = getDao().getPrivateBaseDescriptions(-1, ComponentDescription.COMPONENT_PREFIX);
+	assertEquals(0, descriptions.size());
+    }
+
+    @Test
+    public void testDeleteDescription() throws Exception {
+	BaseDescription description = createNewDescription();
+	description.setName("Aap");
+	description.setDescription("MyDescription");
+	String testComponent = getContentString();
+
+	int count = getDao().getPublicDescriptions().size();
+	// insert
+	getDao().insertDescription(description, testComponent, true, null);
+	assertEquals(count + 1, getDao().getPublicDescriptions().size());
+
+	List<BaseDescription> deletedDescriptions = getDao().getDeletedDescriptions(null);
+	assertEquals(0, deletedDescriptions.size());
+
+	// delete
+	getDao().setDeleted(description, true);
+	assertEquals(count, getDao().getPublicDescriptions().size());
+
+	deletedDescriptions = getDao().getDeletedDescriptions(null);
+	assertEquals(1, deletedDescriptions.size());
+    }
+
+    @Test
+    public void testUpdateDescription() {
+	BaseDescription description = createNewDescription();
+	description.setName("Aap");
+	description.setDescription("MyDescription");
+	description.setCreatorName("Aap");
+	description.setGroupName("MyGroup");
+	description.setDomainName("MyDomain");
+	description.setHref("http://MyHref");
+
+	String testComponent = getContentString();
+	Number newId = getDao().insertDescription(description, testComponent,
+		true, null);
+
+	// Change values
+	description.setName("Noot");
+	description.setDescription("AnotherDescription");
+	description.setCreatorName("AnotherAap");
+	description.setGroupName("AnotherGroup");
+	description.setDomainName("AnotherDomain\u00CA");
+	description.setHref("http://AnotherHref");
+	// Update in db
+	getDao().updateDescription(newId, description, null);
+	description = getDao().getById(newId);
+	// Test if new values are there
+	assertNotNull(description);
+	assertEquals("Noot", description.getName());
+	assertEquals("AnotherDescription", description.getDescription());
+	assertEquals("AnotherAap", description.getCreatorName());
+	assertEquals("AnotherGroup", description.getGroupName());
+	assertEquals("AnotherDomain\u00CA", description.getDomainName());
+	assertEquals("http://AnotherHref", description.getHref());
+
+	// Update content
+	String testContent2 = "<test>Test content</test>";
+	getDao().updateDescription(newId, null, testContent2);
+	// Test if new content is there
+	assertEquals(testContent2,
+		getDao().getContent(false, description.getId()));
+
+	// Update both
+	description.setName("Mies");
+	description.setDescription("YetAnotherDescription");
+	String testContent3 = "<test>More test \u00CA content</test>";
+
+	// Update in db
+	getDao().updateDescription(newId, description, testContent3);
+	description = getDao().getById(newId);
+	// Test if new values are there
+	assertNotNull(description);
+	assertEquals("Mies", description.getName());
+	assertEquals("YetAnotherDescription", description.getDescription());
+	// Test if new content is there
+	assertEquals(testContent3,
+		getDao().getContent(false, description.getId()));
+    }
+
+    @Test
+    public void testIsPublic() {
+	Number userId = userDao.save(UserDaoTest.createTestUser()).getId();
+	BaseDescription publicDesc = insert(true, null);
+	assertTrue(getDao().isPublic(publicDesc.getId()));
+	assertFalse(getDao().isInUserSpace(publicDesc.getId(), userId));
+
+	BaseDescription privateDesc = insert(false, userId);
+	assertFalse(getDao().isPublic(privateDesc.getId()));
+	assertTrue(getDao().isInUserSpace(privateDesc.getId(), userId));
+
+	getDao().setDeleted(publicDesc, true);
+	assertTrue(getDao().isPublic(publicDesc.getId()));
+	assertFalse(getDao().isInUserSpace(publicDesc.getId(), userId));
+
+	getDao().setDeleted(privateDesc, true);
+	assertFalse(getDao().isPublic(privateDesc.getId()));
+	assertTrue(getDao().isInUserSpace(privateDesc.getId(), userId));
+    }
+
+    private BaseDescription insert(boolean isPublic, Number userId) {
+	return insert("Aap", isPublic, userId);
+    }
+
+    private BaseDescription insert(String name, boolean isPublic, Number userId) {
+	BaseDescription desc = createNewDescription();
+	desc.setName(name);
+	desc.setDescription("MyDescription");
+	getDao().insertDescription(desc, getContentString(), isPublic, userId);
+	return desc;
+    }
+
+    protected abstract String getContentString();
+
+    protected abstract BaseDescription createNewDescription();
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/AdminRegistryTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/AdminRegistryTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/AdminRegistryTest.java	(revision 5961)
@@ -0,0 +1,131 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.security.Principal;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.DeleteFailedException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.frontend.CMDItemInfo;
+import clarin.cmdi.componentregistry.frontend.DisplayDataNode;
+import clarin.cmdi.componentregistry.frontend.SubmitFailedException;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+import clarin.cmdi.componentregistry.rest.DummyPrincipal;
+import clarin.cmdi.componentregistry.rest.RegistryTestHelper;
+
+/**
+ * 
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class AdminRegistryTest extends BaseUnitTest{
+
+    @Autowired
+    private ComponentDao componentDao;
+    
+    @Autowired
+    private UserDao userDao;
+    
+    @Autowired
+    private ComponentRegistryFactory componentRegistryFactory;
+    private static final Principal PRINCIPAL_ADMIN = DummyPrincipal.DUMMY_ADMIN_PRINCIPAL;
+    @Autowired
+    private MDMarshaller marshaller;
+
+    @Before
+    public void init() {
+	ComponentRegistryTestDatabase.resetAndCreateAllTables(jdbcTemplate);
+    }
+
+    // TODO: two questions
+    @Test
+    public void testForceUpdate() throws Exception {
+        
+        RegistryUser adminUser = new RegistryUser();
+	adminUser.setName(PRINCIPAL_ADMIN.getName());
+	adminUser.setPrincipalName(PRINCIPAL_ADMIN.getName());
+        userDao.save(adminUser);
+
+	ComponentRegistry testRegistry = componentRegistryFactory.getPublicRegistry();
+	String content1 = "";
+	content1 += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+	content1 += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+	content1 += "    <Header/>\n";
+	content1 += "    <CMD_Component name=\"XXX\" CardinalityMin=\"1\" CardinalityMax=\"10\">\n";
+	content1 += "        <CMD_Element name=\"Availability\" ValueScheme=\"string\" />\n";
+	content1 += "    </CMD_Component>\n";
+	content1 += "</CMD_ComponentSpec>\n";
+	ComponentDescription compDesc1 = RegistryTestHelper.addComponent(testRegistry, "XXX1", content1, true);
+       
+        assertEquals(1, testRegistry.getComponentDescriptions().size());
+        
+	String content2 = "";
+	content2 += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+	content2 += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+	content2 += "    <Header/>\n";
+	content2 += "    <CMD_Component name=\"YYY\" CardinalityMin=\"1\" CardinalityMax=\"unbounded\">\n";
+	content2 += "        <CMD_Component ComponentId=\"" + compDesc1.getId() + "\" CardinalityMin=\"0\" CardinalityMax=\"99\">\n";
+	content2 += "        </CMD_Component>\n";
+	content2 += "    </CMD_Component>\n";
+	content2 += "</CMD_ComponentSpec>\n";
+	ProfileDescription profileDesc = RegistryTestHelper.addProfile(testRegistry, "YYY1", content2, true);
+       
+
+        // why two registries? 
+        // if you are logged in as an admin then at any registry you have the same all-mighty rights?
+        // testRegistry with the owner admin should be ok?
+        // how are these two registries connected, via componentDao?
+        
+	AdminRegistry adminReg = new AdminRegistry();
+	adminReg.setComponentRegistryFactory(componentRegistryFactory);
+	adminReg.setComponentDao(componentDao);
+	adminReg.setMarshaller(marshaller);
+	CMDItemInfo fileInfo = new CMDItemInfo(marshaller);
+	fileInfo.setForceUpdate(false);
+	fileInfo.setDataNode(new DisplayDataNode(compDesc1.getName(), false, compDesc1, RegistrySpace.PUBLISHED));
+	fileInfo.setContent(content1);
+	// TODO: how it should be?
+        try {
+	    adminReg.submitFile(fileInfo, PRINCIPAL_ADMIN);
+            
+            // Twan ?? when submit should fail?
+            //fail();
+	} catch (SubmitFailedException e) {
+	}
+	fileInfo.setForceUpdate(true);
+	adminReg.submitFile(fileInfo, PRINCIPAL_ADMIN); //Component needs to be forced because they can be used by other profiles/components
+
+	assertEquals(1, testRegistry.getComponentDescriptions().size());
+	
+        try {
+	    fileInfo.setForceUpdate(false);
+	    adminReg.delete(fileInfo, PRINCIPAL_ADMIN);
+	} catch (SubmitFailedException e) {
+	    assertTrue(e.getCause() instanceof DeleteFailedException);
+	}
+	
+        assertEquals(1, testRegistry.getComponentDescriptions().size());
+	fileInfo.setForceUpdate(true);
+	adminReg.delete(fileInfo, PRINCIPAL_ADMIN);
+	assertEquals(0, testRegistry.getComponentDescriptions().size());
+
+	assertEquals(1, testRegistry.getProfileDescriptions().size());
+	fileInfo.setForceUpdate(false);
+	fileInfo.setDataNode(new DisplayDataNode(profileDesc.getName(), false, profileDesc, RegistrySpace.PUBLISHED));
+	adminReg.delete(fileInfo, PRINCIPAL_ADMIN); //Profile do not need to be forced they cannot be used by other profiles
+	assertEquals(0, testRegistry.getProfileDescriptions().size());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/CommentsDaoTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/CommentsDaoTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/CommentsDaoTest.java	(revision 5961)
@@ -0,0 +1,187 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.persistence.jpa.CommentsDao;
+
+import java.util.Date;
+import java.util.List;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+/**
+ *
+ * @author jean-charles FerriÃšres <jean-charles.ferrieres@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class CommentsDaoTest extends BaseUnitTest{
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    @Autowired
+    private CommentsDao commentsDao;
+
+    @Test
+    public void testInjection() {
+	assertNotNull(jdbcTemplate);
+	assertNotNull(commentsDao);
+    }
+
+    @Test
+    public void testInsertProfileComment() {
+	Comment comment = createTestComment();
+	comment.setComponentId(TEST_COMMENT_PROFILE_ID);
+
+	assertEquals(0, commentsDao.getAllComments().size());
+	comment.setUserId(TEST_COMMENT_USER_ID);
+	Number newId = Long.parseLong(commentsDao.saveAndFlush(comment).getId());
+	assertNotNull(newId);
+
+	List<Comment> comments = commentsDao.getAllComments();
+	assertNotNull(comments);
+	assertEquals(1, comments.size());
+
+	assertEquals(TEST_COMMENT_NAME, comments.get(0).getComment());
+	assertEquals(TEST_COMMENT_PROFILE_ID, comments.get(0).getComponentId());
+	assertEquals(TEST_COMMENT_DATE, comments.get(0).getCommentDate());
+	assertEquals(TEST_COMMENT_USER_NAME, comments.get(0).getUserName());
+	assertEquals(TEST_COMMENT_USER_ID, comments.get(0).getUserId());
+    }
+
+    @Test
+    public void testInsertComponentComment() {
+	Comment comment = createTestComment();
+	comment.setComponentId(TEST_COMMENT_COMPONENT_ID);
+
+	assertEquals(0, commentsDao.getAllComments().size());
+	
+	comment.setUserId(TEST_COMMENT_USER_ID);
+	Number newId = Long.parseLong(commentsDao.saveAndFlush(comment).getId());
+	assertNotNull(newId);
+
+	List<Comment> comments = commentsDao.getAllComments();
+	assertNotNull(comments);
+	assertEquals(1, comments.size());
+
+	assertEquals(TEST_COMMENT_NAME, comments.get(0).getComment());
+	assertEquals(TEST_COMMENT_COMPONENT_ID, comments.get(0).getComponentId());
+	assertEquals(TEST_COMMENT_DATE, comments.get(0).getCommentDate());
+	assertEquals(TEST_COMMENT_USER_NAME, comments.get(0).getUserName());
+	assertEquals(TEST_COMMENT_USER_ID, comments.get(0).getUserId());
+    }
+
+    @Test
+    public void testGetById() {
+	Comment comment1 = createTestComment();
+	comment1.setComponentId(TEST_COMMENT_PROFILE_ID);
+	comment1.setUserId(TEST_COMMENT_USER_ID);
+	Number commentId = Long.parseLong(commentsDao.saveAndFlush(comment1).getId());
+	Comment commentById = commentsDao.findOne(commentId.longValue());
+	assertEquals(TEST_COMMENT_PROFILE_ID, commentById.getComponentId());
+	assertEquals(TEST_COMMENT_NAME, commentById.getComment());
+    }
+
+    @Test
+    public void testGetCommentsFromProfile() {
+	List<Comment> descriptions = commentsDao.getCommentsFromItem(TEST_COMMENT_PROFILE_ID);
+	assertNotNull(descriptions);
+
+	int size = descriptions.size();
+	Comment comment1 = createTestComment();
+	comment1.setComponentId(TEST_COMMENT_PROFILE_ID);
+	comment1.setUserId(TEST_COMMENT_USER_ID);
+	commentsDao.save(comment1);
+
+	descriptions = commentsDao.getCommentsFromItem(TEST_COMMENT_PROFILE_ID);
+	assertEquals(size + 1, descriptions.size());
+
+	Comment comment2 = createTestComment();
+	comment2.setComponentId(TEST_COMMENT_PROFILE_ID);
+	comment2.setUserId(TEST_COMMENT_USER_ID);
+	commentsDao.save(comment2);
+
+	descriptions = commentsDao.getCommentsFromItem(TEST_COMMENT_PROFILE_ID);
+	assertEquals(size + 2, descriptions.size());
+    }
+
+    @Test
+    public void testGetCommentsFromComponent() {
+	List<Comment> descriptions = commentsDao.getCommentsFromItem(TEST_COMMENT_COMPONENT_ID);
+	assertNotNull(descriptions);
+
+	int size = descriptions.size();
+	Comment comment1 = createTestComment();
+	comment1.setComponentId(TEST_COMMENT_COMPONENT_ID);
+	comment1.setUserId(TEST_COMMENT_USER_ID);
+	commentsDao.saveAndFlush(comment1);
+
+	descriptions = commentsDao.getCommentsFromItem(TEST_COMMENT_COMPONENT_ID);
+	assertEquals(size + 1, descriptions.size());
+
+	Comment comment2 = createTestComment();
+	comment2.setComponentId(TEST_COMMENT_COMPONENT_ID);
+	comment2.setUserId(TEST_COMMENT_USER_ID);
+	commentsDao.saveAndFlush(comment2);
+
+	descriptions = commentsDao.getCommentsFromItem(TEST_COMMENT_COMPONENT_ID);
+	assertEquals(size + 2, descriptions.size());
+    }
+
+    @Test
+    public void testGetAllComments() {
+	assertEquals(0, commentsDao.getAllComments().size());
+    }
+
+    @Test
+    public void testGetComment() {
+	Comment comment = createTestComment();
+	comment.setUserId(8);
+	commentsDao.saveAndFlush(comment);
+
+	assertNotNull(commentsDao.getByComment(TEST_COMMENT_NAME));
+	assertNull(commentsDao.getByComment("NON_EXISTENT_COMMENT_NAME"));
+    }
+
+    @Test
+    public void testSetDelete() {
+	Comment comment = createTestComment();
+	int count = commentsDao.getAllComments().size();
+
+	comment.setUserId(8);
+	Number id = Long.parseLong(commentsDao.saveAndFlush(comment).getId());
+	assertNotNull(id);
+	assertEquals(count + 1, commentsDao.getAllComments().size());
+	assertNotNull(commentsDao.getByComment(comment.getComment()));
+
+	comment.setId(id.toString());
+	commentsDao.delete(comment);
+	assertEquals(count, commentsDao.getAllComments().size());
+
+	assertNull(commentsDao.getByComment(comment.getComment()));
+    }
+
+    public static Comment createTestComment() {
+	Comment testComment = new Comment();
+	testComment.setComment(TEST_COMMENT_NAME);
+	testComment.setCommentDate(TEST_COMMENT_DATE);
+	testComment.setUserId(TEST_COMMENT_USER_ID);
+	testComment.setUserName(TEST_COMMENT_USER_NAME);
+	return testComment;
+    }
+    public final static String TEST_COMMENT_ID = "1";
+    public final static String TEST_COMMENT_PROFILE_ID = "clarin.eu:cr1:p_1297242111880";
+    public final static String TEST_COMMENT_COMPONENT_ID = "clarin.eu:cr1:c_1290431694600";
+    public final static String TEST_COMMENT_NAME = "test";
+    public final static int TEST_COMMENT_USER_ID = 8;
+    public final static String TEST_COMMENT_USER_NAME = "J. Unit";
+    public final static Date TEST_COMMENT_DATE = new Date();
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentDescriptionDaoTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentDescriptionDaoTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentDescriptionDaoTest.java	(revision 5961)
@@ -0,0 +1,36 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import static clarin.cmdi.componentregistry.impl.database.ComponentRegistryTestDatabase.*;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.rest.RegistryTestHelper;
+
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class ComponentDescriptionDaoTest extends AbstractDescriptionDaoTest {
+
+    @Autowired
+    ComponentDao componentDao;
+
+    @Override
+    protected ComponentDao getDao() {
+	return componentDao;
+    }
+
+    @Override
+    protected BaseDescription createNewDescription() {
+	return ComponentDescription.createNewDescription();
+    }
+
+    @Override
+    protected String getContentString() {
+	return RegistryTestHelper.getComponentTestContentString();
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryFactoryDbImplTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryFactoryDbImplTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryFactoryDbImplTest.java	(revision 5961)
@@ -0,0 +1,127 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.junit.Before;
+
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentStatus;
+import clarin.cmdi.componentregistry.OwnerUser;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserCredentials;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.rest.DummyPrincipal;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+
+/**
+ * 
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class ComponentRegistryFactoryDbImplTest extends BaseUnitTest {
+
+    @Autowired
+    private ComponentRegistryFactoryDbImpl componentRegistryFactory;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Before
+    public void init() {
+	ComponentRegistryTestDatabase.resetDatabase(jdbcTemplate);
+	ComponentRegistryTestDatabase.createTableRegistryUser(jdbcTemplate);
+    }
+
+    @Test
+    public void testInjection() {
+	assertNotNull(componentRegistryFactory);
+	assertNotNull(jdbcTemplate);
+    }
+
+    @Test
+    public void testGetPublicRegistry() {
+	ComponentRegistry registry = componentRegistryFactory
+		.getPublicRegistry();
+	assertNotNull(registry);
+        
+    }
+    
+    @Test
+    public void testGetBaseRegistry() {
+	ComponentRegistryDbImpl registry = componentRegistryFactory.getBaseRegistry(DummyPrincipal.DUMMY_CREDENTIALS);
+	assertNotNull(registry);
+        assertNotNull(registry.getRegistryOwner());
+        
+    }
+
+    @Test
+    public void getComponentRegistry() throws UserUnauthorizedException {
+	// Get public
+	assertNotNull(componentRegistryFactory.getComponentRegistry(
+		RegistrySpace.PUBLISHED, null, null, null));
+
+	// Get for non-existing user
+	final RegistryUser testUser = UserDaoTest.createTestUser();
+	UserCredentials credentials = new DummyPrincipal(
+		testUser.getPrincipalName()).getCredentials();
+
+	ComponentRegistryDbImpl cr1 = (ComponentRegistryDbImpl) componentRegistryFactory
+		.getComponentRegistry(RegistrySpace.PRIVATE, null,
+			credentials,null);
+	assertNotNull(cr1);
+	// Get for existing user
+	ComponentRegistryDbImpl cr2 = (ComponentRegistryDbImpl) componentRegistryFactory
+		.getComponentRegistry(RegistrySpace.PRIVATE, null,
+			credentials, null);
+	;
+	assertNotNull(cr2);
+	assertEquals(cr1.getRegistryOwner(), cr2.getRegistryOwner());
+
+	// Get for another new user
+	UserCredentials credentials2 = new DummyPrincipal(
+		testUser.getPrincipalName() + "2").getCredentials();
+	ComponentRegistryDbImpl cr3 = (ComponentRegistryDbImpl) componentRegistryFactory
+		.getComponentRegistry(RegistrySpace.PRIVATE, null,
+			credentials2, null);
+	assertNotNull(cr3);
+	assertNotSame(cr1.getRegistryOwner(), cr3.getRegistryOwner());
+    }
+
+    @Test
+    public void testGetOtherUserComponentRegistry()
+	    throws UserUnauthorizedException {
+	UserCredentials userCredentials = DummyPrincipal.DUMMY_PRINCIPAL
+		.getCredentials();
+
+	// Create registry for new user
+	ComponentRegistryDbImpl cr1 = (ComponentRegistryDbImpl) componentRegistryFactory
+		.getComponentRegistry(RegistrySpace.PRIVATE, null,
+			userCredentials, null);
+
+	Number id = cr1.getRegistryOwner().getId();
+
+	// Get it as admin
+	ComponentRegistryDbImpl cr2 = (ComponentRegistryDbImpl) componentRegistryFactory
+		.getOtherUserComponentRegistry(
+			DummyPrincipal.DUMMY_ADMIN_PRINCIPAL, new OwnerUser(id));
+	assertNotNull(cr2);
+	// Should be this user's registry
+	assertEquals(cr1.getRegistryOwner(), cr2.getRegistryOwner());
+
+	// Try get it as non-admin
+	try {
+	    componentRegistryFactory.getOtherUserComponentRegistry(
+		    DummyPrincipal.DUMMY_PRINCIPAL, new OwnerUser(id));
+	    fail("Non-admin can get other user's component registry");
+	} catch (Exception ex) {
+	    // Exception should occur
+	}
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryTestDatabase.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryTestDatabase.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ComponentRegistryTestDatabase.java	(revision 5961)
@@ -0,0 +1,100 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+
+/**
+ *
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ */
+public final class ComponentRegistryTestDatabase {
+
+    private ComponentRegistryTestDatabase() {
+    }
+
+    public static void resetDatabase(JdbcTemplate jdbcTemplate) {
+        jdbcTemplate.execute("DROP SCHEMA PUBLIC CASCADE");
+    }
+    
+    
+
+    public static void createTablePersistentComponents(JdbcTemplate jdbcTemplate) {
+	jdbcTemplate.execute("create sequence basedescription_id_seq start with 1 increment by 1");
+	
+	jdbcTemplate.execute("CREATE TABLE basedescription ("
+                + "id IDENTITY NOT NULL,"
+                + "  user_id integer,"
+                + "  is_public boolean NOT NULL,"
+                + "  is_deleted boolean DEFAULT false NOT NULL,"
+                + "  component_id VARCHAR(255) NOT NULL,"
+                + "  name VARCHAR(255) NOT NULL,"
+                + "  description VARCHAR(255) NOT NULL,"
+                + "  registration_date timestamp,"// with timezone,"
+                + "  href VARCHAR(255),"
+                + "  creator_name VARCHAR(255),"
+                + "  domain_name VARCHAR(255),"
+                + "  group_name VARCHAR(255), "
+                + "  content VARCHAR(10240) DEFAULT '' NOT NULL, "
+                + "  show_in_editor boolean DEFAULT true NOT NULL, "
+                + "  CONSTRAINT UNIQUE_PROFILE_ID UNIQUE (component_id));");
+    }
+
+
+    public static void createTableRegistryUser(JdbcTemplate jdbcTemplate) {
+	jdbcTemplate.execute("create sequence registry_user_id_seq start with 1 increment by 1");
+        jdbcTemplate.execute("CREATE TABLE registry_user ("
+                + " id IDENTITY NOT NULL,"
+                + " name VARCHAR(255),"
+                + " principal_name VARCHAR(255));");
+    }
+
+    public static void createTableComments(JdbcTemplate jdbcTemplate) {
+	jdbcTemplate.execute("create sequence comments_id_seq start with 1 increment by 1");
+        jdbcTemplate.execute("CREATE TABLE comments ("
+                + "id IDENTITY NOT NULL,"
+                + "user_id integer,"
+                + "  component_id VARCHAR(255),"               
+                + "  comments VARCHAR(255) NOT NULL,"
+                + "  comment_date timestamp,"
+		+ "  user_name VARCHAR(255)"
+                + "  );");
+    }
+    
+    public static void createTableGroup(JdbcTemplate jdbcTemplate) {
+        jdbcTemplate.execute("CREATE TABLE usergroup ("
+                + "id int GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) not null,"
+                + "ownerId integer NOT NULL,"
+                + "  name VARCHAR(255) NOT NULL,"
+                + "constraint usergroup_ID primary key (id)"
+                + ");");
+    }
+    
+    public static void createTableOwnership(JdbcTemplate jdbcTemplate) {
+        jdbcTemplate.execute("CREATE TABLE ownership ("
+                + "id int GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) not null,"
+                + "componentId VARCHAR(255),"
+                + "groupId int,"
+                + "userId int,"
+                + "constraint ownership_id primary key (id)"
+                + ");");
+    }
+    
+    public static void createTableGroupMembership(JdbcTemplate jdbcTemplate) {
+        jdbcTemplate.execute("CREATE TABLE groupmembership ("
+                + "id int GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) not null,"
+                + "groupId integer,"
+                + "userId integer,"
+                + "constraint groupmembership_id primary key (id)"
+                + ");");
+    }
+
+    public static void resetAndCreateAllTables(JdbcTemplate jdbcTemplate) {
+        resetDatabase(jdbcTemplate);
+        createTablePersistentComponents(jdbcTemplate);
+        createTableRegistryUser(jdbcTemplate);
+        createTableComments(jdbcTemplate);
+        createTableGroup(jdbcTemplate);
+        createTableOwnership(jdbcTemplate);
+        createTableGroupMembership(jdbcTemplate);
+      
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/GroupServiceImplTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/GroupServiceImplTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/GroupServiceImplTest.java	(revision 5961)
@@ -0,0 +1,455 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.Ownership;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.persistence.jpa.GroupDao;
+import clarin.cmdi.componentregistry.persistence.jpa.OwnershipDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+import clarin.cmdi.componentregistry.rest.DummyPrincipal;
+import static org.junit.Assert.*;
+
+public class GroupServiceImplTest extends BaseUnitTest {
+
+    @Autowired
+    GroupService groupService;
+    @Autowired
+    UserDao userDao;
+
+    @Autowired
+    GroupDao groupDao;
+    
+    @Autowired
+    OwnershipDao ownershipDao;
+
+    @Autowired
+    ComponentDao componentDescriptionDao;
+
+    RegistryUser user;
+    RegistryUser user2;
+    RegistryUser user3;
+
+    protected BaseDescription makeTestProfile(String sid, boolean isPublic, long ownerId) {
+	ProfileDescription profile = new ProfileDescription();
+	profile.setDescription("some description");
+	profile.setId(ProfileDescription.PROFILE_PREFIX+sid);
+	profile.setName("profilename");
+        profile.setCreatorName(DummyPrincipal.DUMMY_PRINCIPAL.getName());
+	Number id = componentDescriptionDao.insertDescription(profile, "someContent",
+		isPublic, ownerId);
+	return componentDescriptionDao.getById(id);
+    }
+
+    protected BaseDescription makeTestComponent(boolean isPublic,
+	    long ownerId) {
+	BaseDescription componentDescription = new BaseDescription();
+	componentDescription.setDescription("some description");
+	componentDescription.setId(ComponentDescription.COMPONENT_PREFIX+"4567");
+	componentDescription.setName("componentname");
+        componentDescription.setCreatorName(DummyPrincipal.DUMMY_PRINCIPAL.getName());
+	Number id = componentDescriptionDao.insertDescription(
+		componentDescription, "someContent", isPublic, ownerId);
+	return componentDescriptionDao.getById(id);
+    }
+
+    @Before
+    public void setupThisTest() {
+	user = new RegistryUser();
+	user.setName("Test User");
+	user.setPrincipalName(DummyPrincipal.DUMMY_CREDENTIALS
+		.getPrincipalName());
+	user = userDao.saveAndFlush(user);
+	user = userDao.getByPrincipalName(user.getPrincipalName());
+
+	user2 = new RegistryUser();
+	user2.setName("Test User 2");
+	user2.setPrincipalName(DummyPrincipal.DUMMY_CREDENTIALS
+		.getPrincipalName() + "2");
+	user2 = userDao.saveAndFlush(user2);
+	user2 = userDao.getByPrincipalName(user2.getPrincipalName());
+
+	user3 = new RegistryUser();
+	user3.setName("Test User 3");
+	user3.setPrincipalName(DummyPrincipal.DUMMY_CREDENTIALS
+		.getPrincipalName() + "3");
+	user3 = userDao.saveAndFlush(user3);
+	user3 = userDao.getByPrincipalName(user3.getPrincipalName());
+    }
+
+    @Test
+    public void testCreateNewGroup_getGroupsOwnedByUser() {
+	// Expect no groups for the current user
+	List<Group> groups = groupService.getGroupsOwnedByUser(user
+		.getPrincipalName());
+	assertTrue(groups.isEmpty());
+
+	// Make a group
+	Group group1 = groupDao.findOne(groupService.createNewGroup("Group 1",
+		user.getPrincipalName()));
+	// and another one
+	Group group2 = groupDao.findOne(groupService.createNewGroup("Group 2",
+		user.getPrincipalName()));
+	groups = groupService.getGroupsOwnedByUser(user.getPrincipalName());
+	assertEquals(2, groups.size());
+
+	assertTrue(groups.contains(group1));
+	assertTrue(groups.contains(group2));
+    }
+
+    @Test(expected = ValidationException.class)
+    public void testCreateDuplicateGroup() {
+	// Make a group
+	groupService.createNewGroup("Group X", user.getPrincipalName());
+	// Make same group, again
+	groupService.createNewGroup("Group X", user.getPrincipalName());
+    }
+
+    @Test
+    public void testAccessToNonOwnedPrivateProfile() {
+	// Make a private profile that belongs to someone else
+	BaseDescription profile = makeTestProfile("4567", false, 9999);
+	// Expect that user can't access profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profile);
+	assertFalse(result);
+    }
+
+    @Test
+    public void testAccessToNonOwnedPublicProfile() {
+	// Make a public profile that belongs to someone else
+	BaseDescription profile = makeTestProfile("4567", true, 9999);
+
+	// Expect that user can access the profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profile);
+	assertTrue(result);
+    }
+
+    @Test
+    public void testAccessToOwnedPrivateProfile() {
+	// Make a profile that belongs to someone else
+	BaseDescription profile = makeTestProfile("4567", false, user.getId()
+		.longValue());
+	// Add an ownership to that profile to the current user
+	Ownership ownership = new Ownership();
+	ownership.setComponentId(profile.getId());
+	ownership.setUserId(user.getId().longValue());
+	groupService.addOwnership(ownership);
+
+	// Expect that user can access the profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profile);
+	assertTrue(result);
+    }
+
+    @Test
+    public void testAccessViaGroupToPrivateProfile() throws ItemNotFoundException{
+	// Make a profile that belongs to someone else
+	BaseDescription profile = makeTestProfile("4567", false, 9999);
+
+	// Make a group that belongs to someone else
+	Group group = groupDao.findOne(groupService.createNewGroup("Group 1",
+		user2.getPrincipalName()));
+
+	groupService.makeMember(user.getPrincipalName(),
+		group.getName());
+	// Make me a member of that group
+
+	// Add an ownership to that profile to the group
+	Ownership ownership = new Ownership();
+	ownership.setComponentId(profile.getId());
+	ownership.setGroupId(group.getId());
+	groupService.addOwnership(ownership);
+
+	// Expect that user can access the profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profile);
+	assertTrue(result);
+    }
+
+    @Test
+    public void testAccessToNonOwnedPrivateComponent() {
+	// Make a private profile that belongs to someone else
+	BaseDescription componentDescription = makeTestComponent(false,
+		9999);
+
+	// Expect that user can't access profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, componentDescription);
+	assertFalse(result);
+    }
+
+    @Test
+    public void testAccessToNonOwnedPublicComponent() {
+	// Make a public profile that belongs to someone else
+	BaseDescription componentDescription = makeTestComponent(true,
+		9999);
+
+	// Expect that user can access the profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, componentDescription);
+	assertTrue(result);
+    }
+
+    @Test
+    public void testAccessToOwnedPrivateComponent() {
+	// Make a profile that belongs to someone else
+	BaseDescription componentDescription = makeTestComponent(false,
+		9999);
+
+	// Add an ownership to that profile to the current user
+	Ownership ownership = new Ownership();
+	ownership.setComponentId(componentDescription.getId());
+	ownership.setUserId(user.getId().longValue());
+	groupService.addOwnership(ownership);
+
+	// Expect that user can access the profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, componentDescription);
+	assertTrue(result);
+    }
+
+    @Test
+    public void testAccessViaGroupToPrivateComponent() throws ItemNotFoundException{
+	// Make a profile that belongs to someone else
+	BaseDescription componentDescription = makeTestComponent(false,
+		user3.getId().longValue());
+
+	// Make a group that belongs to someone else
+	Group group = groupDao.findOne(groupService.createNewGroup("Group 1",
+		user2.getPrincipalName()));
+
+	// Make me a member of that group
+	groupService.makeMember(user.getPrincipalName(),
+		group.getName());
+
+	// Add an ownership to that component to the group
+	Ownership ownership = new Ownership();
+	ownership.setComponentId(componentDescription.getId());
+	ownership.setGroupId(group.getId());
+	groupService.addOwnership(ownership);
+
+	// Expect that user can access the profile
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, componentDescription);
+	assertTrue(result);
+    }
+
+    @Test
+    public void testTransferComponentOwnershipFromUserToGroup()  throws UserUnauthorizedException, ItemNotFoundException{
+
+	// Make a group
+	Group group = groupDao.findOne(groupService.createNewGroup("Group 1",
+		user.getPrincipalName()));
+
+	// Make user and user2 members of the same group
+	groupService.makeMember(user.getPrincipalName(), group.getName());
+	
+	assertTrue(groupService.getGroupsOfWhichUserIsAMember(user.getPrincipalName()).contains(group));
+	groupService.makeMember(user2.getPrincipalName(), group.getName());
+	assertTrue(groupService.getGroupsOfWhichUserIsAMember(user2.getPrincipalName()).contains(group));
+
+	// Make a component that belongs to user
+	BaseDescription componentDescription = makeTestComponent(false,
+		user.getId().longValue());
+
+	// Just for the fun of it: check that user can access the component
+	// while user2 can't
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, componentDescription);
+	assertTrue(result);
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user2, componentDescription);
+	assertFalse(result);
+
+	// user transfers ownership of the component to his group
+	groupService.transferItemOwnershipToGroup(
+		user.getPrincipalName(), group.getName(), componentDescription.getId());
+	
+	List<Ownership> ownerships = (List<Ownership>)ownershipDao.findAll();
+
+	// Check that user and user2 have access to the component...
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, componentDescription);
+	assertTrue(result);
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user2, componentDescription);
+	assertTrue(result);
+
+	// ... but someone unreleated not
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user3, componentDescription);
+	assertFalse(result);
+    }
+
+    @Test
+    public void testtransferComponentOwnershipFromUserToGroup()  throws UserUnauthorizedException, ItemNotFoundException{
+
+	// Make a group
+	Group group = groupDao.findOne(groupService.createNewGroup("Group 1",
+		user.getPrincipalName()));
+
+	// Make user and user2 members of the same group
+	groupService.makeMember(user.getPrincipalName(), group.getName());
+	
+	assertTrue(groupService.getGroupsOfWhichUserIsAMember(user.getPrincipalName()).contains(group));
+	groupService.makeMember(user2.getPrincipalName(), group.getName());
+	assertTrue(groupService.getGroupsOfWhichUserIsAMember(user2.getPrincipalName()).contains(group));
+
+	// Make a profile that belongs to user
+	BaseDescription profileDescription= makeTestProfile("4567", false,
+		user.getId().longValue());
+
+	// Just for the fun of it: check that user can access the profile
+	// while user2 can't
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profileDescription);
+	assertTrue(result);
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user2, profileDescription);
+	assertFalse(result);
+
+	// user transfers ownership of the component to his group
+	groupService.transferItemOwnershipToGroup(
+		user.getPrincipalName(), group.getName(),
+		profileDescription.getId());
+	
+	List<Ownership> ownerships = (List<Ownership>)ownershipDao.findAll();
+
+	// Check that user and user2 have access to the component...
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profileDescription);
+	assertTrue(result);
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user2, profileDescription);
+	assertTrue(result);
+
+	// ... but someone unreleated not
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user3, profileDescription);
+	assertFalse(result);
+    }
+
+    @Test
+    public void testTransferItemOwnershipFromUserToGroup()  throws UserUnauthorizedException, ItemNotFoundException{
+	//TODO: improve test by mixing in components and exclusing components/profiles
+	// Make a group
+	Group group = groupDao.findOne(groupService.createNewGroup("Group 1",
+		user.getPrincipalName()));
+
+	// Make user and user2 members of the same group
+	groupService.makeMember(user.getPrincipalName(), group.getName());
+	
+	assertTrue(groupService.getGroupsOfWhichUserIsAMember(user.getPrincipalName()).contains(group));
+	groupService.makeMember(user2.getPrincipalName(), group.getName());
+	assertTrue(groupService.getGroupsOfWhichUserIsAMember(user2.getPrincipalName()).contains(group));
+
+	// Make a profile that belongs to user
+	BaseDescription profileDescription= makeTestProfile("4567", false,
+		user.getId().longValue());
+
+	// Just for the fun of it: check that user can access the profile
+	// while user2 can't
+	boolean result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profileDescription);
+	assertTrue(result);
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user2, profileDescription);
+	assertFalse(result);
+
+	// user transfers ownership of the component to his group
+	groupService.transferItemOwnershipToGroup(
+		user.getPrincipalName(), group.getName(),
+		profileDescription.getId());
+	
+	List<Ownership> ownerships = (List<Ownership>)ownershipDao.findAll();
+
+	// Check that user and user2 have access to the component...
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user, profileDescription);
+	assertTrue(result);
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user2, profileDescription);
+	assertTrue(result);
+
+	// ... but someone unreleated not
+	result = groupService
+		.canUserAccessComponentEitherOnHisOwnOrThroughGroupMembership(
+			user3, profileDescription);
+	assertFalse(result);
+    }
+
+    @Test
+    public void testGetGroupsTheItemIsAMemberOf()  throws UserUnauthorizedException, ItemNotFoundException{
+	// Make a group
+	Group group1 = groupDao.findOne(groupService.createNewGroup("Group 1",
+		user.getPrincipalName()));
+
+	// And another one which the item is not assigned to. will use to test exclusion
+	Group group2 = groupDao.findOne(groupService.createNewGroup("Group 2",
+		user.getPrincipalName()));
+
+	// Make user members of the same group
+	groupService.makeMember(user.getPrincipalName(), group1.getName());
+	// Make user members of the same group
+	groupService.makeMember(user.getPrincipalName(), group2.getName());
+
+	// Make a profile that belongs to user
+	BaseDescription profileDescription= makeTestProfile("4567", false,
+		user.getId().longValue());
+
+	// Make a profile that belongs to user, but that one will belong to group2
+	BaseDescription profileDescription2= makeTestProfile("666", false,
+		user.getId().longValue());
+
+	// user transfers ownership of the profile to his group
+	groupService.transferItemOwnershipToGroup(
+		user.getPrincipalName(), group1.getName(),
+		profileDescription.getId());
+
+	// user transfers ownership of the profile to his group
+	groupService.transferItemOwnershipToGroup(
+		user.getPrincipalName(), group2.getName(),
+		profileDescription2.getId());
+
+	List<Group> groups = groupService.getGroupsTheItemIsAMemberOf(profileDescription.getId());
+	assertEquals(1, groups.size());
+	Group g = groups.get(0);
+	assertEquals(group1.getId(), g.getId());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ProfileDescriptionDaoTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ProfileDescriptionDaoTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/ProfileDescriptionDaoTest.java	(revision 5961)
@@ -0,0 +1,35 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+import clarin.cmdi.componentregistry.rest.RegistryTestHelper;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class ProfileDescriptionDaoTest extends AbstractDescriptionDaoTest {
+
+    @Autowired
+    ComponentDao profileDescriptionDao;
+
+    @Override
+    protected ComponentDao getDao() {
+	return profileDescriptionDao;
+    }
+
+    @Override
+    protected BaseDescription createNewDescription() {
+	return ProfileDescription.createNewDescription();
+    }
+
+    @Override
+    protected String getContentString() {
+	return RegistryTestHelper.getProfileTestContentString();
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/TestTransactionRollbacks.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/TestTransactionRollbacks.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/TestTransactionRollbacks.java	(revision 5961)
@@ -0,0 +1,66 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import java.util.Date;
+
+import static org.junit.Assert.*;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.transaction.TransactionConfiguration;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.persistence.ComponentDao;
+
+/**
+ * Test transactionality on comments
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+@TransactionConfiguration(defaultRollback = true)
+public class TestTransactionRollbacks extends BaseUnitTest {
+
+    @Autowired
+    JdbcTemplate jdbcTemplate;
+    @Autowired
+    ComponentDao componentDescriptionDao;
+
+    @Test
+    public void test01() {
+	ComponentRegistryTestDatabase.resetAndCreateAllTables(jdbcTemplate);
+    }
+
+    @Test(expected = DataAccessException.class)
+    public void test02() {
+	BaseDescription cd1 = componentDescriptionDao.getByCmdId("c1");
+	assertNull(cd1);
+
+	BaseDescription cd = new BaseDescription();
+	cd.setCreatorName("user 123");
+	cd.setDescription("description");
+	cd.setDomainName("domain name");
+	cd.setGroupName("group name");
+	cd.setHref("href");
+	cd.setName("name");
+	cd.setRegistrationDate(new Date());
+	cd.setUserId("123");
+	cd.setId(ComponentDescription.COMPONENT_PREFIX+"c1");
+	componentDescriptionDao.insertDescription(cd, "Content 1", false, 123);
+
+	cd1 = componentDescriptionDao.getByCmdId(ComponentDescription.COMPONENT_PREFIX+"c1");
+	assertNotNull(cd1);
+	componentDescriptionDao.insertDescription(cd, "Content 1", false, 123);
+	fail("Expected second insert to fail");
+    }
+
+    @Test
+    public void test03() {
+	BaseDescription cd1 = componentDescriptionDao.getByCmdId("c1");
+	assertNull(cd1);
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/UserDaoTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/UserDaoTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/impl/database/UserDaoTest.java	(revision 5961)
@@ -0,0 +1,92 @@
+package clarin.cmdi.componentregistry.impl.database;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+/**
+ * 
+ * @author Twan Goosen <twan.goosen@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class UserDaoTest extends BaseUnitTest {
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    @Autowired
+    private UserDao userDao;
+
+    @Before
+    public void init() {
+	ComponentRegistryTestDatabase.resetDatabase(jdbcTemplate);
+	ComponentRegistryTestDatabase.createTableRegistryUser(jdbcTemplate);
+    }
+
+    @Test
+    public void testInjection() {
+	assertNotNull(jdbcTemplate);
+	assertNotNull(userDao);
+    }
+
+    @Test
+    public void testInsertUser() {
+	RegistryUser testUser = createTestUser();
+
+	assertEquals(0, userDao.getAllUsers().size());
+	Number newId = userDao.save(testUser).getId();
+	assertNotNull(newId);
+
+	List<RegistryUser> users = userDao.getAllUsers();
+	assertEquals(1, users.size());
+
+	assertEquals(TEST_USER_NAME, users.get(0).getName());
+	assertEquals(TEST_USER_PRINCIPAL_NAME, users.get(0).getPrincipalName());
+    }
+
+    @Test
+    public void testGetAllUsers() {
+	assertEquals(0, userDao.getAllUsers().size());
+    }
+
+    @Test
+    public void testGetUserByPrincipalName() {
+	RegistryUser testUser = createTestUser();
+	userDao.save(testUser);
+
+	assertNotNull(userDao.getByPrincipalName(TEST_USER_PRINCIPAL_NAME));
+	assertNull(userDao.getByPrincipalName("NON-EXISTING PRINCIPAL NAME"));
+    }
+
+    public static RegistryUser createTestUser() {
+	RegistryUser testUser = new RegistryUser();
+	testUser.setName(TEST_USER_NAME);
+	testUser.setPrincipalName(TEST_USER_PRINCIPAL_NAME);
+	return testUser;
+    }
+
+    @Test
+    public void testUpdateUser() {
+	RegistryUser testUser = createTestUser();
+	testUser = userDao.saveAndFlush(testUser);
+	Number id = testUser.getId();
+	testUser.setName("I. Changed");
+	userDao.save(testUser);
+
+	assertEquals("I. Changed", userDao.findOne(id.longValue()).getName());
+    }
+
+    public final static String TEST_USER_NAME = "Aap";
+    public final static String TEST_USER_PRINCIPAL_NAME = "aap@clarin.eu";
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/CommentResponseTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/CommentResponseTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/CommentResponseTest.java	(revision 5961)
@@ -0,0 +1,100 @@
+package clarin.cmdi.componentregistry.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.MDMarshaller;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Date;
+
+import javax.xml.transform.TransformerException;
+
+import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.Before;
+import org.junit.Test;
+/**
+ *
+ * @author jean-charles FerriÃšres <jean-charles.ferrieres@mpi.nl>
+ * @author george.georgovassilis@mpi.nl
+ */
+public class CommentResponseTest extends BaseUnitTest{
+
+    private Date testDate = new Date();
+
+    /**
+     * Test with no validate attribute should return errors
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testRegisterError() throws Exception {
+	CommentResponse resp = new CommentResponse();
+	resp.setRegistered(false);
+	resp.setIsPrivate(true);
+	resp.addError("Error 1");
+	resp.addError("Error 2, <!-- to be escaped -->");
+	ByteArrayOutputStream out = new ByteArrayOutputStream();
+	marshaller.marshal(resp, out);
+	String expected = "";
+	expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	expected += "<commentResponse registered=\"false\" isPrivate=\"true\" xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	expected += "    <errors>\n";
+	expected += "        <error>Error 1</error>\n";
+	expected += "        <error>Error 2, &lt;!-- to be escaped --&gt;</error>\n";
+	expected += "    </errors>\n";
+	expected += "</commentResponse>\n";
+		assertXMLEqual(expected, out.toString());
+
+	CommentResponse rr = marshaller.unmarshal(CommentResponse.class, new ByteArrayInputStream(expected.getBytes()), null);
+	assertFalse(rr.isRegistered());
+	assertEquals(2, rr.getErrors().size());
+    }
+
+    /**
+     * Test successfully processed
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testRegisterSucces() throws Exception {
+	CommentResponse resp = new CommentResponse();
+	resp.setRegistered(true);
+	resp.setIsPrivate(false);
+	resp.setComment(getComment());
+	ByteArrayOutputStream out = new ByteArrayOutputStream();
+	marshaller.marshal(resp, out);
+	String expected = "";
+	expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	expected += "<commentResponse registered=\"true\" isPrivate=\"false\" xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	expected += "    <errors/>\n";
+	expected += "    <comment>\n";
+	expected += "        <comments>Name</comments>\n";
+	expected += "        <commentDate>"+DatesHelper.formatXmlDateTime(testDate)+"</commentDate>\n";
+	expected += "        <componentId>myD</componentId>\n";
+	expected += "        <id>myId</id>\n";
+	expected += "        <userName>J. Unit</userName>\n";
+	expected += "        <canDelete>false</canDelete>\n";
+	expected += "    </comment>\n";
+	expected += "</commentResponse>\n";
+	assertXMLEqual(expected, out.toString());
+
+	CommentResponse rr = marshaller.unmarshal(CommentResponse.class, new ByteArrayInputStream(expected.getBytes()), null);
+	assertTrue(rr.isRegistered());
+	assertEquals("myId", rr.getComment().getId());
+    }
+
+    private Comment getComment() {
+	Comment com = new Comment();
+	com.setComment("Name");
+	com.setId("myId");
+	com.setUserId(123);
+	com.setComponentId("myD");
+	com.setCommentDate(testDate);
+	com.setUserName("J. Unit");
+	return com;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/CommentTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/CommentTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/CommentTest.java	(revision 5961)
@@ -0,0 +1,83 @@
+package clarin.cmdi.componentregistry.model;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.MDMarshaller;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Date;
+
+import javax.xml.transform.TransformerException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ *
+ * @author jeafer
+ */
+public class CommentTest extends BaseUnitTest{
+
+    @Test
+    public void testProfileComment() throws Exception {
+	Comment comment1 = new Comment();
+	Date testDate = new Date();
+	comment1.setCommentDate(testDate);
+	comment1.setComment("tester");
+	comment1.setId("1");
+	comment1.setComponentId("clarin.eu:cr1:p_1297242111880");
+	comment1.setUserId(8);
+	comment1.setUserName("J. Unit");
+
+	ByteArrayOutputStream out = new ByteArrayOutputStream();
+	marshaller.marshal(comment1, out);
+	String expected = "";
+	expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	expected += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	expected += "    <comments>tester</comments>\n";
+	expected += "    <commentDate>"+DatesHelper.formatXmlDateTime(testDate)+"</commentDate>\n";
+	expected += "    <componentId>clarin.eu:cr1:p_1297242111880</componentId>\n";
+	expected += "    <id>1</id>\n";
+	expected += "    <userName>J. Unit</userName>\n";
+	expected += "    <canDelete>false</canDelete>\n";
+	expected += "</comment>\n";
+	assertEquals(expected, out.toString());
+
+	Comment comment = marshaller.unmarshal(Comment.class, new ByteArrayInputStream(expected.getBytes()), null);
+	assertEquals(comment1.getId(), comment.getId());
+	assertEquals(comment1.getComponentId(), comment.getComponentId());
+    }
+
+    @Test
+    public void testComponentComment() throws Exception {
+	Comment comment1 = new Comment();
+	Date testDate = new Date();
+	comment1.setCommentDate(testDate);
+	comment1.setComment("tester");
+	comment1.setId("1");
+	comment1.setComponentId("clarin.eu:cr1:c_1297242111880");
+	comment1.setUserId(8);
+	comment1.setUserName("J. Unit");
+
+	ByteArrayOutputStream out = new ByteArrayOutputStream();
+	marshaller.marshal(comment1, out);
+	String expected = "";
+	expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	expected += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	expected += "    <comments>tester</comments>\n";
+	expected += "    <commentDate>"+DatesHelper.formatXmlDateTime(testDate)+"</commentDate>\n";
+	expected += "    <componentId>clarin.eu:cr1:c_1297242111880</componentId>\n";
+	expected += "    <id>1</id>\n";
+	expected += "    <userName>J. Unit</userName>\n";
+	expected += "    <canDelete>false</canDelete>\n";
+	expected += "</comment>\n";
+	assertEquals(expected, out.toString());
+
+	Comment comment = marshaller.unmarshal(Comment.class, new ByteArrayInputStream(expected.getBytes()), null);
+	assertEquals(comment1.getId(), comment.getId());
+	assertEquals(comment1.getComponentId(), comment.getComponentId());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/ComponentDescriptionTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/ComponentDescriptionTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/ComponentDescriptionTest.java	(revision 5961)
@@ -0,0 +1,61 @@
+package clarin.cmdi.componentregistry.model;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+
+import javax.xml.bind.JAXBException;
+
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.MDMarshaller;
+
+import javax.xml.transform.TransformerException;
+
+import org.junit.Before;
+
+public class ComponentDescriptionTest extends BaseUnitTest{
+
+    private Date testDate = new Date();
+
+    @Test
+    public void testComponentToXml() throws JAXBException, UnsupportedEncodingException {
+        ComponentDescription desc = new ComponentDescription();
+        desc.setName("Name");
+        desc.setId(ComponentDescription.COMPONENT_PREFIX+"myId");
+        desc.setCreatorName("myC");
+        desc.setUserId("user1");
+        desc.setDescription("myD");
+        desc.setRegistrationDate(testDate);
+        desc.setHref("linkToMyComponent");
+        desc.setGroupName("MyGroup");
+        desc.setDomainName("Linguistics");
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        marshaller.marshal(desc, out);
+        String expected = "";
+        expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+        expected += "<componentDescription xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+        expected += "    <id>clarin.eu:cr1:c_myId</id>\n";
+        expected += "    <description>myD</description>\n";
+        expected += "    <name>Name</name>\n";
+        expected += "    <registrationDate>"+DatesHelper.formatXmlDateTime(testDate)+"</registrationDate>\n";
+        expected += "    <creatorName>myC</creatorName>\n";
+        expected += "    <userId>user1</userId>\n";
+        expected += "    <domainName>Linguistics</domainName>\n";
+        expected += "    <ns2:href>linkToMyComponent</ns2:href>\n";
+        expected += "    <groupName>MyGroup</groupName>\n";
+        expected += "    <commentsCount>0</commentsCount>\n";
+        expected += "</componentDescription>\n";
+        assertEquals(expected, out.toString());
+
+        ComponentDescription pd = marshaller.unmarshal(ComponentDescription.class, new ByteArrayInputStream(expected.getBytes()), null);
+        assertEquals(desc.getId(), pd.getId());
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/ProfileDescriptionTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/ProfileDescriptionTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/ProfileDescriptionTest.java	(revision 5961)
@@ -0,0 +1,68 @@
+package clarin.cmdi.componentregistry.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+
+import javax.xml.bind.JAXBException;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.MDMarshaller;
+
+import javax.xml.transform.TransformerException;
+
+import org.junit.Before;
+
+public class ProfileDescriptionTest extends BaseUnitTest{
+
+
+    private Date testDate = new Date();
+
+    @Test
+    public void testProfileToXml() throws JAXBException, UnsupportedEncodingException {
+	ProfileDescription desc = new ProfileDescription();
+	desc.setName("Name");
+	desc.setId(ProfileDescription.PROFILE_PREFIX+"myId");
+	desc.setCreatorName("myC");
+	desc.setUserId(DigestUtils.md5Hex("user1"));
+	desc.setDescription("myD");
+	desc.setRegistrationDate(testDate);
+	desc.setDomainName("Linguistics");
+	desc.setHref("linkToMyProfile");
+	desc.setGroupName("MyGroup");
+	desc.setCommentsCount(2);
+
+	ByteArrayOutputStream out = new ByteArrayOutputStream();
+	marshaller.marshal(desc, out);
+	String expected = "";
+	expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	expected += "<profileDescription xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	expected += "    <id>clarin.eu:cr1:p_myId</id>\n";
+	expected += "    <description>myD</description>\n";
+	expected += "    <name>Name</name>\n";
+	expected += "    <registrationDate>"+DatesHelper.formatXmlDateTime(testDate)+"</registrationDate>\n";
+	expected += "    <creatorName>myC</creatorName>\n";
+	expected += "    <userId>" + DigestUtils.md5Hex("user1") + "</userId>\n";
+	expected += "    <domainName>Linguistics</domainName>\n";
+	expected += "    <ns2:href>linkToMyProfile</ns2:href>\n";
+	expected += "    <groupName>MyGroup</groupName>\n";
+	expected += "    <commentsCount>2</commentsCount>\n";
+	expected += "    <showInEditor>true</showInEditor>\n";
+	expected += "</profileDescription>\n";
+	assertEquals(expected, out.toString());
+
+	ProfileDescription pd = marshaller.unmarshal(ProfileDescription.class, new ByteArrayInputStream(expected.getBytes()), null);
+	assertEquals(desc.getId(), pd.getId());
+	assertTrue(desc.isThisTheOwner("user1"));
+	assertFalse(desc.isThisTheOwner("aap"));
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/RegisterResponseTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/RegisterResponseTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/model/RegisterResponseTest.java	(revision 5961)
@@ -0,0 +1,141 @@
+package clarin.cmdi.componentregistry.model;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Date;
+
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.MDMarshaller;
+
+import javax.xml.transform.TransformerException;
+
+import org.junit.Before;
+
+public class RegisterResponseTest extends BaseUnitTest {
+
+	private Date testDate = new Date();
+
+	@Test
+	public void testRegisterError() throws Exception {
+		RegisterResponse resp = new RegisterResponse();
+		resp.setRegistered(false);
+		resp.setIsProfile(true);
+		resp.setIsPrivate(true);
+		resp.addError("Error 1");
+		resp.addError("Error 2, <!-- to be escaped -->");
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		marshaller.marshal(resp, out);
+		String expected = "";
+		expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+		expected += "<registerResponse isProfile=\"true\" registered=\"false\" isPrivate=\"true\" xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+		expected += "    <errors>\n";
+		expected += "        <error>Error 1</error>\n";
+		expected += "        <error>Error 2, &lt;!-- to be escaped --&gt;</error>\n";
+		expected += "    </errors>\n";
+		expected += "</registerResponse>\n";
+		assertXMLEqual(expected, out.toString());
+		RegisterResponse rr = marshaller.unmarshal(RegisterResponse.class,
+				new ByteArrayInputStream(expected.getBytes()), null);
+		assertFalse(rr.isRegistered());
+		assertTrue(rr.isProfile());
+		assertEquals(2, rr.getErrors().size());
+	}
+
+	@Test
+	public void testRegisterSucces() throws Exception {
+		RegisterResponse resp = new RegisterResponse();
+		resp.setRegistered(true);
+		resp.setIsProfile(true);
+		resp.setIsPrivate(false);
+		resp.setDescription(getProfileDescription());
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		marshaller.marshal(resp, out);
+		String expected = "";
+		expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+		expected += "<registerResponse isProfile=\"true\" registered=\"true\" isPrivate=\"false\" xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+		expected += "    <errors/>\n";
+		expected += "    <description xsi:type=\"profileDescription\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
+		expected += "        <id>clarin.eu:cr1:p_myId</id>\n";
+		expected += "        <description>myD</description>\n";
+		expected += "        <name>Name</name>\n";
+		expected += "        <registrationDate>" + DatesHelper.formatXmlDateTime(testDate) + "</registrationDate>\n";
+		expected += "        <creatorName>myC</creatorName>\n";
+		expected += "        <ns2:href>linkToMyProfile</ns2:href>\n";
+		expected += "        <commentsCount>2</commentsCount>\n";
+		expected += "        <showInEditor>true</showInEditor>\n";
+		expected += "    </description>\n";
+		expected += "</registerResponse>\n";
+		assertXMLEqual(expected, out.toString());
+
+		RegisterResponse rr = marshaller.unmarshal(RegisterResponse.class,
+				new ByteArrayInputStream(expected.getBytes()), null);
+		assertTrue(rr.isRegistered());
+		assertTrue(rr.isProfile());
+		assertEquals("clarin.eu:cr1:p_myId", rr.getDescription().getId());
+	}
+
+	@Test
+	public void testRegisterSuccesComponent() throws Exception {
+		RegisterResponse resp = new RegisterResponse();
+		resp.setRegistered(true);
+		resp.setIsProfile(false);
+		resp.setIsPrivate(true);
+		resp.setDescription(getComponentDescription());
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		marshaller.marshal(resp, out);
+		String expected = "";
+		expected += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+		expected += "<registerResponse isProfile=\"false\" registered=\"true\" isPrivate=\"true\" xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+		expected += "    <errors/>\n";
+		expected += "    <description xsi:type=\"componentDescription\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
+		expected += "        <id>clarin.eu:cr1:c_myId</id>\n";
+		expected += "        <description>myD</description>\n";
+		expected += "        <name>Name</name>\n";
+		expected += "        <registrationDate>" + DatesHelper.formatXmlDateTime(testDate) + "</registrationDate>\n";
+		expected += "        <creatorName>myC</creatorName>\n";
+		expected += "        <ns2:href>linkToMyProfile</ns2:href>\n";
+		expected += "        <groupName>imdi</groupName>\n";
+		expected += "        <commentsCount>2</commentsCount>\n";
+		expected += "    </description>\n";
+		expected += "</registerResponse>\n";
+		assertXMLEqual(expected, out.toString());
+
+		RegisterResponse rr = marshaller.unmarshal(RegisterResponse.class,
+				new ByteArrayInputStream(expected.getBytes()), null);
+		assertTrue(rr.isRegistered());
+		assertFalse(rr.isProfile());
+		assertEquals("clarin.eu:cr1:c_myId", rr.getDescription().getId());
+	}
+
+	private ComponentDescription getComponentDescription() {
+		ComponentDescription desc = new ComponentDescription();
+		desc.setName("Name");
+		desc.setId(ComponentDescription.COMPONENT_PREFIX + "myId");
+		desc.setGroupName("imdi");
+		desc.setCreatorName("myC");
+		desc.setDescription("myD");
+		desc.setRegistrationDate(testDate);
+		desc.setHref("linkToMyProfile");
+		desc.setCommentsCount(2);
+		return desc;
+	}
+
+	private ProfileDescription getProfileDescription() {
+		ProfileDescription desc = new ProfileDescription();
+		desc.setName("Name");
+		desc.setId(ProfileDescription.PROFILE_PREFIX + "myId");
+		desc.setCreatorName("myC");
+		desc.setDescription("myD");
+		desc.setRegistrationDate(testDate);
+		desc.setHref("linkToMyProfile");
+		desc.setCommentsCount(2);
+		return desc;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/CMDComponentSetFilenamesToNullTestRunner.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/CMDComponentSetFilenamesToNullTestRunner.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/CMDComponentSetFilenamesToNullTestRunner.java	(revision 5961)
@@ -0,0 +1,217 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Collections;
+import java.util.List;
+import javax.xml.bind.JAXBException;
+import static org.junit.Assert.*;
+
+/**
+ * non-automated developers. test, with and input (a valid component/prifile xml
+ * file and a path to it) and the output (the file where all filenames are set
+ * to null, in the same directory as the input file)
+ *
+ * @author olhsha
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class CMDComponentSetFilenamesToNullTestRunner {
+
+    /**
+     *
+     * @author olhsha
+     */
+    /**
+     * makes a new component (with filled-in filename)
+     *
+     * @param filename is assigned to the filed "filename" of the new component
+     * @param childcomponents is assigned to the list of child components of the
+     * new component
+     * @return the reference to the new component
+     */
+    protected CMDComponentType makeTestComponent(String filename,
+            List<CMDComponentType> childcomponents) {
+
+        CMDComponentType component = new CMDComponentType();
+        component.setFilename(filename);
+        List<CMDComponentType> kids = component.getCMDComponent();
+        assertFalse(kids == null);
+        assertEquals(kids.size(), 0);
+        if (childcomponents != null) {
+            kids.addAll(childcomponents);
+        }
+        ;
+        return component;
+    }
+
+    /*
+     * checks if all the filenames related to the component are nulls
+     */
+    private void checkNullnessOfFilenamesInComponent(CMDComponentType component) {
+        assertEquals(component.getFilename(), null);
+        checkNullnessOfFilenamesInListOfComponents(component.getCMDComponent());
+    }
+
+    /*
+     * checks if all the filenames related to the list of component are nulls
+     */
+    private void checkNullnessOfFilenamesInListOfComponents(
+            List<CMDComponentType> listofcomponents) {
+        for (CMDComponentType currentcomponent : listofcomponents) {
+            checkNullnessOfFilenamesInComponent(currentcomponent);
+        }
+    }
+
+    /*
+     * returns true if all the filenames related to the input component are not
+     * null
+     */
+    private boolean checkNonNullnessOfFilenamesInComponent(
+            CMDComponentType component) {
+
+        String filename = component.getFilename();
+        System.out.println(filename);
+        boolean check = (filename == null);
+        if (check) {
+            return false;
+        }
+        return checkNonNullnessOfFilenamesInListOfComponents(component
+                .getCMDComponent());
+    }
+
+    /*
+     * returns true if all the filenames related to the list of components are
+     * not null
+     */
+    private boolean checkNonNullnessOfFilenamesInListOfComponents(
+            List<CMDComponentType> listofcomponents) {
+        boolean check;
+        for (CMDComponentType currentcomponent : listofcomponents) {
+            check = checkNonNullnessOfFilenamesInComponent(currentcomponent);
+            if (!check) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /*
+     * adding dummy filenames to a component
+     */
+    private void addDummyFilenamesToComponent(CMDComponentType component) {
+        if (component != null) {
+            component.setFilename("Dummy");
+            List<CMDComponentType> listofcomponents = component
+                    .getCMDComponent();
+            addDummyFilenamesToListOfComponents(listofcomponents);
+        }
+    }
+
+    /*
+     * adding dummy filenames to the list of components
+     */
+    private void addDummyFilenamesToListOfComponents(
+            List<CMDComponentType> listofcomponents) {
+        for (CMDComponentType currentcomponent : listofcomponents) {
+            addDummyFilenamesToComponent(currentcomponent);
+        }
+    }
+
+    /*
+     * adds dummy filenames to the content of largeProfile.XML
+     */
+    private CMDComponentSpec makeTestFromFile(String filename)
+            throws IOException, JAXBException {
+        FileInputStream is = new FileInputStream(filename);
+        String profilestring = RegistryTestHelper.getStringFromStream(is);
+        CMDComponentSpec compspec = RegistryTestHelper
+                .getComponentFromString(profilestring); // calling unmarchaller
+        List<CMDComponentType> listofcomponents = Collections.singletonList(compspec.getCMDComponent());
+        addDummyFilenamesToListOfComponents(listofcomponents);
+        assertTrue(checkNonNullnessOfFilenamesInListOfComponents(listofcomponents));
+        return compspec;
+    }
+
+    /*
+     * creating the profile with filenames filled by "Dummy" and writing it into
+     * the file
+     */
+    private void writeDummiedXML(String filenamein, String filenameout)
+            throws IOException, JAXBException {
+        CMDComponentSpec compspec = makeTestFromFile(filenamein);
+        String os = RegistryTestHelper.getXml(compspec);
+        RegistryTestHelper.writeStringToFile(os, filenameout);
+    }
+
+    /*
+     * generic test-from-file read/write
+     */
+    private void setFileNamesToNullInFile(String dirName, String fileNameInit,
+            String fileNameDummied, String fileNameUnDummied)
+            throws IOException, JAXBException {
+
+        String path = RegistryTestHelper.openTestDir(dirName);
+        writeDummiedXML(path + fileNameInit, path + fileNameDummied);
+
+        FileInputStream is = new FileInputStream(path + fileNameDummied);
+        String dummiedcontent = RegistryTestHelper.getStringFromStream(is);
+        CMDComponentSpec compspec = RegistryTestHelper
+                .getComponentFromString(dummiedcontent); // calling unmarchaller
+
+        List<CMDComponentType> listofcomponents = Collections.singletonList(compspec.getCMDComponent());
+
+        IComponentRegistryRestService testrestservice = new ComponentRegistryRestService();
+        testrestservice.setFileNamesFromListToNull(listofcomponents);
+        checkNullnessOfFilenamesInListOfComponents(listofcomponents);
+
+        String os = RegistryTestHelper.getXml(compspec);
+        RegistryTestHelper.writeStringToFile(os, path + fileNameUnDummied);
+    }
+
+    /*
+     * developer test method: nulling filenames in an arbitrary (component) file
+     * user's input: the name of the file, together with the sub-directory
+     * inside target/
+     */
+    public static void main(String args[]) throws java.io.IOException,
+            JAXBException {
+
+        BufferedReader buffer = new BufferedReader(new InputStreamReader(
+                System.in));
+
+        System.out.println("");
+        System.out
+                .print("Sub-directory (of target/) name? (up to 32 symbols): ");
+        String dirName = buffer.readLine();
+        System.out.println("");
+        System.out
+                .println("(Watch out: this is a temorary directory, which is removed after any new clean+build)");
+        System.out.println(dirName);
+
+        System.out.println("");
+        System.out.println("Check if your file is in this temorary directory");
+        System.out.print("and input the file name (up to 32 symbols): ");
+        String fileName = buffer.readLine();
+        System.out.println(fileName);
+
+        System.out.println("Bedankt, ff wachten .. ");
+
+        String fileNameDummied = "Dummied" + fileName;
+        String fileNameUnDummied = "Nulled" + fileName;
+
+        CMDComponentSetFilenamesToNullTestRunner helper = new CMDComponentSetFilenamesToNullTestRunner();
+
+        helper.setFileNamesToNullInFile(dirName, fileName, fileNameDummied,
+                fileNameUnDummied);
+
+        System.out.println("Now look up the directory target/" + dirName);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/CommentValidatorTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/CommentValidatorTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/CommentValidatorTest.java	(revision 5961)
@@ -0,0 +1,175 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.impl.database.ComponentRegistryTestDatabase;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import javax.xml.transform.TransformerException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+/**
+ * Test class for CommentValidator
+ * 
+ * @author jean-charles FerriÃšres <jean-charles.ferrieres@mpi.nl>
+ * @author George.Georgovassilis@mpi.nl
+ */
+public class CommentValidatorTest extends BaseUnitTest {
+
+    /**
+     * Fully successful comment validation
+     */
+    @Test
+    public void testValidateSucces() {
+	BaseDescription description = ProfileDescription
+		.createNewDescription();
+	String comContent = "";
+	comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	comContent += "    <comments>myCom</comments>\n";
+	comContent += "    <commentDate></commentDate>\n";
+	comContent += "     <componentId>" + description.getId()+ "</componentId>";
+	comContent += "    <userId>0</userId>\n";
+	comContent += "    <id>1</id>\n";
+	comContent += "</comment>\n";
+	InputStream input = new ByteArrayInputStream(comContent.getBytes());
+	CommentValidator validator = new CommentValidator(input, description,
+		marshaller);
+	assertTrue(validator.validate());
+    }
+
+    /**
+     * Test the validation of comment with componentID
+     */
+    @Test
+    public void testValidateComponent() {
+	BaseDescription desc = ComponentDescription.createNewDescription();
+	String comContent = "";
+	comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	comContent += "    <comments>myCom</comments>\n";
+	comContent += "    <commentDate></commentDate>\n";
+	comContent += "     <componentDescriptionId></componentDescriptionId>";
+	comContent += "    <userId>0</userId>\n";
+	comContent += "    <id>1</id>\n";
+	comContent += "</comment>\n";
+	InputStream input = new ByteArrayInputStream(comContent.getBytes());
+	CommentValidator validator = new CommentValidator(input, desc,
+		marshaller);
+	assertFalse(validator.validate());// missing componentId will return an
+					  // error
+	assertEquals(validator.getErrorMessages().size(), 1);
+	assertTrue(validator.getErrorMessages().get(0)
+		.startsWith(CommentValidator.COMMENT_SPECIFICATION_ERROR));
+
+	String commentContent = "";
+	commentContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	commentContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	commentContent += "    <comments>myCom</comments>\n";
+	commentContent += "    <commentDate></commentDate>\n";
+	commentContent += "     <componentId>" + desc.getId()
+		+ "</componentId>";
+	commentContent += "    <userId>0</userId>\n";
+	commentContent += "    <id>1</id>\n";
+	commentContent += "</comment>\n";
+	input = new ByteArrayInputStream(commentContent.getBytes());
+	validator = new CommentValidator(input, desc, marshaller);
+	assertTrue(validator.validate()); // componentId valid, validation
+					  // complete
+    }
+
+    /***
+     * Test the validation of comment with profileId
+     */
+    @Test
+    public void testValidateProfile() {
+	BaseDescription desc = ProfileDescription.createNewDescription();
+	String comContent = "";
+	comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	comContent += "    <comments>myCom</comments>\n";
+	comContent += "    <commentDate></commentDate>\n";
+	comContent += "     <profileDescriptionId></profileDescriptionId>";
+	comContent += "    <userId>0</userId>\n";
+	comContent += "    <id>1</id>\n";
+	comContent += "</comment>\n";
+	InputStream input = new ByteArrayInputStream(comContent.getBytes());
+	CommentValidator validator = new CommentValidator(input, desc,
+		marshaller);
+	assertFalse(validator.validate());// missing profileId will return an
+					  // error
+	assertEquals(validator.getErrorMessages().size(), 1);
+	assertTrue(validator.getErrorMessages().get(0)
+		.startsWith(CommentValidator.COMMENT_SPECIFICATION_ERROR));
+
+	String commentContent = "";
+	commentContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	commentContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	commentContent += "    <comments>myCom</comments>\n";
+	commentContent += "    <commentDate></commentDate>\n";
+	commentContent += "     <componentId>" + desc.getId()
+		+ "</componentId>";
+	commentContent += "    <userId>0</userId>\n";
+	commentContent += "    <id>1</id>\n";
+	commentContent += "</comment>\n";
+	input = new ByteArrayInputStream(commentContent.getBytes());
+	validator = new CommentValidator(input, desc, marshaller);
+	assertTrue(validator.validate()); // profileId valid, validation
+					  // complete
+    }
+
+    /**
+     * Test the validation of comment with content comments
+     * 
+     * @throws Exception
+     */
+    @Test
+    public void testValidateNoCommentContent() throws Exception {
+	BaseDescription desc = ProfileDescription.createNewDescription();
+	String commentContent = "";
+	commentContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	commentContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	commentContent += "    <comments></comments>\n";
+	commentContent += "    <commentDate></commentDate>\n";
+	commentContent += "     <profileDescriptionId>" + desc.getId()
+		+ "</profileDescriptionId>";
+	commentContent += "    <userId>0</userId>\n";
+	commentContent += "    <id>1</id>\n";
+	commentContent += "</comment>\n";
+	InputStream input = new ByteArrayInputStream(commentContent.getBytes());
+	CommentValidator validator = new CommentValidator(input, desc,
+		marshaller);
+	assertFalse(validator.validate()); // missing content will return an
+					   // error
+	assertTrue(validator.getErrorMessages().get(0)
+		.startsWith(CommentValidator.COMMENT_SPECIFICATION_ERROR));
+
+	String comContent = "";
+	comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+	comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+	comContent += "    <comments>myCom</comments>\n";
+	comContent += "    <commentDate></commentDate>\n";
+	comContent += "     <componentId>" + desc.getId()
+		+ "</componentId>";
+	comContent += "    <userId>0</userId>\n";
+	comContent += "    <id>1</id>\n";
+	comContent += "</comment>\n";
+	input = new ByteArrayInputStream(comContent.getBytes());
+	validator = new CommentValidator(input, desc, marshaller);
+	assertTrue(validator.validate());// content comments is fill in,
+					 // validation complete
+
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestServiceTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestServiceTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestServiceTest.java	(revision 5961)
@@ -0,0 +1,1969 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.components.CMDComponentType;
+import clarin.cmdi.componentregistry.impl.database.ComponentRegistryTestDatabase;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.CommentResponse;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+import static clarin.cmdi.componentregistry.rest.ComponentRegistryRestServiceTestCase.COMPONENT_LIST_GENERICTYPE;
+import static clarin.cmdi.componentregistry.rest.IComponentRegistryRestService.REGISTRY_SPACE_PARAM;
+import static clarin.cmdi.componentregistry.rest.IComponentRegistryRestService.REGISTRY_SPACE_PRIVATE;
+
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.UniformInterfaceException;
+import com.sun.jersey.api.representation.Form;
+import com.sun.jersey.multipart.FormDataMultiPart;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response.Status;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.util.Assert;
+
+/**
+ * Launches a servlet container environment and performs HTTP calls to the
+ * {@link ComponentRegistryRestService}
+ *
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class ComponentRegistryRestServiceTest extends ComponentRegistryRestServiceTestCase {
+
+    @Autowired
+    private ComponentRegistryFactory componentRegistryFactory;
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    private ComponentRegistry baseRegistry;
+
+    @Before
+    public void init() {
+        ComponentRegistryTestDatabase.resetAndCreateAllTables(jdbcTemplate);
+        createUserRecord();
+        baseRegistry = componentRegistryFactory.getBaseRegistry(DummyPrincipal.DUMMY_CREDENTIALS);
+    }
+
+    private String expectedUserId(String principal) {
+        return getUserDao().getByPrincipalName(principal).getId().toString();
+    }
+    private Comment profile1Comment1;
+    private Comment profile1Comment2;
+    private Comment component1Comment3;
+    private Comment component1Comment4;
+
+    private void fillUpPublicItems() throws Exception {
+
+        RegistryTestHelper.addProfile(baseRegistry, "profile2", true);
+        RegistryTestHelper.addProfile(baseRegistry, "profile1", true);
+        RegistryTestHelper.addComponent(baseRegistry,
+                "component2", true);
+        RegistryTestHelper.addComponent(baseRegistry,
+                "component1", true);
+        profile1Comment2 = RegistryTestHelper.addComment(baseRegistry, "comment2",
+                ProfileDescription.PROFILE_PREFIX + "profile1",
+                "JUnit@test.com");
+        profile1Comment1 = RegistryTestHelper.addComment(baseRegistry, "comment1",
+                ProfileDescription.PROFILE_PREFIX + "profile1",
+                "JUnit@test.com");
+        component1Comment3 = RegistryTestHelper.addComment(baseRegistry, "comment3",
+                ComponentDescription.COMPONENT_PREFIX + "component1",
+                "JUnit@test.com");
+        component1Comment4 = RegistryTestHelper.addComment(baseRegistry, "comment4",
+                ComponentDescription.COMPONENT_PREFIX + "component1",
+                "JUnit@test.com");
+    }
+
+    /**
+     * Will insert: - profile 3: private by current user - profile 4: private by
+     * other user - component 3: private by current user - component 4: private
+     * by other user
+     *
+     * @throws Exception
+     */
+    private void fillUpPrivateItems() throws Exception {
+        RegistryTestHelper.addProfile(baseRegistry, "profile3", false);
+        RegistryTestHelper.addProfileAnotherPrincipal(baseRegistry, "profile4", false);
+        RegistryTestHelper.addComponent(baseRegistry,
+                "component3", false);
+        RegistryTestHelper.addComponentAnotherPrincipal(baseRegistry, "component4", false);
+        RegistryTestHelper.addComment(baseRegistry, "comment5",
+                ProfileDescription.PROFILE_PREFIX + "profile3",
+                "JUnit@test.com");
+        RegistryTestHelper.addComment(baseRegistry, "comment7",
+                ComponentDescription.COMPONENT_PREFIX + "component3",
+                "JUnit@test.com");
+    }
+
+    @Test
+    public void testGetPublicProfilesUnauthenticated() throws Exception {
+
+        System.out.println("testGetPublicProfiles");
+
+        fillUpPublicItems();
+
+        RegistryTestHelper.addProfile(baseRegistry, "PROFILE2", true);
+        List<ProfileDescription> response = getResource()
+                .path("/registry/profiles").accept(MediaType.APPLICATION_XML)
+                .get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        response = getResource()
+                .path("/registry/profiles")
+                .accept(MediaType.APPLICATION_JSON)
+                .get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        assertEquals("profile1", response.get(0).getName());
+        assertEquals("PROFILE2", response.get(1).getName());
+        assertEquals("profile2", response.get(2).getName());
+    }
+
+    @Test
+    public void testGetPublicProfilesAuthenticated() throws Exception {
+
+        System.out.println("testGetPublicProfiles");
+
+        fillUpPublicItems();
+
+        RegistryTestHelper.addProfile(baseRegistry, "PROFILE2", true);
+        List<ProfileDescription> response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles")).accept(MediaType.APPLICATION_XML)
+                .get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles"))
+                .accept(MediaType.APPLICATION_JSON)
+                .get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        assertEquals("profile1", response.get(0).getName());
+        assertEquals("PROFILE2", response.get(1).getName());
+        assertEquals("profile2", response.get(2).getName());
+    }
+
+    @Test //ok
+    public void testGetPublicComponentsUnauthenticated() throws Exception {
+        fillUpPublicItems();
+
+        RegistryTestHelper.addComponent(baseRegistry, "COMPONENT2", true);
+        List<ComponentDescription> response = (getResource()
+                .path("/registry/components")).accept(MediaType.APPLICATION_XML)
+                .get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        response = (getResource()
+                .path("/registry/components"))
+                .accept(MediaType.APPLICATION_JSON)
+                .get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        assertEquals("component1", response.get(0).getName());
+        assertEquals("COMPONENT2", response.get(1).getName());
+        assertEquals("component2", response.get(2).getName());
+    }
+
+    @Test //ok
+    public void testGetPublicComponentsAuthenticated() throws Exception {
+        fillUpPublicItems();
+
+        RegistryTestHelper.addComponent(baseRegistry, "COMPONENT2", true);
+        List<ComponentDescription> response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components")).accept(MediaType.APPLICATION_XML)
+                .get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components"))
+                .accept(MediaType.APPLICATION_JSON)
+                .get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        assertEquals("component1", response.get(0).getName());
+        assertEquals("COMPONENT2", response.get(1).getName());
+        assertEquals("component2", response.get(2).getName());
+    }
+
+    @Test  //ok
+    public void testGetUserComponents() throws Exception {
+
+        System.out.println("testGetUserComponents");
+
+        fillUpPrivateItems();
+
+        List<ComponentDescription> response = this.getUserComponents();
+        assertEquals(1, response.size());
+
+        ////
+        fillUpPublicItems();
+        response = getAuthenticatedResource(getResource().path("/registry/components")).accept(
+                MediaType.APPLICATION_JSON).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals("Get public components", 2, response.size());
+
+        ClientResponse cResponse = getResource().path("/registry/components")
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals("Trying to get userspace components without credentials", 401,
+                cResponse.getStatus());
+    }
+
+    @Test  //ok
+    public void testGetUserProfiles() throws Exception {
+
+        System.out.println("testGetUserComponents");
+
+        fillUpPrivateItems();
+
+        List<ProfileDescription> response = this.getUserProfiles();
+        assertEquals(1, response.size());
+
+        fillUpPublicItems();
+        response = getAuthenticatedResource(getResource().path("/registry/profiles")).accept(
+                MediaType.APPLICATION_JSON).get(PROFILE_LIST_GENERICTYPE);
+        assertEquals("Get public profiles", 2, response.size());
+
+        ClientResponse cResponse = getResource().path("/registry/profiles")
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals("Trying to get userspace profiles without credentials", 401,
+                cResponse.getStatus());
+    }
+
+    @Test //ok
+    public void testGetPublicComponent() throws Exception {
+
+        fillUpPublicItems();
+
+        String id = ComponentDescription.COMPONENT_PREFIX + "component1";
+        String id2 = ComponentDescription.COMPONENT_PREFIX + "component2";
+
+        // make an unauthenticated reponse
+        CMDComponentSpec component = getResource()
+                .path("/registry/components/" + id)
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull("unauthenticated component request", component);
+        assertEquals("Access", component.getCMDComponent().getName());
+
+        // make an authenticated reponse
+        component = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id))
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull("authenticated component request", component);
+        assertEquals("Access", component.getCMDComponent().getName());
+
+        component = this.getAuthenticatedResource(getResource().path("/registry/components/" + id2))
+                .accept(MediaType.APPLICATION_XML).get(CMDComponentSpec.class);
+        assertNotNull(component);
+        assertEquals("Access", component.getCMDComponent().getName());
+        assertEquals(id2, component.getHeader().getID());
+        assertEquals("component2", component.getHeader().getName());
+        assertEquals("Test Description", component.getHeader().getDescription());
+    }
+
+    @Test //ok
+    public void testGetPublicProfile() throws Exception {
+
+        fillUpPublicItems();
+
+        String id = ProfileDescription.PROFILE_PREFIX + "profile1";
+        String id2 = ProfileDescription.PROFILE_PREFIX + "profile2";
+
+        // make an unauthenticated reponse
+        CMDComponentSpec profile = getResource()
+                .path("/registry/profiles/" + id)
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull("unauthenticated component request", profile);
+//        assertEquals("Access", profile.getCMDComponent().getName());
+
+        // make an authenticated reponse
+        profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id))
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull("authenticated component request", profile);
+//        assertEquals("Access", profile.getCMDComponent().getName());
+
+        profile = this.getAuthenticatedResource(getResource().path("/registry/profiles/" + id2))
+                .accept(MediaType.APPLICATION_XML).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+//        assertEquals("Access", profile.getCMDComponent().getName());
+        assertEquals(id2, profile.getHeader().getID());
+        assertEquals("profile2", profile.getHeader().getName());
+        assertEquals("Test Description", profile.getHeader().getDescription());
+    }
+
+    @Test   // ok    
+    public void testGetCommentsInPublicProfile() throws Exception {
+
+        System.out.println("testGetCommentsInPublicPrfile");
+
+        fillUpPublicItems();
+
+        String id = ProfileDescription.PROFILE_PREFIX + "profile1";
+        RegistryTestHelper.addComment(baseRegistry, "COMMENT1", id,
+                "JUnit@test.com");
+        List<Comment> response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id + "/comments/"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+
+        response = this.getAuthenticatedResource(getResource().path("/registry/profiles/" + id + "/comments"))
+                .accept(MediaType.APPLICATION_JSON)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        assertEquals("comment2", response.get(0).getComment());
+        assertEquals("comment1", response.get(1).getComment());
+        assertEquals("COMMENT1", response.get(2).getComment());
+
+        assertEquals("Database test user", response.get(0).getUserName());
+    }
+
+    @Test // ok
+    public void testGetCommentsInPubliComponent() throws Exception {
+
+        System.out.println("testGetCoomentsInPublicComponent");
+
+        fillUpPublicItems();
+
+        String id = ComponentDescription.COMPONENT_PREFIX + "component1";
+        RegistryTestHelper.addComment(baseRegistry, "COMMENT2", id,
+                "JUnit@test.com");
+        List<Comment> response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/comments/"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/comments"))
+                .accept(MediaType.APPLICATION_JSON)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(3, response.size());
+        assertEquals("comment3", response.get(0).getComment());
+        assertEquals("comment4", response.get(1).getComment());
+        assertEquals("COMMENT2", response.get(2).getComment());
+
+        assertEquals("Database test user", response.get(0).getUserName());
+    }
+
+    @Test // ok
+    public void testGetSpecifiedCommentInPublicComponent() throws Exception {
+
+        System.out.println("testSpecifiedCommentInPublicComponent");
+
+        fillUpPublicItems();
+
+        String id = ComponentDescription.COMPONENT_PREFIX + "component1";
+        Comment comment = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/comments/" + component1Comment3.getId()))
+                .accept(MediaType.APPLICATION_JSON).get(Comment.class);
+        assertNotNull(comment);
+        assertEquals("comment3", comment.getComment());
+        assertEquals(component1Comment3.getId(), comment.getId());
+        comment = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/comments/" + component1Comment4.getId()))
+                .accept(MediaType.APPLICATION_JSON).get(Comment.class);
+        assertNotNull(comment);
+        assertEquals("comment4", comment.getComment());
+        assertEquals(component1Comment4.getId(), comment.getId());
+        assertEquals(id, comment.getComponentId());
+    }
+
+    @Test //ok
+    public void testGetSpecifiedCommentInPublicProfile() throws Exception {
+
+        System.out.println("testGetSpecifiedCoomentInPublicProfile");
+
+        fillUpPublicItems();
+
+        String id = ProfileDescription.PROFILE_PREFIX + "profile1";
+        Comment comment = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id + "/comments/" + profile1Comment2.getId()))
+                .accept(MediaType.APPLICATION_JSON).get(Comment.class);
+        assertNotNull(comment);
+        assertEquals("comment2", comment.getComment());
+        assertEquals(profile1Comment2.getId(), comment.getId());
+
+        comment = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id + "/comments/" + profile1Comment1.getId()))
+                .accept(MediaType.APPLICATION_JSON).get(Comment.class);
+        assertNotNull(comment);
+        assertEquals("comment1", comment.getComment());
+        assertEquals(profile1Comment1.getId(), comment.getId());
+        assertEquals(id, comment.getComponentId());
+    }
+
+    @Test  //ok
+    public void testDeleteCommentFromPublicComponent() throws Exception {
+
+        System.out.println("testDeleteCommentFromPublicComponent");
+
+        fillUpPublicItems();
+
+        String id = ComponentDescription.COMPONENT_PREFIX + "component1";
+        String id2 = ComponentDescription.COMPONENT_PREFIX + "component2";
+        List<Comment> comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + id + "/comments")).get(
+                        COMMENT_LIST_GENERICTYPE);
+        assertEquals(2, comments.size());
+        Comment aComment = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + id + "/comments/" + component1Comment3.getId()))
+                .get(Comment.class);
+        assertNotNull(aComment);
+
+        // Try to delete from other component
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + id2 + "/comments/" + component1Comment4.getId()).delete(
+                        ClientResponse.class);
+        assertEquals(404, response.getStatus());
+        // Delete from correct component
+        response = getAuthenticatedResource(
+                "/registry/components/" + id + "/comments/" + component1Comment3.getId()).delete(
+                        ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + id + "/comments/")).get(
+                        COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, comments.size());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + id + "/comments/" + component1Comment4.getId()).delete(
+                        ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + id + "/comments")).get(
+                        COMMENT_LIST_GENERICTYPE);
+        assertEquals(0, comments.size());
+    }
+
+    @Test
+    public void testManipulateCommentFromPublicComponent() throws Exception {
+
+        System.out.println("testManipulateCommentFromPublicComponent");
+
+        fillUpPublicItems();
+
+        List<Comment> comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                        + "component1/comments")).get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(2, comments.size());
+        Comment aComment = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                        + "component1/comments/" + component1Comment3.getId())).get(Comment.class);
+        assertNotNull(aComment);
+
+        Form manipulateForm = new Form();
+        manipulateForm.add("method", "delete");
+
+        // Try to delete from other component
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component1/comments/" + component1Comment3.getId()).post(ClientResponse.class,
+                        manipulateForm);
+        assertEquals(200, response.getStatus());
+
+        comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                        + "component1/comments/")).get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, comments.size());
+    }
+
+    @Test
+    public void testDeleteCommentFromPublicProfile() throws Exception {
+
+        System.out.println("testDeleteCommentFromPublicProfile");
+
+        fillUpPublicItems();
+
+        List<Comment> comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/comments")).get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(2, comments.size());
+        Comment aComment = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/comments/" + profile1Comment1.getId())).get(Comment.class);
+        assertNotNull(aComment);
+
+        // Try to delete from other profile
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile2/comments/9999").delete(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+        // Delete from correct profile
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile1/comments/" + profile1Comment1.getId()).delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/comments/")).get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, comments.size());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile1/comments/" + profile1Comment2.getId()).delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/comments")).get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(0, comments.size());
+    }
+
+    @Test
+    public void testManipulateCommentFromPublicProfile() throws Exception {
+
+        System.out.println("testManipulatreCommentFromPublicProfile");
+
+        fillUpPublicItems();
+
+        List<Comment> comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/comments")).get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(2, comments.size());
+        Comment aComment = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/comments/" + profile1Comment2.getId())).get(Comment.class);
+        assertNotNull(aComment);
+
+        Form manipulateForm = new Form();
+        manipulateForm.add("method", "delete");
+        // Delete from correct profile
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile1/comments/" + profile1Comment2.getId()).post(ClientResponse.class,
+                        manipulateForm);
+        assertEquals(200, response.getStatus());
+
+        comments = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/comments/")).get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, comments.size());
+    }
+
+    @Test
+    public void testDeletePrivateComponent() throws Exception {
+        fillUpPrivateItems();
+
+        List<ComponentDescription> components = this.getAuthenticatedResource(getResource().path(
+                "/registry/components").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+        CMDComponentSpec profile = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                        + "component3")).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component3").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        components = this.getAuthenticatedResource(getResource().path("/registry/components").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(0, components.size());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component3").delete(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+    }
+
+    @Test
+    public void testDeletePrivateProfile() throws Exception {
+        fillUpPrivateItems();
+
+        List<ComponentDescription> components = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+        CMDComponentSpec profile = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile3").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile3").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        components = this.getAuthenticatedResource(getResource().path("/registry/profiles").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(0, components.size());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile3").delete(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+    }
+
+    @Test
+    public void testDeleteOtherUsersComponent() throws Exception {
+        fillUpPrivateItems();
+
+        List<ComponentDescription> components = this.getAuthenticatedResource(getResource().path(
+                "/registry/components").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component4").delete(ClientResponse.class);
+        assertEquals("Deleting another user's profile should not be allowed", 403, response.getStatus());
+
+        // should not affect listing of own private profiles
+        components = this.getAuthenticatedResource(getResource().path("/registry/components").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+    }
+
+    @Test
+    public void testDeleteOtherUsersProfile() throws Exception {
+        fillUpPrivateItems();
+
+        List<ComponentDescription> components = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile4").delete(ClientResponse.class);
+        assertEquals("Deleting another user's profile should not be allowed", 403, response.getStatus());
+
+        // should not affect listing of own private profiles
+        components = this.getAuthenticatedResource(getResource().path("/registry/profiles").queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+    }
+
+    @Test
+    public void testDeletePublicComponent() throws Exception {
+
+        System.out.println("testDeletePublicComponent");
+
+        fillUpPublicItems();
+
+        List<ComponentDescription> components = this.getAuthenticatedResource(getResource().path(
+                "/registry/components")).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(2, components.size());
+        CMDComponentSpec profile = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                        + "component1")).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component1").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        components = this.getAuthenticatedResource(getResource().path("/registry/components")).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component2").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        components = this.getAuthenticatedResource(getResource().path("/registry/components")).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(0, components.size());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component1").delete(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+    }
+
+    @Test
+    public void testDeletePublicComponentStillUsed() throws Exception {
+
+        System.out.println("testDeletePublicComponentStillUsed");
+
+        fillUpPublicItems();
+
+        String content = "";
+        content += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        content += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        content += "    <Header/>\n";
+        content += "    <CMD_Component name=\"XXX\" CardinalityMin=\"1\" CardinalityMax=\"10\">\n";
+        content += "        <CMD_Element name=\"Availability\" ValueScheme=\"string\" />\n";
+        content += "    </CMD_Component>\n";
+        content += "</CMD_ComponentSpec>\n";
+        ComponentDescription compDesc1 = RegistryTestHelper.addComponent(
+                baseRegistry, "XXX1", content, true);
+
+        content = "";
+        content += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        content += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        content += "    <Header/>\n";
+        content += "    <CMD_Component name=\"YYY\" CardinalityMin=\"1\" CardinalityMax=\"unbounded\">\n";
+        content += "        <CMD_Component ComponentId=\"" + compDesc1.getId()
+                + "\" CardinalityMin=\"0\" CardinalityMax=\"99\">\n";
+        content += "        </CMD_Component>\n";
+        content += "    </CMD_Component>\n";
+        content += "</CMD_ComponentSpec>\n";
+        ComponentDescription compDesc2 = RegistryTestHelper.addComponent(
+                baseRegistry, "YYY1", content, true);
+
+        content = "";
+        content += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        content += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        content += "    <Header/>\n";
+        content += "    <CMD_Component name=\"ZZZ\" CardinalityMin=\"1\" CardinalityMax=\"unbounded\">\n";
+        content += "        <CMD_Component ComponentId=\"" + compDesc1.getId()
+                + "\" CardinalityMin=\"0\" CardinalityMax=\"99\">\n";
+        content += "        </CMD_Component>\n";
+        content += "    </CMD_Component>\n";
+        content += "</CMD_ComponentSpec>\n";
+        ProfileDescription profile = RegistryTestHelper.addProfile(
+                baseRegistry, "TestProfile3", content, true);
+
+        List<ComponentDescription> components = this.getAuthenticatedResource(getResource().path(
+                "/registry/components")).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(4, components.size());
+
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + compDesc1.getId()).delete(
+                        ClientResponse.class);
+        assertEquals(Status.FORBIDDEN.getStatusCode(), response.getStatus());
+        assertEquals(
+                "Component is still in use by other components or profiles. Request component usage for details.",
+                response.getEntity(String.class));
+
+        components = this.getAuthenticatedResource(getResource().path("/registry/components")).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(4, components.size());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + profile.getId()).delete(
+                        ClientResponse.class);
+        assertEquals(200, response.getStatus());
+        response = getAuthenticatedResource(
+                "/registry/components/" + compDesc2.getId()).delete(
+                        ClientResponse.class);
+        assertEquals(200, response.getStatus());
+        response = getAuthenticatedResource(
+                "/registry/components/" + compDesc1.getId()).delete(
+                        ClientResponse.class);
+        assertEquals(200, response.getStatus());
+        components = this.getAuthenticatedResource(getResource().path("/registry/components")).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(2, components.size());
+    }
+
+    @Test
+    public void testManipulatePublicComponent() throws Exception {
+
+        System.out.println("testManipulatePublicComponent");
+
+        fillUpPublicItems();
+
+        List<ComponentDescription> components = this.getAuthenticatedResource(getResource().path(
+                "/registry/components")).get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(2, components.size());
+        CMDComponentSpec profile = this.getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                        + "component1")).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+
+        Form manipulateForm = new Form();
+        manipulateForm.add("method", "delete");
+
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component1").post(ClientResponse.class,
+                        manipulateForm);
+        assertEquals(200, response.getStatus());
+
+        components = this.getAuthenticatedResource(getResource().path("/registry/components")).get(
+                COMPONENT_LIST_GENERICTYPE);
+        assertEquals(1, components.size());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component2").post(ClientResponse.class,
+                        manipulateForm);
+        assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testGetRegisteredProfile() throws Exception {
+
+        System.out.println("testGetRegisteredProfile");
+
+        fillUpPublicItems();
+
+        String id = ProfileDescription.PROFILE_PREFIX + "profile1";
+        String id2 = ProfileDescription.PROFILE_PREFIX + "profile2";
+        CMDComponentSpec profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id))
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+        assertEquals("Actor", profile.getCMDComponent().getName());
+        profile = this.getAuthenticatedResource(getResource().path("/registry/profiles/" + id2))
+                .accept(MediaType.APPLICATION_XML).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+        assertEquals("Actor", profile.getCMDComponent().getName());
+
+        assertEquals(id2, profile.getHeader().getID());
+        assertEquals("profile2", profile.getHeader().getName());
+        assertEquals("Test Description", profile.getHeader().getDescription());
+
+        try {
+            profile = this.getAuthenticatedResource(getResource()
+                    .path("/registry/profiles/"
+                            + ProfileDescription.PROFILE_PREFIX + "profileXXXX"))
+                    .accept(MediaType.APPLICATION_XML)
+                    .get(CMDComponentSpec.class);
+            fail("Exception should have been thrown resource does not exist, HttpStatusCode 404");
+        } catch (UniformInterfaceException e) {
+            assertEquals(404, e.getResponse().getStatus());
+        }
+    }
+
+    @Test
+    public void testGetRegisteredProfileRawData() {
+
+        System.out.println("testGetRegisteredProfileRawData");
+
+        try {
+            fillUpPublicItems();
+        } catch (Exception e) {
+            System.out.println("test fails due to exception: " + e.getMessage());
+            return;
+        }
+
+        //make unauthenticated request
+        String profile = getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/xsd").accept(MediaType.TEXT_XML)
+                .get(String.class).trim();
+        assertNotNull("Unauthenticated request for profile raw data", profile);
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(profile.endsWith("</xs:schema>"));
+
+        //make authenticated request
+        profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/xsd")).accept(MediaType.TEXT_XML)
+                .get(String.class).trim();
+        assertNotNull("Authenticated request for profile raw data", profile);
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(profile.endsWith("</xs:schema>"));
+
+        profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/xml")).accept(MediaType.TEXT_XML)
+                .get(String.class).trim();
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<CMD_ComponentSpec"));
+        assertTrue(profile.endsWith("</CMD_ComponentSpec>"));
+        assertTrue(profile.contains("xsi:schemaLocation"));
+
+        ClientResponse respie = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/"
+                        + ProfileDescription.PROFILE_PREFIX
+                        + "profile1/xsl")).accept(MediaType.TEXT_XML).head();
+        assertEquals(404, respie.getStatus());
+    }
+
+    // 
+    @Test
+    public void testPrivateProfileXsd() {
+
+        System.out.println("testPrivateProfileXsd");
+
+        try {
+            fillUpPublicItems();
+        } catch (Exception e) {
+            System.out.println("test fails due to exception: " + e.getMessage());
+            return;
+        }
+
+        FormDataMultiPart form = createFormData(RegistryTestHelper
+                .getTestProfileContent());
+        RegisterResponse response = getAuthenticatedResource(getResource().path("/registry/profiles").queryParam(
+                REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).type(
+                        MediaType.MULTIPART_FORM_DATA).post(RegisterResponse.class,
+                        form);
+        assertTrue(response.isProfile());
+        assertEquals(1, getUserProfiles().size());
+        BaseDescription desc = response.getDescription();
+        String profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + desc.getId() + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(profile.endsWith("</xs:schema>"));
+    }
+
+    @Test
+    public void testPrivateComponentXsd() throws Exception {
+
+        System.out.println("testPrivateComponentXsd");
+
+        fillUpPublicItems();
+
+        FormDataMultiPart form = createFormData(RegistryTestHelper
+                .getComponentTestContent());
+        RegisterResponse response = getAuthenticatedResource(
+                getResource().path("/registry/components").queryParam(
+                REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).type(
+                        MediaType.MULTIPART_FORM_DATA).post(RegisterResponse.class,
+                        form);
+        assertFalse(response.isProfile());
+        assertEquals(1, getUserComponents().size());
+        BaseDescription desc = response.getDescription();
+        String profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + desc.getId() + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(profile.endsWith("</xs:schema>"));
+    }
+
+    @Test
+    public void testDeleteRegisteredProfile() throws Exception {
+
+        System.out.println("testDeleteRegistredProfile");
+
+        fillUpPublicItems();
+
+        List<ProfileDescription> profiles = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles")).get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(2, profiles.size());
+        CMDComponentSpec profile = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1")).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile1").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        profiles = this.getAuthenticatedResource(getResource().path("/registry/profiles")).get(
+                PROFILE_LIST_GENERICTYPE);
+        assertEquals(1, profiles.size());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile2").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        profiles = this.getAuthenticatedResource(getResource().path("/registry/profiles")).get(
+                PROFILE_LIST_GENERICTYPE);
+        assertEquals(0, profiles.size());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile1").delete(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+    }
+
+    @Test
+    public void testManipulateRegisteredProfile() throws Exception {
+
+        System.out.println("testManipulateRegisteredProfile");
+
+        fillUpPublicItems();
+
+        List<ProfileDescription> profiles = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles")).get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(2, profiles.size());
+        CMDComponentSpec profile = this.getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                        + "profile1")).get(CMDComponentSpec.class);
+        assertNotNull(profile);
+
+        Form manipulateForm = new Form();
+        manipulateForm.add("method", "delete");
+
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile1")
+                .post(ClientResponse.class, manipulateForm);
+        assertEquals(200, response.getStatus());
+
+        profiles = this.getAuthenticatedResource(getResource().path("/registry/profiles")).get(
+                PROFILE_LIST_GENERICTYPE);
+        assertEquals(1, profiles.size());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile2")
+                .post(ClientResponse.class, manipulateForm);
+        assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testGetRegisteredComponentRawData() throws Exception {
+
+        System.out.println("testGetRegisteredComponentRawData");
+
+        fillUpPublicItems();
+
+        String id = ComponentDescription.COMPONENT_PREFIX + "component1";
+        String component = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(component
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(component.endsWith("</xs:schema>"));
+
+        component = this.getAuthenticatedResource(getResource().path("/registry/components/" + id + "/xml"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(component
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<CMD_ComponentSpec"));
+        assertTrue(component.endsWith("</CMD_ComponentSpec>"));
+        assertTrue(component.contains("xsi:schemaLocation"));
+
+        ClientResponse respie = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/"
+                        + ComponentDescription.COMPONENT_PREFIX
+                        + "component1/jpg")).accept(MediaType.TEXT_XML)
+                .head();
+        assertEquals(404, respie.getStatus());
+    }
+
+    @Test
+    public void testRegisterProfile() throws Exception {
+
+        System.out.println("testRegisterProfile");
+
+        fillUpPublicItems();
+
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getTestProfileContent(),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD,
+                "ProfileTest1");
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD,
+                "TestDomain");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                "My Test Profile");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD,
+                "My Test Group");
+        RegisterResponse response = getAuthenticatedResource(
+                "/registry/profiles").type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertTrue(response.isProfile());
+        assertTrue(response.isPrivate());
+        ProfileDescription profileDesc = (ProfileDescription) response
+                .getDescription();
+        assertNotNull(profileDesc);
+        assertEquals("ProfileTest1", profileDesc.getName());
+        assertEquals("My Test Profile", profileDesc.getDescription());
+        assertEquals("TestDomain", profileDesc.getDomainName());
+        assertEquals("My Test Group", profileDesc.getGroupName());
+        assertEquals(expectedUserId("JUnit@test.com"), profileDesc.getUserId());
+        assertEquals("Database test user", profileDesc.getCreatorName());
+        assertTrue(profileDesc.getId().startsWith(
+                ComponentRegistry.REGISTRY_ID + "p_"));
+        assertNotNull(profileDesc.getRegistrationDate());
+        assertEquals(
+                "http://localhost:9998/registry/profiles/"
+                + profileDesc.getId(), profileDesc.getHref());
+    }
+
+    @Test
+    public void testPublishProfile() throws Exception {
+
+        System.out.println("testPublishProfile");
+
+        fillUpPrivateItems();
+        fillUpPublicItems();
+
+        assertEquals("user registered profiles", 1, getUserProfiles().size());
+        assertEquals("public registered profiles", 2, getPublicProfiles()
+                .size());
+        FormDataMultiPart form = createFormData(
+                RegistryTestHelper.getTestProfileContent(), "Unpublished");
+        RegisterResponse response = getAuthenticatedResource(getResource().path("/registry/profiles")).type(
+                MediaType.MULTIPART_FORM_DATA).post(RegisterResponse.class,
+                        form);
+        assertTrue(response.isProfile());
+        BaseDescription desc = response.getDescription();
+        assertEquals("Unpublished", desc.getDescription());
+        assertEquals(2, getUserProfiles().size());
+        assertEquals(2, getPublicProfiles().size());
+        form = createFormData(
+                RegistryTestHelper.getTestProfileContent("publishedName"),
+                "Published");
+        response = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + desc.getId() + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+
+        assertEquals(1, getUserProfiles().size());
+        List<ProfileDescription> profiles = getPublicProfiles();
+        assertEquals(3, profiles.size());
+        ProfileDescription profileDescription = profiles.get(2);
+        assertNotNull(profileDescription.getId());
+        assertEquals(desc.getId(), profileDescription.getId());
+        assertEquals("http://localhost:9998/registry/profiles/" + desc.getId(),
+                profileDescription.getHref());
+        assertEquals("Published", profileDescription.getDescription());
+        CMDComponentSpec spec = getPublicSpec(profileDescription);
+        assertEquals("publishedName", spec.getCMDComponent().getName());
+    }
+
+    private CMDComponentSpec getPublicSpec(BaseDescription desc) {
+        if (desc.isProfile()) {
+            return this.getAuthenticatedResource(getResource().path("/registry/profiles/" + desc.getId()))
+                    .get(CMDComponentSpec.class);
+        } else {
+            return this.getAuthenticatedResource(getResource().path("/registry/components/" + desc.getId()))
+                    .get(CMDComponentSpec.class);
+        }
+    }
+
+    @Test
+    public void testPublishRegisteredComponent() throws Exception {
+
+        System.out.println("testPublishRegisteredComponent");
+
+        fillUpPrivateItems();
+        fillUpPublicItems();
+
+        assertEquals(1, getUserComponents().size());
+        assertEquals(2, getPublicComponents().size());
+
+        FormDataMultiPart form = createFormData(
+                RegistryTestHelper.getComponentTestContent(), "Unpublished");
+        RegisterResponse response = getAuthenticatedResource(getResource().path("/registry/components")).type(
+                MediaType.MULTIPART_FORM_DATA).post(RegisterResponse.class,
+                        form);
+        assertFalse(response.isProfile());
+        BaseDescription desc = response.getDescription();
+        assertEquals("Unpublished", desc.getDescription());
+        assertEquals(2, getUserComponents().size());
+        assertEquals(2, getPublicComponents().size());
+        form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("publishedName"),
+                "Published");
+        response = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + desc.getId() + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+
+        assertEquals(1, getUserComponents().size());
+        List<ComponentDescription> components = getPublicComponents();
+        assertEquals(3, components.size());
+        ComponentDescription componentDescription = components.get(2);
+        assertNotNull(componentDescription.getId());
+        assertEquals(desc.getId(), componentDescription.getId());
+        assertEquals(
+                "http://localhost:9998/registry/components/" + desc.getId(),
+                componentDescription.getHref());
+        assertEquals("Published", componentDescription.getDescription());
+        CMDComponentSpec spec = getPublicSpec(componentDescription);
+        assertEquals("publishedName", spec.getCMDComponent().getName());
+    }
+
+    // duplicates ("extendedly") testRegisterProfile, since you can pot only in user space, and then publish or move to group or so
+    @Test
+    public void testRegisterUserspaceProfile() throws Exception {
+
+        System.out.println("testRegisterUserspacProfile");
+
+        fillUpPrivateItems();
+        fillUpPublicItems();
+
+        List<ProfileDescription> profiles = getUserProfiles();
+        assertEquals("user registered profiles", 1, profiles.size());
+        assertEquals("public registered profiles", 2, getPublicProfiles()
+                .size());
+        FormDataMultiPart form = createFormData(RegistryTestHelper
+                .getTestProfileContent());
+        RegisterResponse response = getAuthenticatedResource(getResource().path("/registry/profiles")).type(
+                MediaType.MULTIPART_FORM_DATA).post(RegisterResponse.class,
+                        form);
+        assertTrue(response.isProfile());
+        assertTrue(response.isPrivate());
+        ProfileDescription profileDesc = (ProfileDescription) response
+                .getDescription();
+        assertNotNull(profileDesc);
+        assertEquals("Test1", profileDesc.getName());
+        assertEquals("My Test", profileDesc.getDescription());
+        assertEquals(expectedUserId("JUnit@test.com"), profileDesc.getUserId());
+        assertEquals("Database test user", profileDesc.getCreatorName());
+        assertTrue(profileDesc.getId().startsWith(
+                ComponentRegistry.REGISTRY_ID + "p_"));
+        assertNotNull(profileDesc.getRegistrationDate());
+        assertEquals(
+                "http://localhost:9998/registry/profiles/"
+                + profileDesc.getId(),
+                profileDesc.getHref());
+
+        profiles = getUserProfiles();
+        assertEquals(2, profiles.size());
+        assertEquals(2, getPublicProfiles().size());
+
+        // Try to post unauthenticated
+        ClientResponse cResponse = getResource().path("/registry/profiles")
+                .type(MediaType.MULTIPART_FORM_DATA)
+                .post(ClientResponse.class, form);
+        assertEquals(401, cResponse.getStatus());
+
+        CMDComponentSpec spec = getAuthenticatedResource(getResource().path("/registry/profiles/" + profileDesc.getId())
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).accept(
+                        MediaType.APPLICATION_XML).get(CMDComponentSpec.class);
+        assertNotNull(spec);
+
+        cResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + profileDesc.getId() + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(ClientResponse.class);
+        assertEquals(200, cResponse.getStatus());
+        String profile = cResponse.getEntity(String.class);
+        assertTrue(profile.length() > 0);
+
+        profile = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + profileDesc.getId() + "/xml"))
+                .accept(MediaType.TEXT_XML).get(String.class);
+        assertTrue(profile.length() > 0);
+
+        cResponse = getAuthenticatedResource(getResource().path("/registry/profiles/" + profileDesc.getId())
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).delete(
+                        ClientResponse.class);
+        assertEquals(200, cResponse.getStatus());
+
+        profiles = getUserProfiles();
+        assertEquals(1, profiles.size());
+    }
+
+    private List<ProfileDescription> getPublicProfiles() {
+        return getAuthenticatedResource("/registry/profiles").accept(
+                MediaType.APPLICATION_XML).get(PROFILE_LIST_GENERICTYPE);
+    }
+
+    private List<ProfileDescription> getUserProfiles() {
+        return getAuthenticatedResource(getResource().path("/registry/profiles").queryParam(
+                REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).accept(
+                        MediaType.APPLICATION_XML).get(PROFILE_LIST_GENERICTYPE);
+    }
+
+    private FormDataMultiPart createFormData(Object content) {
+        return createFormData(content, "My Test");
+    }
+
+    private FormDataMultiPart createFormData(Object content, String description) {
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD, content,
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD, "Test1");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                description);
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD, "My domain");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD, "TestGroup");
+        return form;
+    }
+
+    @Test
+    public void testRegisterWithUserComponents() throws Exception {
+
+        System.out.println("testRegisterWithUserComponents");
+
+        fillUpPrivateItems();
+
+        // kid component, not public
+        String content = "";
+        content += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        content += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        content += "    <Header/>\n";
+        content += "    <CMD_Component name=\"XXX\" CardinalityMin=\"1\" CardinalityMax=\"10\">\n";
+        content += "        <CMD_Element name=\"Availability\" ValueScheme=\"string\" />\n";
+        content += "    </CMD_Component>\n";
+        content += "</CMD_ComponentSpec>\n";
+        ComponentDescription compDesc1 = RegistryTestHelper.addComponent(
+                baseRegistry, "XXX1", content, false);
+
+        // a containing component, referring to the kid (which is not public, so the containing component cannot be registered
+        content = "";
+        content += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        content += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        content += "    <Header/>\n";
+        content += "    <CMD_Component name=\"YYY\" CardinalityMin=\"1\" CardinalityMax=\"unbounded\">\n";
+        content += "        <CMD_Component ComponentId=\"" + compDesc1.getId()
+                + "\" CardinalityMin=\"0\" CardinalityMax=\"99\">\n";
+        content += "        </CMD_Component>\n";
+        content += "    </CMD_Component>\n";
+        content += "</CMD_ComponentSpec>\n";
+        FormDataMultiPart form = createFormData(content);
+        RegisterResponse response = getAuthenticatedResource(
+                "/registry/components").type(MediaType.MULTIPART_FORM_DATA)
+                .post(RegisterResponse.class, form);
+        // we first alway register in a private space, so reference to a private component should work
+        assertTrue(response.isRegistered());
+
+        /// profiles ///
+        content = "";
+        content += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        content += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        content += "    <Header/>\n";
+        content += "    <CMD_Component name=\"ZZZ\" CardinalityMin=\"1\" CardinalityMax=\"unbounded\">\n";
+        content += "        <CMD_Component ComponentId=\"" + compDesc1.getId()
+                + "\" CardinalityMin=\"0\" CardinalityMax=\"99\">\n";
+        content += "        </CMD_Component>\n";
+        content += "    </CMD_Component>\n";
+        content += "</CMD_ComponentSpec>\n";
+
+        form = createFormData(content);
+        response = getAuthenticatedResource("/registry/profiles").type(
+                MediaType.MULTIPART_FORM_DATA).post(RegisterResponse.class,
+                        form);
+        assertTrue(response.isRegistered());
+
+    }
+
+    @Test
+    public void testRegisterUserspaceComponent() throws Exception {
+
+        System.out.println("testREgisterUserspaceComponent");
+
+        fillUpPrivateItems();
+
+        List<ComponentDescription> components = getUserComponents();
+        assertEquals("user registered components", 1, components.size());
+        assertEquals("public registered components", 0, getPublicComponents()
+                .size());
+        FormDataMultiPart form = createFormData(RegistryTestHelper
+                .getComponentTestContent());
+
+        RegisterResponse response = getAuthenticatedResource(getResource().path("/registry/components")).type(
+                MediaType.MULTIPART_FORM_DATA).post(RegisterResponse.class,
+                        form);
+        assertTrue(response.isRegistered());
+        assertFalse(response.isProfile());
+        assertTrue(response.isPrivate());
+        ComponentDescription desc = (ComponentDescription) response
+                .getDescription();
+        assertNotNull(desc);
+        assertEquals("Test1", desc.getName());
+        assertEquals("My Test", desc.getDescription());
+        assertEquals(expectedUserId("JUnit@test.com"), desc.getUserId());
+        assertEquals("Database test user", desc.getCreatorName());
+        assertEquals("TestGroup", desc.getGroupName());
+        assertTrue(desc.getId()
+                .startsWith(ComponentRegistry.REGISTRY_ID + "c_"));
+        assertNotNull(desc.getRegistrationDate());
+        String url = getResource().getUriBuilder().build().toString();
+        assertEquals(url + "registry/components/" + desc.getId(), desc.getHref());
+
+        components = getUserComponents();
+        assertEquals(2, components.size());
+        assertEquals(0, getPublicComponents().size());
+
+        // Try to post unauthenticated
+        ClientResponse cResponse = getResource().path("/registry/components")
+                .type(MediaType.MULTIPART_FORM_DATA)
+                .post(ClientResponse.class, form);
+        assertEquals(401, cResponse.getStatus());
+
+        // Try to get 
+        cResponse = this.getAuthenticatedResource(getResource().path("/registry/components/" + desc.getId()))
+                .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+
+        assertEquals(200, cResponse.getStatus());
+        CMDComponentSpec spec = getUserComponent(desc);
+        assertNotNull(spec);
+
+        cResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + desc.getId() + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(ClientResponse.class);
+        assertEquals(200, cResponse.getStatus());
+        String result = cResponse.getEntity(String.class);
+        assertTrue(result.length() > 0);
+
+        result = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + desc.getId() + "/xml"))
+                .accept(MediaType.TEXT_XML).get(String.class);
+        assertTrue(result.length() > 0);
+
+        cResponse = getAuthenticatedResource(getResource().path("/registry/components/" + desc.getId())).delete(
+                ClientResponse.class);
+        assertEquals(200, cResponse.getStatus());
+
+        components = getUserComponents();
+        assertEquals(1, components.size());
+    }
+//
+
+    @Test
+    public void testCreatePrivateComponentWithRecursion() throws Exception {
+
+        System.out.println("testCreatePrivateComponentWithRecursion");
+
+        fillUpPrivateItems();
+        // Create new componet
+        FormDataMultiPart form = createFormData(RegistryTestHelper
+                .getComponentTestContent());
+        ClientResponse cResponse = getAuthenticatedResource(getResource().path("/registry/components")).type(
+                MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        RegisterResponse response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        ComponentDescription desc = (ComponentDescription) response
+                .getDescription();
+
+        // Re-define with self-recursion
+        String compContent = "";
+        compContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        compContent += "\n";
+        compContent += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        compContent += "    xsi:noNamespaceSchemaLocation=\"../../general-component-schema.xsd\">\n";
+        compContent += "    \n";
+        compContent += "    <Header/>\n";
+        compContent += "    \n";
+        compContent += "    <CMD_Component name=\"Nested\" CardinalityMin=\"1\" CardinalityMax=\"1\">\n";
+        compContent += "        <CMD_Element name=\"Availability\" ValueScheme=\"string\" />\n";
+        compContent += "        <CMD_Component ComponentId=\""
+                + desc.getId()
+                + "\" name=\"Recursive\" CardinalityMin=\"1\" CardinalityMax=\"1\" />\n";
+        compContent += "    </CMD_Component>\n";
+        compContent += "\n";
+        compContent += "</CMD_ComponentSpec>\n";
+
+        // Update component
+        form = createFormData(
+                RegistryTestHelper.getComponentContentAsStream(compContent),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + desc.getId() + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        response = cResponse.getEntity(RegisterResponse.class);
+        assertFalse("Recursive definition should fail", response.isRegistered());
+        assertEquals("There should be an error message for the recursion", 1,
+                response.getErrors().size());
+        assertTrue(
+                "There error message should specify the point of recursion",
+                response.getErrors().get(0)
+                .contains("already contains " + desc.getId()));
+
+    }
+
+    @Test
+    public void testUpdatePrivateComponent() throws Exception {
+
+        System.out.println("testUpdatePrivateComponent");
+
+        fillUpPrivateItems();
+
+        List<ComponentDescription> components = getUserComponents();
+        assertEquals("user registered components", 1, components.size());
+        assertEquals("public registered components", 0, getPublicComponents()
+                .size());
+
+        // first, post a component to update
+        FormDataMultiPart form = createFormData(RegistryTestHelper
+                .getComponentTestContent());
+        ClientResponse cResponse = getAuthenticatedResource(getResource().path("/registry/components")).type(
+                MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        RegisterResponse response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertFalse(response.isProfile());
+        assertTrue(response.isPrivate());
+        ComponentDescription desc = (ComponentDescription) response
+                .getDescription();
+        assertNotNull(desc);
+        assertEquals("Test1", desc.getName());
+        assertEquals("My Test", desc.getDescription());
+        Date firstDate = desc.getRegistrationDate();
+        CMDComponentSpec spec = getUserComponent(desc);
+        assertNotNull(spec);
+        assertEquals("Access", spec.getCMDComponent().getName());
+        components = getUserComponents();
+        assertEquals(2, components.size());
+        assertEquals(0, getPublicComponents().size());
+
+        // second, now update
+        form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + desc.getId() + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertFalse(response.isProfile());
+        assertTrue(response.isPrivate());
+        desc = (ComponentDescription) response.getDescription();
+        assertNotNull(desc);
+        assertEquals("Test1", desc.getName());
+        assertEquals("UPDATE DESCRIPTION!", desc.getDescription());
+        Date secondDate = desc.getRegistrationDate();
+        assertTrue(firstDate.before(secondDate) || firstDate.equals(secondDate));
+
+        spec = getUserComponent(desc);
+        assertNotNull(spec);
+        assertEquals("TESTNAME", spec.getCMDComponent().getName());
+        components = getUserComponents();
+        assertEquals(2, components.size());
+        assertEquals(0, getPublicComponents().size());
+    }
+
+    @Test
+    public void testUpdatePrivateProfile() throws Exception {
+
+        System.out.println("testUpdatePrivateProfile");
+
+        fillUpPrivateItems();
+
+        List<ProfileDescription> profiles = getUserProfiles();
+        assertEquals(1, profiles.size());
+        assertEquals(0, getPublicProfiles().size());
+
+        FormDataMultiPart form = createFormData(RegistryTestHelper
+                .getTestProfileContent());
+        ClientResponse cResponse = getAuthenticatedResource(getResource().path("/registry/profiles")).type(
+                MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        RegisterResponse response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertTrue(response.isProfile());
+        assertTrue(response.isPrivate());
+        ProfileDescription desc = (ProfileDescription) response
+                .getDescription();
+        assertNotNull(desc);
+        assertEquals("Test1", desc.getName());
+        assertEquals("My Test", desc.getDescription());
+        assertEquals("TestGroup", desc.getGroupName());
+        Date firstDate = desc.getRegistrationDate();
+        CMDComponentSpec spec = getUserProfile(desc);
+        assertNotNull(spec);
+        assertEquals("Actor", spec.getCMDComponent().getName());
+        profiles = getUserProfiles();
+        assertEquals(2, profiles.size());
+        assertEquals(0, getPublicComponents().size());
+
+        // Now update
+        form = createFormData(
+                RegistryTestHelper.getTestProfileContent("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + desc.getId() + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertTrue(response.isProfile());
+        assertTrue(response.isPrivate());
+        desc = (ProfileDescription) response.getDescription();
+        assertNotNull(desc);
+        assertEquals("Test1", desc.getName());
+        assertEquals("UPDATE DESCRIPTION!", desc.getDescription());
+        Date secondDate = desc.getRegistrationDate();
+        assertTrue(firstDate.before(secondDate) || firstDate.equals(secondDate));
+
+        spec = getUserProfile(desc);
+        assertNotNull(spec);
+        assertEquals("TESTNAME", spec.getCMDComponent().getName());
+        profiles = getUserProfiles();
+        assertEquals(2, profiles.size());
+        assertEquals(0, getPublicComponents().size());
+    }
+
+    private CMDComponentSpec getUserComponent(ComponentDescription desc) {
+        return getAuthenticatedResource(getResource().path("/registry/components/" + desc.getId())
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).accept(
+                        MediaType.APPLICATION_XML).get(CMDComponentSpec.class);
+    }
+
+    private CMDComponentSpec getUserProfile(ProfileDescription desc) {
+        return getAuthenticatedResource(getResource().path("/registry/profiles/" + desc.getId())
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).accept(
+                        MediaType.APPLICATION_XML).get(CMDComponentSpec.class);
+    }
+
+    private List<ComponentDescription> getPublicComponents() {
+        return getAuthenticatedResource("/registry/components").accept(
+                MediaType.APPLICATION_XML).get(COMPONENT_LIST_GENERICTYPE);
+    }
+
+    private List<ComponentDescription> getUserComponents() {
+        return getAuthenticatedResource(getResource().path("/registry/components").queryParam(
+                REGISTRY_SPACE_PARAM, REGISTRY_SPACE_PRIVATE)).accept(
+                        MediaType.APPLICATION_XML).get(COMPONENT_LIST_GENERICTYPE);
+    }
+
+    @Test
+    public void testRegisterComponent() throws Exception {
+
+        System.out.println("testRegisterComponent");
+
+        fillUpPrivateItems();
+
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getComponentTestContent(),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD,
+                "ComponentTest1");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                "My Test Component");
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD,
+                "TestDomain");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD, "TestGroup");
+        RegisterResponse response = getAuthenticatedResource(
+                "/registry/components").type(MediaType.MULTIPART_FORM_DATA)
+                .post(RegisterResponse.class, form);
+        assertTrue(response.isRegistered());
+        assertFalse(response.isProfile());
+        assertTrue(response.isPrivate());
+        ComponentDescription desc = (ComponentDescription) response
+                .getDescription();
+        assertNotNull(desc);
+        assertEquals("ComponentTest1", desc.getName());
+        assertEquals("My Test Component", desc.getDescription());
+        assertEquals(expectedUserId("JUnit@test.com"), desc.getUserId());
+        assertEquals("Database test user", desc.getCreatorName());
+        assertEquals("TestGroup", desc.getGroupName());
+        assertEquals("TestDomain", desc.getDomainName());
+        assertTrue(desc.getId()
+                .startsWith(ComponentRegistry.REGISTRY_ID + "c_"));
+        assertNotNull(desc.getRegistrationDate());
+        String url = getResource().getUriBuilder().build().toString();
+        assertEquals(url + "registry/components/" + desc.getId(),
+                desc.getHref());
+    }
+
+    @Test
+    public void testRegisterComment() throws Exception {
+
+        System.out.println("testRegisterComponent");
+
+        fillUpPublicItems();
+
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getCommentTestContent(),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        String id = ProfileDescription.PROFILE_PREFIX + "profile1";
+        CommentResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + id + "/comments").type(
+                        MediaType.MULTIPART_FORM_DATA)
+                .post(CommentResponse.class, form);
+        assertTrue(response.isRegistered());
+        assertFalse(response.isPrivate());
+        Comment comment = response.getComment();
+        assertNotNull(comment);
+        assertEquals("Actual", comment.getComment());
+        assertEquals("Database test user", comment.getUserName());
+        Assert.notNull(comment.getCommentDate());
+        Assert.hasText(comment.getId());
+
+        // User id should not be serialized!
+        assertEquals(0, comment.getUserId());
+    }
+
+    @Test
+    public void testRegisterCommentToNonExistent() throws Exception {
+        fillUpPublicItems();
+
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getCommentTestContent(),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        ClientResponse cResponse = getAuthenticatedResource(
+                "/registry/profiles/clarin.eu:cr1:profile99/comments").type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(404, cResponse.getStatus());
+    }
+
+    @Test
+    public void testRegisterCommentUnauthenticated() throws Exception {
+
+        System.out.println("testREgisterCommentUnauthentified");
+
+        fillUpPublicItems();
+
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getCommentTestContent(),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        ClientResponse cResponse = getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile1/comments")
+                .type(MediaType.MULTIPART_FORM_DATA)
+                .post(ClientResponse.class, form);
+        assertEquals(401, cResponse.getStatus());
+    }
+
+    @Test
+    public void testRegisterProfileInvalidData() throws Exception {
+        System.out.println("testRegisterProfileInvalidData");
+        fillUpPrivateItems();
+        FormDataMultiPart form = new FormDataMultiPart();
+        String notAValidProfile = "<CMD_ComponentSpec> </CMD_ComponentSpec>";
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                new ByteArrayInputStream(notAValidProfile.getBytes()),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD,
+                "ProfileTest1");
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD, "Domain");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD, "Group");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                "My Test Profile");
+        RegisterResponse postResponse = getAuthenticatedResource(
+                "/registry/profiles").type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertTrue(postResponse.isProfile());
+        assertFalse(postResponse.isRegistered());
+        assertEquals(1, postResponse.getErrors().size());
+        assertTrue(postResponse.getErrors().get(0).contains("isProfile"));
+    }
+
+    /**
+     * Two elements on the same level with the same name violates schematron
+     * rule, and should fail validation
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testRegisterInvalidProfile() throws Exception {
+        System.out.println("testRegisterInvalidProfile");
+        fillUpPrivateItems();
+        FormDataMultiPart form = new FormDataMultiPart();
+        String profileContent = "";
+        profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        profileContent += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        profileContent += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        profileContent += "    <Header />\n";
+        profileContent += "    <CMD_Component name=\"ProfileTest1\" CardinalityMin=\"0\" CardinalityMax=\"unbounded\">\n";
+        profileContent += "        <CMD_Element name=\"Age\">\n";
+        profileContent += "            <ValueScheme>\n";
+        profileContent += "                <pattern>[23][0-9]</pattern>\n";
+        profileContent += "            </ValueScheme>\n";
+        profileContent += "        </CMD_Element>\n";
+        profileContent += "        <CMD_Element name=\"Age\">\n";
+        profileContent += "            <ValueScheme>\n";
+        profileContent += "                <pattern>[23][0-9]</pattern>\n";
+        profileContent += "            </ValueScheme>\n";
+        profileContent += "        </CMD_Element>\n";
+        profileContent += "    </CMD_Component>\n";
+        profileContent += "</CMD_ComponentSpec>\n";
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getComponentContentAsStream(profileContent),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD,
+                "ProfileTest1");
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD,
+                "TestDomain");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                "My Test Profile");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD,
+                "My Test Group");
+        RegisterResponse response = getAuthenticatedResource(
+                "/registry/profiles").type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertFalse(
+                "Subsequent elements should not be allowed to have the same name",
+                response.isRegistered());
+        assertTrue(response.getErrors().get(0)
+                .contains(MDValidator.PARSE_ERROR));
+    }
+
+    @Test
+    public void testRegisterProfileInvalidDescriptionAndContent()
+            throws Exception {
+        System.out.println("testRegisterProfileInvalidDescriptionAndContent");
+        fillUpPrivateItems();
+        FormDataMultiPart form = new FormDataMultiPart();
+        String profileContent = "";
+        profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        profileContent += "<CMD_ComponentSpec> \n"; // No isProfile attribute
+        profileContent += "    <Header />\n";
+        profileContent += "    <CMD_Component name=\"Actor\" CardinalityMin=\"0\" CardinalityMax=\"unbounded\">\n";
+        profileContent += "        <AttributeList>\n";
+        profileContent += "            <Attribute>\n";
+        profileContent += "                <Name>Name</Name>\n";
+        profileContent += "                <Type>string</Type>\n";
+        profileContent += "            </Attribute>\n";
+        profileContent += "        </AttributeList>\n";
+        profileContent += "    </CMD_Component>\n";
+        profileContent += "</CMD_ComponentSpec>\n";
+        form.field("data", new ByteArrayInputStream(profileContent.getBytes()),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field("name", "");// Empty name so invalid
+        form.field("description", "My Test Profile");
+        RegisterResponse response = getAuthenticatedResource(
+                "/registry/profiles").type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertFalse(response.isRegistered());
+        assertEquals(2, response.getErrors().size());
+        assertNotNull(response.getErrors().get(0));
+        assertEquals(MDValidator.PARSE_ERROR, response.getErrors().get(1)
+                .substring(0, MDValidator.PARSE_ERROR.length()));
+    }
+
+    @Test
+    public void testRegisterLargeProfile() throws Exception {
+        System.out.println("testRegisterLargeProfile");
+        //fillUpPrivateItems(); not necessary
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getLargeProfileContent(),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD,
+                "ProfileTest1");
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD,
+                "TestDomain");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                "My Test Profile");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD,
+                "My Test Group");
+        ClientResponse response = getAuthenticatedResource("/registry/profiles")
+                .type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class,
+                        form);
+        assertEquals(200, response.getStatus());
+    }
+
+    @Test
+    public void testRegisterComponentAsProfile() throws Exception {
+        System.out.println("tesRegisterComponentAsProfile");
+        //fillUpPrivateItems();; not necessary
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getComponentTestContent(),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD, "t");
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD, "domain");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                "My Test");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD, "My Group");
+        RegisterResponse response = getAuthenticatedResource(
+                "/registry/profiles").type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertFalse(response.isRegistered());
+        assertTrue(response.isProfile());
+        assertEquals(1, response.getErrors().size());
+        assertEquals(MDValidator.MISMATCH_ERROR, response.getErrors().get(0));
+    }
+
+    /**
+     * creates a tree-like component, whose root has two kids, and the kids have
+     * three their own kids each the corresponding filenames are: "wortel",
+     * "nodel-L", "node-R", "leaf-LL", "leaf-LM", "leaf-LR", "leaf-RL",
+     * "leaf-RM", "leaf-RR"
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testSetFilenamesToNull() throws Exception {
+        System.out.println("testSetfilenamesTonull");
+        // helper assists in generating a test component
+        CMDComponentSetFilenamesToNullTestRunner helper = new CMDComponentSetFilenamesToNullTestRunner();
+
+        // making an (up to ternary) tree of test components
+        // inductive explaination of the variable names, an example: leaf-LM is
+        // the middle child of the nodeL
+        // the filename is this leaf is "leaf-LM"
+        // making children of the node L
+        CMDComponentType leafLR = helper.makeTestComponent("leaf-LR", null);
+        CMDComponentType leafLM = helper.makeTestComponent("leaf-LM", null);
+        CMDComponentType leafLL = helper.makeTestComponent("leaf-LL", null);
+
+        // making node L
+        List<CMDComponentType> nodeLchild = (new ArrayList<CMDComponentType>());
+        nodeLchild.add(leafLL);
+        nodeLchild.add(leafLM);
+        nodeLchild.add(leafLR);
+        CMDComponentType nodeL = helper.makeTestComponent("node-L", nodeLchild);
+
+        // making children of the node R
+        CMDComponentType leafRR = helper.makeTestComponent("leaf-RR", null);
+        CMDComponentType leafRM = helper.makeTestComponent("leaf-RM", null);
+        CMDComponentType leafRL = helper.makeTestComponent("leaf-RL", null);
+
+        // making node R
+        List<CMDComponentType> nodeRchild = (new ArrayList<CMDComponentType>());
+        nodeRchild.add(leafRL);
+        nodeRchild.add(leafRM);
+        nodeRchild.add(leafRR);
+        CMDComponentType nodeR = helper.makeTestComponent("node-R", nodeRchild);
+
+        // making the root, which has children NodeL and nodeR
+        List<CMDComponentType> wortelchild = (new ArrayList<CMDComponentType>());
+        wortelchild.add(nodeL);
+        wortelchild.add(nodeR);
+        CMDComponentType root = helper.makeTestComponent("wortel", wortelchild);
+
+        // checking if the test compnent has the expected structure and the
+        // expected filenames
+        // ALSO this checking code below shows the strtucture of the tree
+        assertEquals(root.getCMDComponent().size(), 2);
+        assertEquals(root.getCMDComponent().get(0).getCMDComponent().size(), 3);
+        assertEquals(root.getCMDComponent().get(1).getCMDComponent().size(), 3);
+
+        assertEquals(root.getFilename(), "wortel");
+
+        assertEquals(root.getCMDComponent().get(0).getFilename(), "node-L");
+        assertEquals(root.getCMDComponent().get(1).getFilename(), "node-R");
+
+        assertEquals(root.getCMDComponent().get(0).getCMDComponent().get(0)
+                .getFilename(), "leaf-LL");
+        assertEquals(root.getCMDComponent().get(0).getCMDComponent().get(1)
+                .getFilename(), "leaf-LM");
+        assertEquals(root.getCMDComponent().get(0).getCMDComponent().get(2)
+                .getFilename(), "leaf-LR");
+
+        assertEquals(root.getCMDComponent().get(1).getCMDComponent().get(0)
+                .getFilename(), "leaf-RL");
+        assertEquals(root.getCMDComponent().get(1).getCMDComponent().get(1)
+                .getFilename(), "leaf-RM");
+        assertEquals(root.getCMDComponent().get(1).getCMDComponent().get(2)
+                .getFilename(), "leaf-RR");
+
+        // the actual job
+        // nulling the filenames will be called as a method of testrestservice
+        ComponentRegistryRestService restservice = new ComponentRegistryRestService();
+        restservice.setFileNamesToNullCurrent(root);
+
+        // check if the filenames are nulled
+        assertEquals(root.getFilename(), null);
+
+        assertEquals(root.getCMDComponent().get(0).getFilename(), null);
+        assertEquals(root.getCMDComponent().get(1).getFilename(), null);
+
+        assertEquals(root.getCMDComponent().get(0).getCMDComponent().get(0)
+                .getFilename(), null);
+        assertEquals(root.getCMDComponent().get(0).getCMDComponent().get(1)
+                .getFilename(), null);
+        assertEquals(root.getCMDComponent().get(0).getCMDComponent().get(2)
+                .getFilename(), null);
+
+        assertEquals(root.getCMDComponent().get(1).getCMDComponent().get(0)
+                .getFilename(), null);
+        assertEquals(root.getCMDComponent().get(1).getCMDComponent().get(1)
+                .getFilename(), null);
+        assertEquals(root.getCMDComponent().get(1).getCMDComponent().get(2)
+                .getFilename(), null);
+    }
+
+    @Test
+    public void testGetDescription() throws Exception {
+        System.out.println("testGetDescription");
+        fillUpPublicItems();
+        String id = ComponentDescription.COMPONENT_PREFIX + "component1";
+        ComponentDescription component = getAuthenticatedResource(getResource().path("/registry/items/" + id)).accept(MediaType.APPLICATION_JSON).get(ComponentDescription.class);
+        assertNotNull(component);
+        assertEquals(id, component.getId());
+        assertEquals("component1", component.getName());
+        assertEquals("Test Description", component.getDescription());
+
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestServiceTestCase.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestServiceTestCase.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ComponentRegistryRestServiceTestCase.java	(revision 5961)
@@ -0,0 +1,142 @@
+package clarin.cmdi.componentregistry.rest;
+
+import java.util.List;
+
+import javax.ws.rs.core.HttpHeaders;
+
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+
+import com.sun.jersey.api.client.GenericType;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.WebResource.Builder;
+import com.sun.jersey.api.core.ClassNamesResourceConfig;
+import com.sun.jersey.core.util.Base64;
+import com.sun.jersey.multipart.impl.FormDataMultiPartDispatchProvider;
+import com.sun.jersey.spi.container.servlet.WebComponent;
+import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
+import com.sun.jersey.test.framework.AppDescriptor;
+import com.sun.jersey.test.framework.JerseyTest;
+import com.sun.jersey.test.framework.WebAppDescriptor;
+import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
+import java.security.Principal;
+
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.request.RequestContextListener;
+
+/**
+ * Base test that starts a servlet container with the component registry
+ *
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+    "classpath:spring-config/applicationContext.xml",
+    "classpath:spring-config/test-applicationContext-fragment.xml"})
+//Important: these tests can not be configured with @Transactional because it spawns two (mutually deadlocking) transactions: the test itself and jersey services
+public abstract class ComponentRegistryRestServiceTestCase extends JerseyTest {
+    // CommandLine test e.g.: curl -i -H "Accept:application/json" -X GET
+    // http://localhost:8080/ComponentRegistry/rest/registry/profiles
+
+    protected final static GenericType<List<ProfileDescription>> PROFILE_LIST_GENERICTYPE = new GenericType<List<ProfileDescription>>() {
+    };
+    protected final static GenericType<List<ComponentDescription>> COMPONENT_LIST_GENERICTYPE = new GenericType<List<ComponentDescription>>() {
+    };
+    protected final static GenericType<List<Comment>> COMMENT_LIST_GENERICTYPE = new GenericType<List<Comment>>() {
+    };
+    protected final static GenericType<List<Group>> GROUP_LIST_GENERICTYPE = new GenericType<List<Group>>() {
+    };
+    protected final static GenericType<List<String>> STRING_LIST_GENERICTYPE = new GenericType<List<String>>() {
+    };
+
+    private static SingletonTestContainerFactory _testContainerFactory;
+
+    @Override
+    public void setUp() throws Exception {
+        if (!_testContainerFactory.isTestContainerRunning()) {
+            _testContainerFactory.startTestContainer();
+        }
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+    }
+
+    @Override
+    protected TestContainerFactory getTestContainerFactory() {
+        if (_testContainerFactory == null) {
+            _testContainerFactory = new SingletonTestContainerFactory(
+                    super.getTestContainerFactory());
+        }
+        ;
+        return _testContainerFactory;
+    }
+
+    @Autowired
+    private UserDao userDao;
+
+    protected String getApplicationContextFile() {
+	// sorry for the duplication, but JerseyTest is not aware of
+        // @ContextConfiguration
+        return "classpath:spring-config/applicationContext.xml, classpath:spring-config/test-applicationContext-fragment.xml";
+    }
+
+    @Override
+    protected AppDescriptor configure() {
+        WebAppDescriptor.Builder builder = new WebAppDescriptor.Builder()
+                .contextParam("contextConfigLocation",
+                        getApplicationContextFile())
+                .servletClass(SpringServlet.class)
+                .initParam(WebComponent.RESOURCE_CONFIG_CLASS,
+                        ClassNamesResourceConfig.class.getName())
+                .initParam(
+                        ClassNamesResourceConfig.PROPERTY_CLASSNAMES,
+                        FormDataMultiPartDispatchProvider.class.getName() + ";"
+                        + ComponentRegistryRestService.class.getName())
+                .addFilter(DummySecurityFilter.class, "DummySecurityFilter")
+                .requestListenerClass(RequestContextListener.class)
+                .contextListenerClass(ContextLoaderListener.class);
+        return builder.build();
+    }
+
+    protected WebResource getResource() {
+        return resource();
+    }
+
+    protected Builder getAuthenticatedResource(String path) {
+	return getAuthenticatedResource(getResource().path(path));
+    }
+
+    protected Builder getAuthenticatedResource(WebResource resource) {
+        return getAuthenticatedResource(DummyPrincipal.DUMMY_PRINCIPAL, resource);
+    }
+
+    protected Builder getAuthenticatedResource(Principal principal, WebResource resource) {
+        return resource.header(HttpHeaders.AUTHORIZATION,
+                "Basic "
+                + new String(Base64
+                        .encode(principal
+                                .getName() + ":dummy")));
+    }
+
+    protected void createUserRecord() {
+        RegistryUser user = new RegistryUser();
+        user.setName("Database test user");
+        user.setPrincipalName(DummyPrincipal.DUMMY_PRINCIPAL.getName());
+        userDao.save(user);
+    }
+
+    protected UserDao getUserDao() {
+        return userDao;
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ConcurrentRestServiceTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ConcurrentRestServiceTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/ConcurrentRestServiceTest.java	(revision 5961)
@@ -0,0 +1,224 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.impl.database.ComponentRegistryTestDatabase;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.multipart.FormDataMultiPart;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import javax.ws.rs.core.MediaType;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import static clarin.cmdi.componentregistry.rest.ComponentRegistryRestService.REGISTRY_SPACE_PARAM;
+import static org.junit.Assert.*;
+
+/**
+ * 
+ * @author george.georgovassilis@mpi.nl
+ * 
+ */
+public class ConcurrentRestServiceTest extends
+	ComponentRegistryRestServiceTestCase {
+
+    private final static Logger LOG = LoggerFactory
+	    .getLogger(ConcurrentRestServiceTest.class);
+    private final int NR_OF_PROFILES = 20;
+    private final int NR_OF_COMPONENTS = 20;
+    
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    
+    @Before
+    public void init() {
+	ComponentRegistryTestDatabase.resetAndCreateAllTables(jdbcTemplate);
+	createUserRecord();
+    }
+
+    @Test
+    public void testConcurrentRegisterProfile() throws Exception {
+	List<String> errors = new ArrayList<String>();
+	List<Thread> ts = new ArrayList<Thread>();
+
+	registerProfiles(ts, NR_OF_PROFILES, errors, RegistrySpace.PRIVATE);
+        //a profile can be first registered (created) only in private space, and then moved.
+	//registerProfiles(ts, NR_OF_PROFILES, errors, RegistrySpace.PUBLISHED);
+
+	registerComponents(ts, NR_OF_COMPONENTS, errors, RegistrySpace.PRIVATE);
+	//a profile can be first registered (created) only in private space, and then moved.
+        //registerComponents(ts, NR_OF_COMPONENTS, errors, RegistrySpace.PUBLISHED);
+	runAllThreads(ts);
+	if (errors.size() > 0) {
+	    System.out.println(Arrays.toString(errors.toArray()));
+	    for (String e : errors)
+		System.err.println(e);
+	    fail();
+	}
+	assertProfiles(NR_OF_PROFILES, RegistrySpace.PRIVATE);
+	//assertProfiles(NR_OF_PROFILES, RegistrySpace.PUBLISHED);
+
+	assertComponents(NR_OF_COMPONENTS, RegistrySpace.PRIVATE);
+	//assertComponents(NR_OF_COMPONENTS, RegistrySpace.PUBLISHED);
+    }
+
+    private void assertProfiles(int nrOfProfiles, RegistrySpace registrySpace) {
+	List<ProfileDescription> response = getAuthenticatedResource(
+		getResource().path("/registry/profiles").queryParam(
+			REGISTRY_SPACE_PARAM, registrySpace.name())).accept(
+		MediaType.APPLICATION_XML).get(PROFILE_LIST_GENERICTYPE);
+	Collections.sort(response, descriptionComparator);
+	assertEquals("half should be deleted", nrOfProfiles / 2,
+		response.size());
+	for (int i = 0; i < nrOfProfiles / 2; i++) {
+	    ProfileDescription desc = response.get(i);
+	    assertEquals("Test Profile" + (i * 2 + 1000), desc.getName());
+	    assertEquals("Test Profile" + (i * 2 + 1000) + " Description",
+		    desc.getDescription());
+	}
+    }
+
+    private Comparator<BaseDescription> descriptionComparator = new Comparator<BaseDescription>() {
+
+	@Override
+	public int compare(BaseDescription o1, BaseDescription o2) {
+	    return o1.getName().compareTo(o2.getName());
+	}
+    };
+
+    private void assertComponents(int nrOfComponents, RegistrySpace registrySpace) {
+	List<ComponentDescription> cResponse = getAuthenticatedResource(
+		getResource().path("/registry/components").queryParam(
+			REGISTRY_SPACE_PARAM, registrySpace.name())).accept(
+		MediaType.APPLICATION_XML).get(COMPONENT_LIST_GENERICTYPE);
+	Collections.sort(cResponse, descriptionComparator);
+	assertEquals("half should be deleted", nrOfComponents / 2,
+		cResponse.size());
+	for (int i = 0; i < nrOfComponents / 2; i++) {
+	    ComponentDescription desc = cResponse.get(i);
+	    assertEquals("Test Component" + (i * 2 + 1000), desc.getName());
+	    assertEquals("Test Component" + (i * 2 + 1000) + " Description",
+		    desc.getDescription());
+	}
+    }
+
+    private void runAllThreads(List<Thread> ts) throws InterruptedException {
+	for (Thread thread : ts) {
+	    thread.start();
+	    thread.join(10);
+	}
+	for (Thread thread : ts) {
+	    thread.join(); // Wait till all are finished
+	}
+    }
+
+    private void registerProfiles(List<Thread> ts, int size,
+	    final List<String> errors, RegistrySpace registrySpace)
+	    throws InterruptedException {
+	for (int i = 0; i < size; i++) {
+	    final boolean shouldDelete = (i % 2) == 1;
+	    LOG.debug("Profile {} should be registered in {} and {}",
+		    new Object[] { i + 1000,
+			    registrySpace.name(),
+			    shouldDelete ? "ALSO DELETED" : "not deleted" });
+	    Thread thread = createThread("/registry/profiles/", registrySpace,
+		    "Test Profile" + (i + 1000), shouldDelete,
+		    RegistryTestHelper.getTestProfileContent(), errors);
+	    ts.add(thread);
+	}
+    }
+
+    private void registerComponents(List<Thread> ts, int size,
+	    final List<String> errors, RegistrySpace registrySpace)
+	    throws InterruptedException {
+	for (int i = 0; i < size; i++) {
+	    final boolean shouldDelete = (i % 2) == 1;
+	    LOG.debug("Component {} should be registered in {} and {}",
+		    new Object[] { i + 1000,
+			    registrySpace.name(),
+			    shouldDelete ? "ALSO DELETED" : "not deleted" });
+	    Thread thread = createThread("/registry/components/", registrySpace,
+		    "Test Component" + (i + 1000), shouldDelete,
+		    RegistryTestHelper.getComponentTestContent(), errors);
+	    ts.add(thread);
+	}
+    }
+
+    private Thread createThread(final String path, final RegistrySpace registrySpace,
+	    final String name, final boolean alsoDelete, InputStream content,
+	    final List<String> errors) throws InterruptedException {
+	final FormDataMultiPart form = new FormDataMultiPart();
+	form.field(IComponentRegistryRestService.DATA_FORM_FIELD, content,
+		MediaType.APPLICATION_OCTET_STREAM_TYPE);
+	form.field(IComponentRegistryRestService.NAME_FORM_FIELD, name);
+	form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD, name
+		+ " Description");
+	Thread t = new Thread(new Runnable() {
+
+	    @Override
+	    public void run() {
+		long timestamp=-System.currentTimeMillis();
+		try {
+		    // System.out.println("THREAD STARTED"+Thread.currentThread().getName());
+		    RegisterResponse registerResponse = getAuthenticatedResource(
+			    getResource().path(path)).type(
+			    MediaType.MULTIPART_FORM_DATA).post(
+			    RegisterResponse.class, form);
+		    if (!registerResponse.isRegistered()) {
+			errors.add("Failed to register "
+				+ Arrays.toString(registerResponse.getErrors()
+					.toArray()));
+		    }
+		    LOG.debug(">>>>>>>>>>>>>>>> [Thread " + hashCode()
+			    + "] REGISTERING DESCRIPTION " + name + " "
+			    + registerResponse.getDescription().getId()
+			    + registrySpace.name()
+			    + (alsoDelete ? " alsoDelete" : ""));
+		    if (alsoDelete) {
+			LOG.debug(">>>>>>>>>>>>>>>> [Thread "
+				+ hashCode()
+				+ "] DELETING DESCRIPTION "
+				+ name
+				+ " "
+				+ registerResponse.getDescription().getId()
+				+ registrySpace.name()
+				+ (alsoDelete ? " alsoDelete" : ""));
+			ClientResponse response = getAuthenticatedResource(
+				getResource().path(
+					path
+						+ registerResponse
+							.getDescription()
+							.getId()))
+				.delete(ClientResponse.class);
+			if (response.getStatus() != 200) {
+			    errors.add("Failed to delete "
+				    + registerResponse.getDescription());
+			}
+		    }
+		    // System.out.println("THREAD FINISHED"+Thread.currentThread().getName());
+		} finally {
+		    timestamp+=System.currentTimeMillis();
+		    LOG.info(Thread.currentThread().getName()+" duration: "+timestamp+" ms");
+		}
+	    }
+	});
+	return t;
+
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DescriptionValidatorTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DescriptionValidatorTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DescriptionValidatorTest.java	(revision 5961)
@@ -0,0 +1,36 @@
+package clarin.cmdi.componentregistry.rest;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+
+public class DescriptionValidatorTest {
+
+    @Test
+    public void testValidate() {
+        BaseDescription desc = ComponentDescription.createNewDescription();
+        DescriptionValidator validator = new DescriptionValidator(desc);
+        assertFalse(validator.validate());
+
+        desc.setName("n");
+        validator = new DescriptionValidator(desc);
+        assertFalse(validator.validate());
+
+        desc.setCreatorName("n");
+        validator = new DescriptionValidator(desc);
+        assertFalse(validator.validate());
+
+        desc.setDescription("a");
+        validator = new DescriptionValidator(desc);
+        assertTrue(validator.validate());
+
+        desc.setDomainName("a"); //Not forced atm.
+        validator = new DescriptionValidator(desc);
+        assertTrue(validator.validate());
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DummyPrincipal.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DummyPrincipal.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DummyPrincipal.java	(revision 5961)
@@ -0,0 +1,34 @@
+package clarin.cmdi.componentregistry.rest;
+
+import java.security.Principal;
+
+import clarin.cmdi.componentregistry.UserCredentials;
+
+public final class DummyPrincipal implements Principal {
+
+    public static final DummyPrincipal DUMMY_ADMIN_PRINCIPAL = new DummyPrincipal("JUnit.Admin@test.com");
+    public static final DummyPrincipal DUMMY_PRINCIPAL = new DummyPrincipal("JUnit@test.com");
+    public static final DummyPrincipal DUMMY_PRINCIPAL2 = new DummyPrincipal("M.Ock@test.com");
+    public static final UserCredentials DUMMY_CREDENTIALS = new UserCredentials(DUMMY_PRINCIPAL) {
+
+	@Override
+	public String getDisplayName() {
+	    return "J.Unit";
+	}
+    };
+    public static final UserCredentials DUMMY_ADMIN_CREDENTIALS = new UserCredentials(DUMMY_ADMIN_PRINCIPAL);
+    private final String username;
+
+    public DummyPrincipal(String username) {
+	this.username = username;
+    }
+
+    @Override
+    public String getName() {
+	return username;
+    }
+
+    public UserCredentials getCredentials() {
+	return new UserCredentials(this);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DummySecurityFilter.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DummySecurityFilter.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/DummySecurityFilter.java	(revision 5961)
@@ -0,0 +1,98 @@
+package clarin.cmdi.componentregistry.rest;
+
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.naming.AuthenticationException;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.ws.rs.core.HttpHeaders;
+
+import com.sun.jersey.api.container.MappableContainerException;
+import com.sun.jersey.core.util.Base64;
+
+/**
+ * Dummy security filter, very handy for unit testing.
+ * 
+ */
+public class DummySecurityFilter implements Filter {
+
+    private final List<String> ALLOWED_USERS = Arrays.asList(DummyPrincipal.DUMMY_PRINCIPAL.getName());
+
+    /**
+     * Dummy validation for unit tests
+     * @param username
+     * @param password
+     * @return
+     */
+    private boolean isValid(String username, String password) {
+        return ALLOWED_USERS.contains(username);
+    }
+
+    @Override
+    public void destroy() {
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+        Principal principalResult = null;
+        HttpServletRequest req = (HttpServletRequest) request;
+        String authentication = req.getHeader(HttpHeaders.AUTHORIZATION);
+        if (authentication != null) { //if no authentication then do nothing
+            if (!authentication.startsWith("Basic ")) {
+                throw new MappableContainerException(new AuthenticationException("Only HTTP Basic authentication is supported"));
+            }
+            authentication = authentication.substring("Basic ".length());
+            String base64Decode = new String(Base64.decode(authentication.getBytes()));
+            String[] values = base64Decode.split(":");
+            if (values.length < 2) {
+                throw new MappableContainerException(new AuthenticationException("Invalid syntax for username and password"));
+            }
+            final String username = values[0];
+            String password = values[1];
+            if ((username == null) || (password == null)) {
+                throw new MappableContainerException(new AuthenticationException("Missing username or password"));
+            }
+            if (!isValid(username, password)) {
+                throw new MappableContainerException(new AuthenticationException("Invalid user/password"));
+            }
+            principalResult = new DummyPrincipal(username);
+        }
+
+        final Principal principal = principalResult;
+        HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(req) {
+
+            public boolean isUserInRole(String role) {
+                return true;
+            }
+
+            public boolean isSecure() {
+                return false;
+            }
+
+            public Principal getUserPrincipal() {
+                return principal;
+            }
+
+            @Override
+            public String getAuthType() {
+                return HttpServletRequest.BASIC_AUTH;
+            }
+        };
+        chain.doFilter(wrapper, response);
+    }
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/MDValidatorTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/MDValidatorTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/MDValidatorTest.java	(revision 5961)
@@ -0,0 +1,346 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.BaseUnitTest;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.OwnerUser;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import javax.xml.transform.TransformerException;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * 
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class MDValidatorTest extends BaseUnitTest {
+
+    @Autowired
+    private ComponentRegistryFactory componentRegistryFactory; 
+    @Autowired
+    private ComponentRegistry testRegistry;
+    
+    private RegistryUser user;
+   
+    
+    @Before
+    @Override
+    public void setUp() throws TransformerException, UserUnauthorizedException {
+        testRegistry = componentRegistryFactory.getPublicRegistry();
+        user = componentRegistryFactory.getOrCreateUser(DummyPrincipal.DUMMY_CREDENTIALS);
+    }
+    
+   
+
+    @Test
+    public void testValidateSucces() throws UserUnauthorizedException{
+	MDValidator validator = this.getValidProfileValidator();
+        boolean result = validator.validate();
+	assertTrue(result);
+    }
+
+    @Test 
+    public void testValidateIllegalComponentAttributeName() throws UserUnauthorizedException{
+	String profileContent = "";
+	profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+	profileContent += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+	profileContent += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+	profileContent += "    <Header />\n";
+	profileContent += "    <CMD_Component name=\"Actor\" CardinalityMin=\"0\" CardinalityMax=\"unbounded\">\n";
+	profileContent += "	   <AttributeList>\n";
+	profileContent += "		<Attribute>\n";
+	profileContent += "		    <Name>myattribute</Name>\n"; // this should be
+							      // allowed
+	profileContent += "		    <Type>string</Type>\n";
+	profileContent += "		</Attribute>\n";
+	profileContent += "		<Attribute>\n";
+	profileContent += "		    <Name>ref</Name>\n"; // this should NOT be
+						      // allowed
+	profileContent += "		    <Type>string</Type>\n";
+	profileContent += "		</Attribute>\n";
+	profileContent += "		<Attribute>\n";
+	profileContent += "		    <Name>ComponentId</Name>\n"; // neither should
+							      // this
+	profileContent += "		    <Type>string</Type>\n";
+	profileContent += "		</Attribute>\n";
+	profileContent += "	   </AttributeList>\n";
+	profileContent += "        <CMD_Element name=\"Age\">\n";
+	profileContent += "		<AttributeList>\n";
+	profileContent += "		    <Attribute>\n";
+	profileContent += "			<Name>ref</Name>\n"; // allowed here, only
+						   // forbidden on components
+	profileContent += "			<Type>string</Type>\n";
+	profileContent += "		    </Attribute>\n";
+	profileContent += "		    <Attribute>\n";
+	profileContent += "			<Name>ComponentId</Name>\n"; // allowed here, only
+							   // forbidden on
+							   // components
+	profileContent += "			<Type>string</Type>\n";
+	profileContent += "		    </Attribute>\n";
+	profileContent += "		</AttributeList>\n";
+	profileContent += "            <ValueScheme>\n";
+	profileContent += "                <pattern>[23][0-9]</pattern>\n";
+	profileContent += "            </ValueScheme>\n";
+	profileContent += "        </CMD_Element>\n";
+	profileContent += "    </CMD_Component>\n";
+	profileContent += "</CMD_ComponentSpec>\n";
+	InputStream input = new ByteArrayInputStream(profileContent.getBytes());
+
+	ProfileDescription desc = ProfileDescription.createNewDescription();
+        
+	MDValidator validator = new MDValidator(input, desc, testRegistry, marshaller);
+	assertFalse(validator.validate());
+	assertEquals(4, validator.getErrorMessages().size());
+	assertTrue(validator.getErrorMessages().get(0)
+		.startsWith(MDValidator.PARSE_ERROR));
+	assertTrue(validator.getErrorMessages().get(1)
+		.startsWith(MDValidator.PARSE_ERROR));
+    }
+
+    @Test
+    public void testValidateNoComponentId() throws Exception {
+	String profileContent = "";
+	profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+	profileContent += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+	profileContent += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+	profileContent += "    <Header />\n";
+	profileContent += "    <CMD_Component filename=\"component-actor.xml\"/>\n";
+	profileContent += "</CMD_ComponentSpec>\n";
+	InputStream input = new ByteArrayInputStream(profileContent.getBytes());
+
+	ProfileDescription desc = ProfileDescription.createNewDescription();
+        desc.setPublic(true);
+	MDValidator validator = new MDValidator(input, desc, testRegistry, marshaller);
+	assertFalse(validator.validate());
+	assertTrue(validator
+		.getErrorMessages()
+		.get(0)
+		.startsWith(MDValidator.COMPONENT_NOT_REGISTERED_ERROR));
+        //
+    }
+
+    @Test  
+    public void testValidateComponentIdNotRegistered() throws Exception {
+	String id1 = "component1";
+	String id2 = "component2";
+
+	String profileContent = "";
+	profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+	profileContent += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+	profileContent += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">";
+	profileContent += "    <Header />";
+	profileContent += "    <CMD_Component name=\"Test\">";
+	profileContent += "	<CMD_Component ComponentId=\""
+		+ ComponentDescription.COMPONENT_PREFIX + id1 + "\"/>"; // id not
+								// registered
+	profileContent += "	<CMD_Component ComponentId=\""
+		+ ComponentDescription.COMPONENT_PREFIX + id2 + "\"/>"; // id not
+								// registered
+	profileContent += "    </CMD_Component>";
+	profileContent += "</CMD_ComponentSpec>";
+
+	// Ids not registered. will return 2 errors: one per each id.
+	ProfileDescription desc = ProfileDescription.createNewDescription();
+        desc.setPublic(true);
+	MDValidator validator = new MDValidator(new ByteArrayInputStream(
+		profileContent.getBytes()), desc, testRegistry, marshaller);
+	assertFalse(validator.validate());
+	assertEquals(1, validator.getErrorMessages().size());
+	assertTrue(validator
+		.getErrorMessages()
+		.get(0)
+		.startsWith(MDValidator.COMPONENT_NOT_REGISTERED_ERROR));
+	
+
+	// id1 will be added as public and therefore only id2 is not registered
+	RegistryTestHelper.addComponent(testRegistry, id1, true);
+	validator = new MDValidator(new ByteArrayInputStream(
+		profileContent.getBytes()), desc, testRegistry
+                , marshaller);
+	assertFalse(validator.validate());
+	assertEquals(1, validator.getErrorMessages().size());
+	assertTrue(validator
+		.getErrorMessages()
+		.get(0)
+		.startsWith(MDValidator.COMPONENT_NOT_REGISTERED_ERROR));
+
+	// id2 is added as public, no more errors shoud be return
+	RegistryTestHelper.addComponent(testRegistry, id2, true);
+	validator = new MDValidator(new ByteArrayInputStream(
+		profileContent.getBytes()), desc, testRegistry, marshaller);
+	assertTrue("component is registered should be valid now",
+		validator.validate());
+	assertEquals(0, validator.getErrorMessages().size());
+    }
+
+    @Test
+    public void testValidateBaseAndUserRegistry() throws Exception {
+	String id1 = "component1";
+	String id2 = "component2";
+
+	String profileContent = "";
+	profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+	profileContent += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+	profileContent += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">";
+	profileContent += "    <Header />";
+	profileContent += "    <CMD_Component name=\"Test\">";
+	profileContent += "	<CMD_Component ComponentId=\""
+		+ ComponentDescription.COMPONENT_PREFIX + id1 + "\"/>"; // id not
+								// registered
+	profileContent += "	<CMD_Component ComponentId=\""
+		+ ComponentDescription.COMPONENT_PREFIX + id2 + "\"/>"; // id not
+								// registered
+	profileContent += "    </CMD_Component>";
+	profileContent += "</CMD_ComponentSpec>";
+
+        // Public Registry
+	ProfileDescription desc = ProfileDescription.createNewDescription();
+	MDValidator validator = new MDValidator(new ByteArrayInputStream(
+		profileContent.getBytes()), desc, testRegistry, marshaller);
+	assertFalse(validator.validate());
+	assertEquals(1, validator.getErrorMessages().size()); // the exception is thrown and propagated on the first non-registered component
+	assertTrue(validator.getErrorMessages().get(0)
+		.startsWith(MDValidator.COMPONENT_NOT_REGISTERED_ERROR));
+        
+	
+        // registering publically the first component
+	RegistryTestHelper.addComponent(testRegistry, id1, true);
+        validator = new MDValidator(new ByteArrayInputStream(
+		profileContent.getBytes()), desc, testRegistry, marshaller);
+        assertFalse(validator.validate());
+	assertEquals(1, validator.getErrorMessages().size()); // the exception is thrown on the second non-registered component
+	assertTrue(validator.getErrorMessages().get(0)
+		.startsWith(MDValidator.COMPONENT_NOT_REGISTERED_ERROR));
+        
+        
+        
+	RegistryTestHelper.addComponent(testRegistry, id2, false);
+	validator = new MDValidator(new ByteArrayInputStream(
+		profileContent.getBytes()), desc, testRegistry, marshaller);
+	assertFalse(validator.validate());
+	assertEquals(1, validator.getErrorMessages().size());
+	assertTrue(validator
+		.getErrorMessages()
+		.get(0)
+		.startsWith(MDValidator.COMPONENT_NOT_REGISTERED_IN_APPROPRIATE_SPACE_ERROR));
+        
+        
+        // make it user registry
+        testRegistry.setRegistryOwner(new OwnerUser(user.getId()));
+        testRegistry.setRegistrySpace(RegistrySpace.PRIVATE);       
+	
+        
+	validator = new MDValidator(new ByteArrayInputStream(
+		profileContent.getBytes()), desc, testRegistry,  marshaller);
+        Boolean result =validator.validate(); 
+	assertTrue(result);
+	assertEquals(0, validator.getErrorMessages().size());
+    }
+
+    @Test
+    public void testValidateNestedComponents() throws Exception {
+	String id1 = "component1";
+
+	String content = "";
+	content += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+	content += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+	content += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+	content += "    <Header />\n";
+	content += "    <CMD_Component name=\"Actor\" CardinalityMin=\"0\" CardinalityMax=\"unbounded\">\n";
+	content += "        <CMD_Element name=\"Name\" ValueScheme=\"string\" />\n";
+	content += "      <CMD_Component ComponentId=\""
+		+ ComponentDescription.COMPONENT_PREFIX + id1 + "\"/>\n"; // id not
+								  // registered
+	content += "    </CMD_Component>\n";
+	content += "</CMD_ComponentSpec>\n";
+
+	ComponentDescription desc = ComponentDescription.createNewDescription();
+	MDValidator validator = new MDValidator(new ByteArrayInputStream(
+		content.getBytes()), desc, testRegistry, marshaller);
+	assertFalse(validator.validate());
+	assertEquals(1, validator.getErrorMessages().size());
+	assertTrue(validator
+		.getErrorMessages()
+		.get(0)
+		.startsWith(MDValidator.COMPONENT_NOT_REGISTERED_ERROR));
+
+	RegistryTestHelper.addComponent(testRegistry, id1, true);
+	validator = new MDValidator(
+		new ByteArrayInputStream(content.getBytes()), desc,testRegistry, marshaller);
+	assertTrue(validator.validate());
+	assertEquals(0, validator.getErrorMessages().size());
+    }
+
+    /**
+     * Test of getCMDComponentSpec method, of class MDValidator.
+     */
+    @Test
+    public void testGetCMDComponentSpec() throws Exception {
+	String profileContent = getValidProfileString();
+	InputStream input = new ByteArrayInputStream(profileContent.getBytes());
+
+	ProfileDescription desc = ProfileDescription.createNewDescription();
+	MDValidator validator = new MDValidator(input, desc, testRegistry,marshaller);
+
+	// Spec is created during validation, before it should be null
+	assertNull(validator.getCMDComponentSpec());
+	validator.validate();
+
+	// Get spec created during validation
+	final CMDComponentSpec cmdComponentSpec = validator
+		.getCMDComponentSpec();
+	assertNotNull(cmdComponentSpec);
+
+	// Spec content should match XML
+	assertTrue(cmdComponentSpec.isIsProfile());
+	assertEquals("Actor", cmdComponentSpec.getCMDComponent().getName());
+
+	// Spec copy should be a freshly unmarshalled copy
+	final CMDComponentSpec specCopy = validator.getCopyOfCMDComponentSpec();
+	assertNotSame(cmdComponentSpec, specCopy);
+
+	// Content should still match XML
+	assertTrue(specCopy.isIsProfile());
+	assertEquals("Actor", specCopy.getCMDComponent().getName());
+    }
+
+    private MDValidator getValidProfileValidator() {
+	final String profileContent = getValidProfileString();
+	InputStream input = new ByteArrayInputStream(profileContent.getBytes());
+	ProfileDescription desc = ProfileDescription.createNewDescription();
+        desc.setPublic(true);
+        desc.setName("test_name");
+	MDValidator validator = new MDValidator(input, desc, testRegistry, marshaller);
+	return validator;
+    }
+
+    private String getValidProfileString() {
+	String profileContent = "";
+	profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+	profileContent += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+	profileContent += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+	profileContent += "    <Header />\n";
+	profileContent += "    <CMD_Component name=\"Actor\" CardinalityMin=\"0\" CardinalityMax=\"unbounded\">\n";
+	profileContent += "        <CMD_Element name=\"Age\">\n";
+	profileContent += "            <ValueScheme>\n";
+	profileContent += "                <pattern>[23][0-9]</pattern>\n";
+	profileContent += "            </ValueScheme>\n";
+	profileContent += "        </CMD_Element>\n";
+	profileContent += "    </CMD_Component>\n";
+	profileContent += "</CMD_ComponentSpec>\n";
+	return profileContent;
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/RegistryTestHelper.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/RegistryTestHelper.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/RegistryTestHelper.java	(revision 5961)
@@ -0,0 +1,463 @@
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.text.ParseException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.bind.JAXBException;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.persistence.jpa.CommentsDao;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStreamReader;
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Static helper methods to be used in tests
+ *
+ */
+public final class RegistryTestHelper {
+
+    private static MDMarshaller marshaller;
+    
+   
+            
+
+    @Autowired
+    public void setMarshaller(MDMarshaller marshaller) {
+        RegistryTestHelper.marshaller = marshaller;
+    }
+
+    public static ComponentDescription addComponent(ComponentRegistry testRegistry, String id, boolean isPublic) throws ParseException, JAXBException {
+        return addComponent(testRegistry, id, getComponentTestContent(), isPublic);
+    }
+
+    public static ComponentDescription addComponent(ComponentRegistry testRegistry, String id, String content, boolean isPublic) throws ParseException,
+            JAXBException, UnsupportedEncodingException {
+        return addComponent(testRegistry, id, new ByteArrayInputStream(content.getBytes("UTF-8")), isPublic);
+    }
+
+    private static ComponentDescription addComponent(ComponentRegistry testRegistry, String id, InputStream content, boolean isPublic) throws ParseException,
+            JAXBException {
+        ComponentDescription desc = ComponentDescription.createNewDescription();
+        desc.setCreatorName(DummyPrincipal.DUMMY_CREDENTIALS.getDisplayName());
+        desc.setUserId(DummyPrincipal.DUMMY_PRINCIPAL.getName());
+        desc.setName(id);
+        desc.setDescription("Test Description");
+        desc.setId(ComponentDescription.COMPONENT_PREFIX + id);
+        desc.setHref("link:" + desc.getId());
+        desc.setPublic(isPublic);
+        return addComponent(content, testRegistry, desc);
+    }
+
+    public static ComponentDescription addComponent(InputStream content, ComponentRegistry testRegistry, ComponentDescription desc) throws JAXBException {
+        CMDComponentSpec spec = marshaller.unmarshal(CMDComponentSpec.class, content, marshaller.getCMDComponentSchema());
+        testRegistry.register(desc, spec);
+        return desc;
+    }
+
+    public static ComponentDescription addComponentAnotherPrincipal(ComponentRegistry testRegistry, String id, boolean isPublic) throws ParseException, JAXBException {
+        return addComponentAnotherPrincipal(testRegistry, id, getComponentTestContent(), isPublic);
+    }
+
+    private static ComponentDescription addComponentAnotherPrincipal(ComponentRegistry testRegistry, String id, InputStream content, boolean isPublic) throws ParseException,
+            JAXBException {
+        ComponentDescription desc = ComponentDescription.createNewDescription();
+        desc.setCreatorName("AnotherPrincipal");
+        desc.setUserId("AnotherPrincipal");
+        desc.setDbUserId(2);
+        desc.setName(id);
+        desc.setDescription("Test Description");
+        desc.setId(ComponentDescription.COMPONENT_PREFIX + id);
+        desc.setHref("link:" + desc.getId());
+        desc.setPublic(isPublic);
+        return addComponent(content, testRegistry, desc);
+    }
+
+    public static String getProfileTestContentString() {
+        return getProfileTestContentString("Actor");
+    }
+
+    private static String getProfileTestContentString(String name) {
+        String profileContent = "";
+        profileContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        profileContent += "<CMD_ComponentSpec isProfile=\"true\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        profileContent += "    xsi:noNamespaceSchemaLocation=\"general-component-schema.xsd\">\n";
+        profileContent += "    <Header />\n";
+        profileContent += "    <CMD_Component name=\"" + name + "\" CardinalityMin=\"0\" CardinalityMax=\"unbounded\">\n";
+        profileContent += "        <AttributeList>\n";
+        profileContent += "            <Attribute>\n";
+        profileContent += "                <Name>Name</Name>\n";
+        profileContent += "                <Type>string</Type>\n";
+        profileContent += "            </Attribute>\n";
+        profileContent += "        </AttributeList>\n";
+        profileContent += "        <CMD_Element name=\"Age\">\n";
+        profileContent += "            <ValueScheme>\n";
+        profileContent += "                <pattern>[23][0-9]</pattern>\n";
+        profileContent += "            </ValueScheme>\n";
+        profileContent += "        </CMD_Element>\n";
+        profileContent += "    </CMD_Component>\n";
+        profileContent += "</CMD_ComponentSpec>\n";
+        return profileContent;
+    }
+
+    public static InputStream getTestProfileContent() {
+        return getTestProfileContent("Actor");
+    }
+
+    public static InputStream getTestProfileContent(String name) {
+        return new ByteArrayInputStream(getProfileTestContentString(name).getBytes());
+    }
+
+    public static ProfileDescription addProfile(ComponentRegistry testRegistry, String id, boolean isPublic) throws ParseException, JAXBException, ItemNotFoundException {
+        return addProfile(testRegistry, id, RegistryTestHelper.getTestProfileContent(), isPublic);
+    }
+
+    public static ProfileDescription addProfile(ComponentRegistry testRegistry, String id, String content, boolean isPublic) throws ParseException,
+            JAXBException, ItemNotFoundException {
+        return addProfile(testRegistry, id, new ByteArrayInputStream(content.getBytes()), isPublic);
+    }
+
+    private static ProfileDescription addProfile(ComponentRegistry testRegistry, String id, InputStream content, boolean isPublic) throws ParseException,
+            JAXBException, ItemNotFoundException {
+        ProfileDescription desc = ProfileDescription.createNewDescription();
+        desc.setCreatorName(DummyPrincipal.DUMMY_CREDENTIALS.getDisplayName());
+        desc.setUserId(DummyPrincipal.DUMMY_CREDENTIALS.getPrincipalName());
+        desc.setName(id);
+        desc.setDescription("Test Description");
+        desc.setId(ProfileDescription.PROFILE_PREFIX + id);
+        desc.setHref("link:" + ProfileDescription.PROFILE_PREFIX + id);
+        desc.setPublic(isPublic);
+        return addProfile(content, testRegistry, desc);
+    }
+
+    public static ProfileDescription addProfile(InputStream content, ComponentRegistry testRegistry, ProfileDescription desc) throws JAXBException {
+        CMDComponentSpec spec = marshaller.unmarshal(CMDComponentSpec.class, content, marshaller.getCMDComponentSchema());
+        testRegistry.register(desc, spec);
+        return desc;
+    }
+
+    public static ProfileDescription addProfileAnotherPrincipal(ComponentRegistry testRegistry, String id, boolean isPublic) throws ParseException, JAXBException, ItemNotFoundException {
+        return addProfileAnotherPrincipal(testRegistry, id, RegistryTestHelper.getTestProfileContent(), isPublic);
+    }
+
+    private static ProfileDescription addProfileAnotherPrincipal(ComponentRegistry testRegistry, String id, InputStream content, boolean isPublic) throws ParseException,
+            JAXBException, ItemNotFoundException {
+        ProfileDescription desc = ProfileDescription.createNewDescription();
+        desc.setCreatorName("AnotherPrincipal");
+        desc.setUserId("AnotherPrincipal");
+        desc.setDbUserId(2);
+        desc.setName(id);
+        desc.setDescription("Test Description");
+        desc.setId(ProfileDescription.PROFILE_PREFIX + id);
+        desc.setHref("link:" + ProfileDescription.PROFILE_PREFIX + id);
+        desc.setPublic(isPublic);
+        return addProfile(content, testRegistry, desc);
+    }
+
+    public static CMDComponentSpec getTestProfile() throws JAXBException {
+        return marshaller.unmarshal(CMDComponentSpec.class, getTestProfileContent(), marshaller.getCMDComponentSchema());
+    }
+
+    public static String getComponentTestContentString() {
+        return getComponentTestContentString("Access");
+    }
+
+    public static InputStream getComponentTestContent() {
+        return getComponentTestContentAsStream("Access");
+    }
+
+    public static String getComponentTestContentString(String componentName) {
+        String compContent = "";
+        compContent += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+        compContent += "\n";
+        compContent += "<CMD_ComponentSpec isProfile=\"false\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
+        compContent += "    xsi:noNamespaceSchemaLocation=\"../../general-component-schema.xsd\">\n";
+        compContent += "    \n";
+        compContent += "    <Header/>\n";
+        compContent += "    \n";
+        compContent += "    <CMD_Component name=\"" + componentName + "\" CardinalityMin=\"1\" CardinalityMax=\"1\">\n";
+        compContent += "        <CMD_Element name=\"Availability\" ValueScheme=\"string\" />\n";
+        compContent += "        <CMD_Element name=\"Date\">\n";
+        compContent += "            <ValueScheme>\n";
+        compContent += "                <!-- matching dates of the pattern yyyy-mm-dd (ISO 8601); this only matches dates from the years 1000 through 2999 and does allow some invalid dates (e.g. February, the 30th) -->\n";
+        compContent += "                <pattern>(1|2)\\d{3}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])</pattern>                \n";
+        compContent += "            </ValueScheme>\n";
+        compContent += "        </CMD_Element>\n";
+        compContent += "        <CMD_Element name=\"Owner\" ValueScheme=\"string\" />\n";
+        compContent += "        <CMD_Element name=\"Publisher\" ValueScheme=\"string\" />\n";
+        compContent += "    </CMD_Component>\n";
+        compContent += "\n";
+        compContent += "</CMD_ComponentSpec>\n";
+        return compContent;
+    }
+
+    public static String getStringFromStream(InputStream largeProfileStream) throws IOException {
+        try {
+            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(largeProfileStream));
+            StringBuilder profileStringBuilder = new StringBuilder();
+            String line;
+            while (null != (line = bufferedReader.readLine())) {
+                profileStringBuilder.append(line);
+            }
+            return profileStringBuilder.toString();
+        } finally {
+            largeProfileStream.close();
+        }
+    }
+    ///////////////////////////////////////////////////////
+
+    public static String getLargeProfileContent() throws IOException {
+        InputStream largeProfileStream = RegistryTestHelper.class.getResourceAsStream("/xml/largeProfile.xml");
+        return getStringFromStream(largeProfileStream);
+    }
+
+    //////////////////////
+    public static CMDComponentSpec getComponentFromString(String contentString) throws JAXBException {
+        return marshaller.unmarshal(CMDComponentSpec.class, getComponentContentAsStream(contentString), marshaller.getCMDComponentSchema());
+    }
+
+    public static InputStream getComponentContentAsStream(String content) {
+        return new ByteArrayInputStream(content.getBytes());
+    }
+
+    public static InputStream getComponentTestContentAsStream(String componentName) {
+        return getComponentContentAsStream(getComponentTestContentString(componentName));
+    }
+
+    public static CMDComponentSpec getTestComponent() throws JAXBException {
+        return marshaller.unmarshal(CMDComponentSpec.class, getComponentTestContent(), marshaller.getCMDComponentSchema());
+    }
+
+    public static CMDComponentSpec getTestComponent(String name) throws JAXBException {
+        return marshaller.unmarshal(CMDComponentSpec.class, getComponentTestContentAsStream(name), marshaller.getCMDComponentSchema());
+    }
+
+    public static String getXml(CMDComponentSpec componentSpec) throws JAXBException, UnsupportedEncodingException {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        marshaller.marshal(componentSpec, os);
+        String xml = os.toString();
+        try {
+            os.close();
+        } catch (IOException ex) {
+        }
+        return xml;
+    }
+
+    public static Comment addComment(ComponentRegistry testRegistry, String id, String descriptionId, String principal) throws ParseException, JAXBException, ComponentRegistryException, ItemNotFoundException, UserUnauthorizedException, AuthenticationRequiredException {
+        return addComment(testRegistry, RegistryTestHelper.getTestCommentContent(id, descriptionId), principal);
+    }
+
+    private static Comment addComment(ComponentRegistry testRegistry, InputStream content, String principal) throws ParseException,
+            JAXBException,
+            ComponentRegistryException, ItemNotFoundException, UserUnauthorizedException, AuthenticationRequiredException {
+        Comment spec = marshaller.unmarshal(Comment.class, content, null);
+        testRegistry.registerComment(spec, principal);
+        return spec;
+    }
+    
+    public Comment addCommentBypassAuthorisation(CommentsDao commentsDao, String id, String descriptionId, String principal) throws ParseException, JAXBException, ComponentRegistryException, ItemNotFoundException, UserUnauthorizedException {
+        return addCommentBypassAuthorisation(commentsDao, RegistryTestHelper.getTestCommentContent(id, descriptionId), principal);
+    }
+
+
+    private Comment addCommentBypassAuthorisation(CommentsDao commentsDao, InputStream content, String principal) throws ParseException,
+            JAXBException,
+            ComponentRegistryException, ItemNotFoundException, UserUnauthorizedException {
+        Comment comment = marshaller.unmarshal(Comment.class, content, null);
+        comment.setCommentDate(new Date());
+        comment.setUserId(2);
+        commentsDao.saveAndFlush(comment);
+        return comment;
+    }
+
+    public static String getCommentTestContentStringForProfile(String commentName, String profileId) {
+        String comContent = "";
+        comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+        comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+        comContent += "    <comments>" + commentName + "</comments>\n";
+        comContent += "    <commentDate>" + DatesHelper.createNewDate() + "</commentDate>\n";
+        comContent += "    <componentId>" + profileId + "</componentId>\n";
+        comContent += "    <userName>JUnit@test.com</userName>\n";
+        comContent += "</comment>\n";
+        return comContent;
+    }
+    
+     public static String getanotherPrincipalCommentTestContentStringForProfile(String commentName, String profileId) {
+        String comContent = "";
+        comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+        comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+        comContent += "    <comments>" + commentName + "</comments>\n";
+        comContent += "    <commentDate>" + DatesHelper.createNewDate() + "</commentDate>\n";
+        comContent += "    <componentId>" + profileId + "</componentId>\n";
+        comContent += "    <userName>anotherPrincipal</userName>\n";
+        comContent += "</comment>\n";
+        return comContent;
+    }
+
+    public static String getCommentTestContentStringForComponent(String commentName, String componentId) {
+        String comContent = "";
+        comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+        comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+        comContent += "    <comments>" + commentName + "</comments>\n";
+        comContent += "    <commentDate>" + DatesHelper.createNewDate() + "</commentDate>\n";
+        comContent += "     <componentId>" + componentId + "</componentId>";
+        comContent += "    <userName>JUnit@test.com</userName>\n";
+        comContent += "</comment>\n";
+        return comContent;
+    }
+    
+     public static String getAnotherPrincipalCommentTestContentStringForComponent(String commentName, String componentId) {
+        String comContent = "";
+        comContent += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
+        comContent += "<comment xmlns:ns2=\"http://www.w3.org/1999/xlink\">\n";
+        comContent += "    <comments>" + commentName + "</comments>\n";
+        comContent += "    <commentDate>" + DatesHelper.createNewDate() + "</commentDate>\n";
+        comContent += "     <componentId>" + componentId + "</componentId>";
+        comContent += "    <userName>anotherPrincipal</userName>\n";
+        comContent += "</comment>\n";
+        return comContent;
+    }
+
+    public static InputStream getTestCommentContent(String content, String descriptionId) {
+        if (descriptionId.contains("profile")) {
+            return new ByteArrayInputStream(getCommentTestContentStringForProfile(content, descriptionId).getBytes());
+        } else {
+            return new ByteArrayInputStream(getCommentTestContentStringForComponent(content, descriptionId).getBytes());
+        }
+    }
+
+    public static String getCommentTestContent(String commentId, String descriptionId) {
+        return getCommentTestContentStringForProfile(commentId, descriptionId);
+    }
+
+    public static InputStream getCommentTestContent() {
+        return getTestCommentContent("Actual", ProfileDescription.PROFILE_PREFIX + "profile1");
+    }
+    
+  
+
+    /**
+     * Testing a big xsd string is a bit hard, so doing a best effort by
+     * checking the xs:element which represent the nested components used in a
+     * profile/component
+     */
+    public static boolean hasComponent(String xsd, String name, String min, String max) {
+        Pattern pattern = Pattern.compile("<xs:element name=\"" + name + "\" minOccurs=\"" + min + "\" maxOccurs=\"" + max + "\">");
+        Matcher matcher = pattern.matcher(xsd);
+        return matcher.find() && !matcher.find(); //find only one
+    }
+
+    /**
+     *
+     * @param bytes is an array of bytes to be written in the file filename
+     * (from scratch!)
+     * @param filename is the name of the file where the array "bytes" is to be
+     * written to
+     * @throws IOException
+     * @throws JAXBException
+     */
+    public static void writeBytesToFile(byte[] bytes, String filename) throws IOException, JAXBException {
+
+        File file = new File(filename);
+        FileOutputStream fop = new FileOutputStream(file);
+
+        fop.write(bytes);
+
+        fop.flush();
+        fop.close();
+
+
+    }
+
+    /**
+     *
+     * @param str is a string which is to be written into the filename (from
+     * scratch!)
+     * @param filename is a filename where the string is to be written to
+     * @throws IOException
+     * @throws JAXBException
+     */
+    public static void writeStringToFile(String str, String filename) throws IOException, JAXBException {
+
+        writeBytesToFile(str.getBytes(), filename);
+
+
+    }
+
+    /**
+     *
+     * @param os is an output stream which is to be written into the filename
+     * (from scratch!)
+     * @param filename is a filename where the stream is to be written to
+     * @throws IOException
+     * @throws JAXBException
+     */
+    public static void writeStreamToFile(ByteArrayOutputStream os, String filename) throws IOException, JAXBException {
+
+        writeBytesToFile(os.toByteArray(), filename);
+
+
+    }
+
+    /**
+     *
+     * @param cdesc is a component which is to be written into the filename
+     * (from scratch!)
+     * @param filename is a filename where the component is to be written to
+     * @throws IOException
+     * @throws JAXBException
+     */
+    public static void writeComponentIntoFile(ComponentDescription cdesc, String filename) throws IOException, JAXBException {
+
+
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        marshaller.marshal(cdesc, os);
+
+        writeStreamToFile(os, filename);
+
+    }
+
+    /**
+     * opens a temporary sub-directory dirName in /target/
+     *
+     * @param dirName is the name of the temporary subdirectory which is to be
+     * opened
+     * @return the absolute part for this directory
+     */
+    public static String openTestDir(String dirName) {
+
+        File testDir = new File("target/" + dirName);
+
+
+        testDir.mkdir();
+
+        System.out.println(dirName);
+        //String retval = new File(testDir, dirName).getAbsolutePath();
+        String retval = new File(testDir, "/").getAbsolutePath();
+
+        return (retval);
+
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/RestGroupServiceTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/RestGroupServiceTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/RestGroupServiceTest.java	(revision 5961)
@@ -0,0 +1,1174 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.impl.database.ComponentRegistryTestDatabase;
+import clarin.cmdi.componentregistry.impl.database.GroupService;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.CommentResponse;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.Group;
+import clarin.cmdi.componentregistry.model.Ownership;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.jpa.CommentsDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+import static clarin.cmdi.componentregistry.rest.ComponentRegistryRestServiceTestCase.COMPONENT_LIST_GENERICTYPE;
+import static clarin.cmdi.componentregistry.rest.IComponentRegistryRestService.GROUPID_PARAM;
+import static clarin.cmdi.componentregistry.rest.IComponentRegistryRestService.REGISTRY_SPACE_GROUP;
+import static clarin.cmdi.componentregistry.rest.IComponentRegistryRestService.REGISTRY_SPACE_PARAM;
+import clarin.cmdi.componentregistry.rss.Rss;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.multipart.FormDataMultiPart;
+import java.text.ParseException;
+import java.util.List;
+import javax.ws.rs.core.MediaType;
+import javax.xml.bind.JAXBException;
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.springframework.util.Assert;
+
+/**
+ *
+ * Test groups:
+ *
+ * A
+ * Owner: Dummy Members: - Items: profile-1, component-1, component-2
+ *
+ * B
+ * Owner: anotherPrincipal Members: Dummy Items: Bprofile-1, Bcomponent-1,
+ * Bcomponent-2
+ *
+ * C
+ * Owner: anotherPrincipal Members: - Items: Cprofile-1, Ccomponent-1,
+ * Ccomponent-2
+ *
+ * D
+ * Owner: anotherPrincipal Members: Dummy, anotherPrincipal Items: Dprofile-1,
+ * Dcomponent-1, Dcomponent-2
+ *
+ * @author olhsha
+ * @author twagoo
+ */
+public class RestGroupServiceTest extends ComponentRegistryRestServiceTestCase {
+
+    @Autowired
+    private ComponentRegistryFactory componentRegistryFactory;
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    @Autowired
+    private GroupService groupService;
+    @Autowired
+    private UserDao userDao;
+    @Autowired
+    private CommentsDao commentsDao;
+
+    private ComponentRegistry baseRegistry;
+
+    @Before
+    public void init() {
+        ComponentRegistryTestDatabase.resetAndCreateAllTables(jdbcTemplate);
+        createUserRecord();
+        baseRegistry = componentRegistryFactory.getBaseRegistry(DummyPrincipal.DUMMY_CREDENTIALS);
+    }
+
+    protected void createAntherUserRecord() {
+        RegistryUser user = new RegistryUser();
+        user.setName("Another database test user");
+        user.setPrincipalName("anotherPrincipal");
+        userDao.save(user);
+    }
+
+    private void MakeGroupA() {
+        groupService.createNewGroup("group A", DummyPrincipal.DUMMY_PRINCIPAL.getName());
+    }
+
+    private void fillUpGroupA() throws ParseException, JAXBException, ItemNotFoundException {
+
+        MakeGroupA();
+
+        RegistryTestHelper.addProfile(baseRegistry, "profile-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "component-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "component-2", false);
+
+        Ownership ownership = new Ownership();
+        ownership.setComponentId(ProfileDescription.PROFILE_PREFIX + "profile-1");
+        ownership.setGroupId(1);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "component-1");
+        ownership.setGroupId(1);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "component-2");
+        ownership.setGroupId(1);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+    }
+
+    private void MakeGroupB() throws ItemNotFoundException {
+        createAntherUserRecord();
+        groupService.createNewGroup("group B", "anotherPrincipal");
+        groupService.makeMember(DummyPrincipal.DUMMY_PRINCIPAL.getName(), "group B");
+    }
+
+    private void fillUpGroupB() throws ParseException, JAXBException, ItemNotFoundException {
+
+        MakeGroupB();
+
+        RegistryTestHelper.addProfile(baseRegistry, "Bprofile-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "Bcomponent-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "Bcomponent-2", false);
+
+        Ownership ownership = new Ownership();
+        ownership.setComponentId(ProfileDescription.PROFILE_PREFIX + "Bprofile-1");
+        ownership.setGroupId(2);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1");
+        ownership.setGroupId(2);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "Bcomponent-2");
+        ownership.setGroupId(2);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+    }
+
+    private void MakeGroupC() throws ItemNotFoundException {
+        groupService.createNewGroup("group C", "anotherPrincipal");
+    }
+
+    private void fillUpGroupC() throws ParseException, JAXBException, ItemNotFoundException {
+
+        MakeGroupC();
+
+        RegistryTestHelper.addProfileAnotherPrincipal(baseRegistry, "Cprofile-1", false);
+        RegistryTestHelper.addComponentAnotherPrincipal(baseRegistry, "Ccomponent-1", false);
+        RegistryTestHelper.addComponentAnotherPrincipal(baseRegistry, "Ccomponent-2", false);
+
+        Ownership ownership = new Ownership();
+        ownership.setComponentId(ProfileDescription.PROFILE_PREFIX + "Cprofile-1");
+        ownership.setGroupId(3);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1");
+        ownership.setGroupId(3);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "Ccomponent-2");
+        ownership.setGroupId(3);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+    }
+
+    private void MakeGroupD() throws ItemNotFoundException {
+        groupService.createNewGroup("group D", "anotherPrincipal");
+        groupService.makeMember("anotherPrincipal", "group D");
+        groupService.makeMember(DummyPrincipal.DUMMY_PRINCIPAL.getName(), "group D");
+    }
+
+    private void fillUpGroupD() throws ParseException, JAXBException, ItemNotFoundException {
+
+        MakeGroupD();
+
+        RegistryTestHelper.addProfileAnotherPrincipal(baseRegistry, "Dprofile-1", false);
+        RegistryTestHelper.addComponentAnotherPrincipal(baseRegistry, "Dcomponent-1", false);
+        RegistryTestHelper.addComponentAnotherPrincipal(baseRegistry, "Dcomponent-2", false);
+
+        Ownership ownership = new Ownership();
+        ownership.setComponentId(ProfileDescription.PROFILE_PREFIX + "Dprofile-1");
+        ownership.setGroupId(4);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "Dcomponent-1");
+        ownership.setGroupId(4);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX + "Dcomponent-2");
+        ownership.setGroupId(4);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+    }
+
+//    List<Group> getGroupsTheCurrentUserIsAMemberOf();   
+    @Test
+    public void testGetGroupsTheCurrentUserIsAMemberOf() throws ItemNotFoundException {
+        System.out.println("test getGroupsTheCurrentUserIsAMemberOfr");
+
+        MakeGroupA();
+        MakeGroupB();
+        // test itself
+
+        List<Group> result = this.getAuthenticatedResource(getResource()
+                .path("/registry/groups/usermembership"))
+                .accept(MediaType.APPLICATION_XML).get(GROUP_LIST_GENERICTYPE);
+
+        assertEquals(1, result.size());
+        assertEquals("group B", result.get(0).getName());
+    }
+//    Response transferItemOwnershipToGroup(String itemId, long groupId) throws IOException;   
+//   
+
+    @Test
+    public void testTransferOwnership() throws Exception {
+        System.out.println("test makeTransferOwnership");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+        fillUpGroupD();
+        // test itself
+
+        RegistryTestHelper.addComponent(baseRegistry, "test_component", false);
+        RegistryTestHelper.addProfile(baseRegistry, "test_profile", false);
+        String test_profile_id = ProfileDescription.PROFILE_PREFIX + "test_profile";
+        String test_component_id = ComponentDescription.COMPONENT_PREFIX + "test_component";
+        //I'm not a member
+        ClientResponse cr = this.getAuthenticatedResource(getResource()
+                .path("/registry/items/" + test_profile_id + "/transferownership").queryParam("groupId", "3")).accept(MediaType.APPLICATION_XML).post(ClientResponse.class);
+        assertEquals(403, cr.getStatus());
+
+        //make me a member
+        groupService.makeMember(DummyPrincipal.DUMMY_PRINCIPAL.getName(), "group C");
+        assertTrue(groupService.userGroupMember(DummyPrincipal.DUMMY_PRINCIPAL.getName(), 3));
+
+        cr = this.getAuthenticatedResource(getResource()
+                .path("/registry/items/" + test_profile_id + "/transferownership").queryParam("groupId", "3")).accept(MediaType.APPLICATION_XML).post(ClientResponse.class);
+        assertEquals(200, cr.getStatus());
+        cr = this.getAuthenticatedResource(getResource()
+                .path("/registry/items/" + test_component_id + "/transferownership").queryParam("groupId", "3")).accept(MediaType.APPLICATION_XML).post(ClientResponse.class);
+        assertEquals(200, cr.getStatus());
+
+        List<String> components = groupService.getComponentIdsInGroup(3);
+        assertEquals(3, components.size());
+        assertEquals(test_component_id, components.get(2));
+        List<String> profiles = groupService.getProfileIdsInGroup(3);
+        assertEquals(2, profiles.size());
+        assertEquals(test_profile_id, profiles.get(1));
+
+    }
+
+    @Test
+    public void testTransferOwnershipBetweenGroups() throws Exception {
+        System.out.println("test makeTransferOwnership");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+        fillUpGroupD();
+        // test itself
+
+        // this profile was created and moved into group D by someone else
+        String test_profile_id = ProfileDescription.PROFILE_PREFIX + "Dprofile-1";
+        // try to move to group C
+        ClientResponse cr = this.getAuthenticatedResource(getResource()
+                .path("/registry/items/" + test_profile_id + "/transferownership").queryParam("groupId", "2")).accept(MediaType.APPLICATION_XML).post(ClientResponse.class);
+        // I am member of both groups, so should be allowed
+        assertEquals("Moving between groups should be allowed as long as user is member", 200, cr.getStatus());
+
+        // this component was created and moved into group D by someone else
+        String test_component_id = ComponentDescription.COMPONENT_PREFIX + "Dcomponent-1";
+        // try to move to group C
+        cr = this.getAuthenticatedResource(getResource()
+                .path("/registry/items/" + test_component_id + "/transferownership").queryParam("groupId", "3")).accept(MediaType.APPLICATION_XML).post(ClientResponse.class);
+        // I am not a member of groups C, so should not be allowed
+        assertEquals("Moving between groups should not be allowed if user is not member", 403, cr.getStatus());
+
+        // component in group C
+        test_component_id = ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1";
+        // try to move to group B (which I am a member of)
+        cr = this.getAuthenticatedResource(getResource()
+                .path("/registry/items/" + test_component_id + "/transferownership").queryParam("groupId", "2")).accept(MediaType.APPLICATION_XML).post(ClientResponse.class);
+        // I am not a member of group C, so should not be allowed
+        assertEquals("Moving between groups should not be allowed if user is not member", 403, cr.getStatus());
+
+    }
+
+    @Test
+    public void testGetGroupProfilesAndComponents() throws Exception {
+
+        System.out.println("test getGroupProfiles");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        // lists
+        List<ProfileDescription> response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "1")).accept(MediaType.APPLICATION_XML)
+                .get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(1, response.size());
+
+        List<ComponentDescription> responseC = this.getAuthenticatedResource(getResource()
+                .path("/registry/components").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "1")).accept(MediaType.APPLICATION_XML)
+                .get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(2, responseC.size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "2")).accept(MediaType.APPLICATION_XML)
+                .get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(1, response.size());
+
+        responseC = this.getAuthenticatedResource(getResource()
+                .path("/registry/components").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "2")).accept(MediaType.APPLICATION_XML)
+                .get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(2, responseC.size());
+
+        ClientResponse clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "3")).accept(MediaType.APPLICATION_XML)
+                .get(ClientResponse.class);
+
+        assertEquals(403, clientResponse.getStatus());
+
+        // particular components and profiles
+        CMDComponentSpec component = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1"))
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull(component);
+        assertEquals("Actor", component.getCMDComponent().getName());
+
+        component = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1"))
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull(component);
+        assertEquals("Access", component.getCMDComponent().getName());
+
+        component = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1"))
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull(component);
+        assertEquals("Actor", component.getCMDComponent().getName());
+
+        component = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1"))
+                .accept(MediaType.APPLICATION_JSON).get(CMDComponentSpec.class);
+        assertNotNull(component);
+        assertEquals("Access", component.getCMDComponent().getName());
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+    }
+
+    @Test
+    public void testGetGroupComments() throws Exception {
+
+        System.out.println("test getGroupComments");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTc1", ComponentDescription.COMPONENT_PREFIX + "component-1",
+                "JUnit@test.com");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTp1", ProfileDescription.PROFILE_PREFIX + "profile-1",
+                "JUnit@test.com");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTBc1", ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1",
+                "anotherPrincipal");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTBp1", ProfileDescription.PROFILE_PREFIX + "Bprofile-1",
+                "anotherPrincipal");
+        (new RegistryTestHelper()).addCommentBypassAuthorisation(commentsDao, "COMMENTCc1", ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1",
+                "anotherPrincipal");
+        (new RegistryTestHelper()).addCommentBypassAuthorisation(commentsDao, "COMMENTCp1", ProfileDescription.PROFILE_PREFIX + "Cprofile-1", "anotherPrincipal");
+
+        // lists 
+        List<Comment> response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1" + "/comments/"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, response.size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ProfileDescription.PROFILE_PREFIX + "profile-1" + "/comments/"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, response.size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1" + "/comments/"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, response.size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1" + "/comments/"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(COMMENT_LIST_GENERICTYPE);
+        assertEquals(1, response.size());
+
+        ClientResponse clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1/comments"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1/comments"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+        // particular comments
+        Comment responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1" + "/comments/1"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+
+        assertEquals(1, Long.parseLong(responseComment.getId()));
+
+        responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1" + "/comments/2"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+
+        assertEquals(2, Long.parseLong(responseComment.getId()));
+
+        responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1" + "/comments/3"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+        assertEquals(3, Long.parseLong(responseComment.getId()));
+
+        responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1" + "/comments/4"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+        assertEquals(4, Long.parseLong(responseComment.getId()));
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1/comments/6"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1/comments/5"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+    }
+
+    @Test
+    public void testGetGroupRss() throws Exception {
+
+        System.out.println("test getGroupRss");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        // lists of profiles and components
+        Rss response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/rss").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "1")).accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(1, response.getChannel().getItem().size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/rss").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "1")).accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(2, response.getChannel().getItem().size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/rss").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "2")).accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(1, response.getChannel().getItem().size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/rss").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "2")).accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(2, response.getChannel().getItem().size());
+
+        ClientResponse clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components").queryParam("registrySpace", REGISTRY_SPACE_GROUP).queryParam("groupId", "3")).accept(MediaType.APPLICATION_XML)
+                .get(ClientResponse.class);
+
+        assertEquals(403, clientResponse.getStatus());
+
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTc1", ComponentDescription.COMPONENT_PREFIX + "component-1",
+                "JUnit@test.com");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTp1", ProfileDescription.PROFILE_PREFIX + "profile-1",
+                "JUnit@test.com");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTBc1", ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1",
+                "anotherPrincipal");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTBp1", ProfileDescription.PROFILE_PREFIX + "Bprofile-1",
+                "anotherPrincipal");
+        (new RegistryTestHelper()).addCommentBypassAuthorisation(commentsDao, "COMMENTCc1", ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1",
+                "anotherPrincipal");
+        (new RegistryTestHelper()).addCommentBypassAuthorisation(commentsDao, "COMMENTCp1", ProfileDescription.PROFILE_PREFIX + "Cprofile-1", "anotherPrincipal");
+
+        // lists 
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1" + "/comments/rss"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(1, response.getChannel().getItem().size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1" + "/comments/rss"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(1, response.getChannel().getItem().size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1" + "/comments/rss"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(1, response.getChannel().getItem().size());
+
+        response = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1" + "/comments/rss"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Rss.class);
+        assertEquals(1, response.getChannel().getItem().size());
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1/comments/rss"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1/comments/rss"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+        // particular comments
+        Comment responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1" + "/comments/1"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+
+        assertEquals(1, Long.parseLong(responseComment.getId()));
+
+        responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1" + "/comments/2"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+
+        assertEquals(2, Long.parseLong(responseComment.getId()));
+
+        responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1" + "/comments/3"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+        assertEquals(3, Long.parseLong(responseComment.getId()));
+
+        responseComment = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1" + "/comments/4"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(Comment.class);
+        assertNotNull(responseComment);
+        assertEquals(4, Long.parseLong(responseComment.getId()));
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1/comments/6"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+        clientResponse = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1/comments/5"))
+                .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+        assertEquals(403, clientResponse.getStatus());
+
+    }
+
+    private FormDataMultiPart createFormData(Object content) {
+        return createFormData(content, "My Test");
+    }
+
+    private FormDataMultiPart createFormData(Object content, String description) {
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD, content,
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD, "Test1");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                description);
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD, "My domain");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD, "TestGroup");
+        return form;
+    }
+
+    @Test
+    public void testUpdateGroupComponentAndProfile() throws Exception {
+
+        System.out.println("test updateGorupComponent");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        FormDataMultiPart form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        ClientResponse cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1" + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        RegisterResponse response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertFalse(response.isProfile());
+        assertTrue(response.isPrivate());
+        ComponentDescription desc = (ComponentDescription) response.getDescription();
+        assertNotNull(desc);
+        assertEquals("Test1", desc.getName());
+        assertEquals("UPDATE DESCRIPTION!", desc.getDescription());
+
+        form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1" + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertFalse(response.isProfile());
+        assertTrue(response.isPrivate());
+        desc = (ComponentDescription) response.getDescription();
+        assertNotNull(desc);
+        assertEquals("Test1", desc.getName());
+        assertEquals("UPDATE DESCRIPTION!", desc.getDescription());
+
+        form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1" + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(403, cResponse.getStatus());
+
+        // profile
+        form = createFormData(RegistryTestHelper.getTestProfileContent("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1" + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertTrue(response.isProfile());
+        assertTrue(response.isPrivate());
+        ProfileDescription pdesc = (ProfileDescription) response.getDescription();
+        assertNotNull(pdesc);
+        assertEquals("Test1", pdesc.getName());
+        assertEquals("UPDATE DESCRIPTION!", pdesc.getDescription());
+
+        form = createFormData(
+                RegistryTestHelper.getTestProfileContent("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1" + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(ClientResponse.Status.OK.getStatusCode(),
+                cResponse.getStatus());
+        response = cResponse.getEntity(RegisterResponse.class);
+        assertTrue(response.isRegistered());
+        assertTrue(response.isProfile());
+        assertTrue(response.isPrivate());
+        pdesc = (ProfileDescription) response.getDescription();
+        assertNotNull(pdesc);
+        assertEquals("Test1", pdesc.getName());
+        assertEquals("UPDATE DESCRIPTION!", pdesc.getDescription());
+
+        form = createFormData(
+                RegistryTestHelper.getTestProfileContent("TESTNAME"),
+                "UPDATE DESCRIPTION!");
+        cResponse = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1" + "/update")).type(
+                        MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
+        assertEquals(403, cResponse.getStatus());
+
+    }
+
+    @Test
+    public void testPublishGroupProfileAndComponent() throws Exception {
+
+        System.out.println("testPublishProfile");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        baseRegistry.setRegistrySpace(RegistrySpace.PUBLISHED);
+
+        FormDataMultiPart form = createFormData(
+                RegistryTestHelper.getTestProfileContent("publishedName"),
+                "Published");
+        RegisterResponse response = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1" + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertFalse(response.isPrivate());
+        assertTrue(response.isProfile());
+        assertEquals(ProfileDescription.PROFILE_PREFIX + "profile-1", response.getDescription().getId());
+
+        List<ProfileDescription> profiles = baseRegistry.getProfileDescriptions();
+        assertEquals(1, profiles.size());
+        ProfileDescription profileDescription = profiles.get(0);
+        assertEquals(ProfileDescription.PROFILE_PREFIX + "profile-1", profileDescription.getId());
+        assertEquals("link:" + ProfileDescription.PROFILE_PREFIX + "profile-1",
+                profileDescription.getHref());
+        assertEquals("Published", profileDescription.getDescription());
+
+        // not my profile from "my" group
+        form = createFormData(
+                RegistryTestHelper.getTestProfileContent("publishedName"),
+                "Published");
+        response = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1" + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertFalse(response.isPrivate());
+        assertTrue(response.isProfile());
+        assertEquals(ProfileDescription.PROFILE_PREFIX + "Bprofile-1", response.getDescription().getId());
+
+        profiles = baseRegistry.getProfileDescriptions();
+        assertEquals(2, profiles.size());
+        profileDescription = profiles.get(0);
+        assertEquals(ProfileDescription.PROFILE_PREFIX + "Bprofile-1", profileDescription.getId());
+        assertEquals("link:" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1",
+                profileDescription.getHref());
+        assertEquals("Published", profileDescription.getDescription());
+
+        // not my profile, not my group 
+        form = createFormData(
+                RegistryTestHelper.getTestProfileContent("publishedName"),
+                "Published");
+        ClientResponse cr = getAuthenticatedResource(getResource().path(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1" + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        ClientResponse.class, form);
+        assertEquals(403, cr.getStatus());
+        profiles = baseRegistry.getProfileDescriptions();
+        assertEquals(2, profiles.size());
+
+        /// components 
+        form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("publishedName"),
+                "Published");
+        response = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1" + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertFalse(response.isPrivate());
+        assertFalse(response.isProfile());
+        assertEquals(ComponentDescription.COMPONENT_PREFIX + "component-1", response.getDescription().getId());
+
+        List<ComponentDescription> components = baseRegistry.getComponentDescriptions();
+        assertEquals(1, components.size());
+        ComponentDescription componentDescription = components.get(0);
+        assertEquals(ComponentDescription.COMPONENT_PREFIX + "component-1", componentDescription.getId());
+        assertEquals("link:" + ComponentDescription.COMPONENT_PREFIX + "component-1",
+                componentDescription.getHref());
+        assertEquals("Published", componentDescription.getDescription());
+
+        // not my profile from "my" group
+        form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("publishedName"),
+                "Published");
+        response = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1" + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        RegisterResponse.class, form);
+        assertFalse(response.isPrivate());
+        assertFalse(response.isProfile());
+        assertEquals(ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1", response.getDescription().getId());
+
+        components = baseRegistry.getComponentDescriptions();
+        assertEquals(2, components.size());
+        componentDescription = components.get(0);
+        assertEquals(ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1", componentDescription.getId());
+        assertEquals("link:" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1",
+                componentDescription.getHref());
+        assertEquals("Published", componentDescription.getDescription());
+
+        // not my profile, not my group 
+        form = createFormData(
+                RegistryTestHelper.getComponentTestContentAsStream("publishedName"),
+                "Published");
+        cr = getAuthenticatedResource(getResource().path(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1" + "/publish"))
+                .type(MediaType.MULTIPART_FORM_DATA).post(
+                        ClientResponse.class, form);
+        assertEquals(403, cr.getStatus());
+        components = baseRegistry.getComponentDescriptions();
+        assertEquals(2, components.size());
+    }
+
+    @Test
+    public void testDeleteProfileAndComponentFromGroup() throws Exception {
+
+        System.out.println("test deleteProfileAndComponentFromGroup");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component-1").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "component-1").get(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+
+        // my group, not my component 
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "Bcomponent-1").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "Bcomponent-1").get(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+
+        // not my group
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX
+                + "Ccomponent-1").delete(ClientResponse.class);
+        assertEquals(403, response.getStatus());
+
+        baseRegistry.setRegistrySpace(RegistrySpace.GROUP);
+        baseRegistry.setGroupId(1);
+        assertEquals(1, baseRegistry.getComponentDescriptions().size());
+        baseRegistry.setGroupId(2);
+        assertEquals(1, baseRegistry.getComponentDescriptions().size());
+//        baseRegistry.setGroupId(3);
+//        assertEquals(2, baseRegistry.getComponentDescriptions().size());
+
+        baseRegistry.setRegistrySpace(null);
+        baseRegistry.setGroupId(null);
+
+        // profiles
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile-1").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "profile-1").get(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+
+        // my group, not my component 
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "Bprofile-1").delete(ClientResponse.class);
+        assertEquals(200, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "Bprofile-1").get(ClientResponse.class);
+        assertEquals(404, response.getStatus());
+
+        // not my group
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX
+                + "Cprofile-1").delete(ClientResponse.class);
+        assertEquals(403, response.getStatus());
+
+        baseRegistry.setRegistrySpace(RegistrySpace.GROUP);
+        baseRegistry.setGroupId(1);
+        assertEquals(0, baseRegistry.getProfileDescriptions().size());
+        baseRegistry.setGroupId(2);
+        assertEquals(0, baseRegistry.getProfileDescriptions().size());
+    }
+
+    @Test
+    public void testDeleteCommentFromGroupComponentAndProfile() throws Exception {
+
+        System.out.println("test deleteCommentFromGroupComponent");
+
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTc1", ComponentDescription.COMPONENT_PREFIX + "component-1",
+                "JUnit@test.com");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTp1", ProfileDescription.PROFILE_PREFIX + "profile-1",
+                "JUnit@test.com");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTBc1", ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1",
+                "anotherPrincipal");
+        RegistryTestHelper.addComment(baseRegistry, "COMMENTBp1", ProfileDescription.PROFILE_PREFIX + "Bprofile-1",
+                "anotherPrincipal");
+        (new RegistryTestHelper()).addCommentBypassAuthorisation(commentsDao, "COMMENTCc1", ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1",
+                "anotherPrincipal");
+        (new RegistryTestHelper()).addCommentBypassAuthorisation(commentsDao, "COMMENTCp1", ProfileDescription.PROFILE_PREFIX + "Cprofile-1", "anotherPrincipal");
+
+        ClientResponse response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1/comments/1").delete(
+                        ClientResponse.class);
+        assertEquals(200, response.getStatus());
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "component-1/comments/1").get(
+                        ClientResponse.class);
+        assertEquals(404, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1/comments/3").delete(
+                        ClientResponse.class);
+        assertEquals(403, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/components/" + ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1/comments/5").delete(
+                        ClientResponse.class);
+        assertEquals(403, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1/comments/2").delete(
+                        ClientResponse.class);
+        assertEquals(200, response.getStatus());
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "profile-1/comments/2").get(
+                        ClientResponse.class);
+        assertEquals(404, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Bprofile-1/comments/4").delete(
+                        ClientResponse.class);
+        assertEquals(403, response.getStatus());
+
+        response = getAuthenticatedResource(
+                "/registry/profiles/" + ProfileDescription.PROFILE_PREFIX + "Cprofile-1/comments/6").delete(
+                        ClientResponse.class);
+        assertEquals(403, response.getStatus());
+
+    }
+
+    @Test
+    public void testRegisterCommentInGroup() throws Exception {
+
+        System.out.println("testRegisterCommmentInGroup");
+
+        fillUpGroupB();
+        fillUpGroupC();
+
+        FormDataMultiPart form = new FormDataMultiPart();
+        String id = ProfileDescription.PROFILE_PREFIX + "Bprofile-1";
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getCommentTestContentStringForProfile("comment1", id),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        CommentResponse response = getAuthenticatedResource(
+                "/registry/profiles/" + id + "/comments").type(
+                        MediaType.MULTIPART_FORM_DATA)
+                .post(CommentResponse.class, form);
+        assertTrue(response.isRegistered());
+        assertTrue(response.isPrivate());
+        Comment comment = response.getComment();
+        assertNotNull(comment);
+        assertEquals("comment1", comment.getComment());
+        assertEquals("Database test user", comment.getUserName());
+        Assert.notNull(comment.getCommentDate());
+        assertEquals(1, Long.parseLong(comment.getId()));
+
+        // User id should not be serialized!
+        assertEquals(0, comment.getUserId());
+
+        form = new FormDataMultiPart();
+        id = ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1";
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getCommentTestContentStringForComponent("comment2", id),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        response = getAuthenticatedResource(
+                "/registry/components/" + id + "/comments").type(
+                        MediaType.MULTIPART_FORM_DATA)
+                .post(CommentResponse.class, form);
+        assertTrue(response.isRegistered());
+        assertTrue(response.isPrivate());
+        comment = response.getComment();
+        assertNotNull(comment);
+        assertEquals("comment2", comment.getComment());
+        assertEquals("Database test user", comment.getUserName());
+        Assert.notNull(comment.getCommentDate());
+        assertEquals(2, Long.parseLong(comment.getId()));
+
+        // User id should not be serialized!
+        assertEquals(0, comment.getUserId());
+
+        // not my group
+        form = new FormDataMultiPart();
+        id = ProfileDescription.PROFILE_PREFIX + "Cprofile-1";
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getCommentTestContentStringForProfile("comment3", id),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        ClientResponse cresponse = getAuthenticatedResource(
+                "/registry/profiles/" + id + "/comments").type(
+                        MediaType.MULTIPART_FORM_DATA)
+                .post(ClientResponse.class, form);
+        assertEquals(403, cresponse.getStatus());
+
+        form = new FormDataMultiPart();
+        id = ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1";
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD,
+                RegistryTestHelper.getCommentTestContentStringForComponent("comment4", id),
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        cresponse = getAuthenticatedResource(
+                "/registry/components/" + id + "/comments").type(
+                        MediaType.MULTIPART_FORM_DATA)
+                .post(ClientResponse.class, form);
+        assertEquals(403, cresponse.getStatus());
+    }
+
+    @Test
+    public void testGetRegisteredGroupProfilecomponentRawData() throws Exception {
+
+        System.out.println("test getRegisteredComponentAndProfileRawData");
+
+        fillUpGroupB();
+        fillUpGroupC();
+
+        String id = ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1";
+        String component = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(component
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(component.endsWith("</xs:schema>"));
+
+        component = this.getAuthenticatedResource(getResource().path("/registry/components/" + id + "/xml"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(component
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<CMD_ComponentSpec"));
+        assertTrue(component.endsWith("</CMD_ComponentSpec>"));
+        assertTrue(component.contains("xsi:schemaLocation"));
+
+        id = ProfileDescription.PROFILE_PREFIX + "Bprofile-1";
+        String profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(profile.endsWith("</xs:schema>"));
+
+        profile = this.getAuthenticatedResource(getResource().path("/registry/profiles/" + id + "/xml"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<CMD_ComponentSpec"));
+        assertTrue(profile.endsWith("</CMD_ComponentSpec>"));
+        assertTrue(profile.contains("xsi:schemaLocation"));
+
+        id = ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1";
+        ClientResponse resp = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(ClientResponse.class);
+        assertEquals("XSD should always be available", 200, resp.getStatus());
+
+        id = ProfileDescription.PROFILE_PREFIX + "Cprofile-1";
+        resp = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(ClientResponse.class);
+        assertEquals("XSD should always be available", 200, resp.getStatus());
+
+    }
+
+    @Test //ok
+    public void testGetGroupComponentsUnauthenticated() throws Exception {
+        fillUpGroupA();
+
+        ClientResponse response = getResource()
+                .path("/registry/components")
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_GROUP)
+                .queryParam("groupId", "1")
+                .accept(MediaType.APPLICATION_XML)
+                .get(ClientResponse.class);
+
+        assertEquals(401, response.getStatus());
+    }
+
+    @Test //ok
+    public void testGetGroupComponentsNoMember() throws Exception {
+        fillUpGroupA();
+        fillUpGroupB();
+        fillUpGroupC();
+
+        ClientResponse response = getAuthenticatedResource(
+                getResource()
+                .path("/registry/components")
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_GROUP)
+                .queryParam(GROUPID_PARAM, "3"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(ClientResponse.class);
+        assertEquals(403, response.getStatus());
+    }
+
+    @Test //ok
+    public void testGetGroupComponentsAuthenticated() throws Exception {
+        fillUpGroupA();
+
+        List<ComponentDescription> response = getAuthenticatedResource(getResource()
+                .path("/registry/components")
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_GROUP)
+                .queryParam(GROUPID_PARAM, "1"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(COMPONENT_LIST_GENERICTYPE);
+        assertEquals(2, response.size());
+        assertEquals("component-1", response.get(0).getName());
+    }
+
+    @Test //ok
+    public void testGetGroupProfilesUnauthenticated() throws Exception {
+        fillUpGroupA();
+
+        ClientResponse response = (getResource()
+                .path("/registry/profiles")
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_GROUP)
+                .queryParam(GROUPID_PARAM, "1"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(ClientResponse.class);
+        assertEquals(401, response.getStatus());
+    }
+
+    @Test //ok
+    public void testGetGroupProfilesAuthenticated() throws Exception {
+        fillUpGroupA();
+
+        List<ProfileDescription> response = getAuthenticatedResource(getResource()
+                .path("/registry/profiles")
+                .queryParam(REGISTRY_SPACE_PARAM, REGISTRY_SPACE_GROUP)
+                .queryParam(GROUPID_PARAM, "1"))
+                .accept(MediaType.APPLICATION_XML)
+                .get(PROFILE_LIST_GENERICTYPE);
+        assertEquals(1, response.size());
+        assertEquals("profile-1", response.get(0).getName());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/SanboxTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/SanboxTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/SanboxTest.java	(revision 5961)
@@ -0,0 +1,289 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package clarin.cmdi.componentregistry.rest;
+
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.RegistrySpace;
+import clarin.cmdi.componentregistry.components.CMDComponentSpec;
+import clarin.cmdi.componentregistry.impl.database.ComponentRegistryTestDatabase;
+import clarin.cmdi.componentregistry.impl.database.GroupService;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.model.CommentResponse;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.Ownership;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+import clarin.cmdi.componentregistry.model.RegisterResponse;
+import clarin.cmdi.componentregistry.model.RegistryUser;
+import clarin.cmdi.componentregistry.persistence.jpa.CommentsDao;
+import clarin.cmdi.componentregistry.persistence.jpa.UserDao;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.multipart.FormDataMultiPart;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+import javax.ws.rs.core.MediaType;
+import javax.xml.bind.JAXBException;
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.springframework.util.Assert;
+
+/**
+ *
+ * @author olhsha
+ */
+public class SanboxTest extends ComponentRegistryRestServiceTestCase {
+    
+    @Autowired
+    private ComponentRegistryFactory componentRegistryFactory;
+    
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+    @Autowired 
+    private GroupService groupService;
+    @Autowired 
+    private UserDao userDao;
+     @Autowired 
+    private CommentsDao commentsDao;
+    private ComponentRegistry baseRegistry;
+
+    @Before
+    public void init() {
+        ComponentRegistryTestDatabase.resetAndCreateAllTables(jdbcTemplate);
+        createUserRecord();
+        baseRegistry = componentRegistryFactory.getBaseRegistry(DummyPrincipal.DUMMY_CREDENTIALS);
+    }
+
+   
+    private ComponentDescription component1;
+    private ComponentDescription component2;
+    private ProfileDescription profile1;
+    private ProfileDescription profile2;
+    private ComponentDescription component3;
+    private ProfileDescription profile3;
+    private Comment profile1Comment1;
+    private Comment profile1Comment2;
+    private Comment component1Comment3;
+    private Comment component1Comment4;
+    private Comment profile3Comment5;
+    private Comment component3Comment7;
+
+    private void fillUpPublicItems() throws Exception {
+
+        profile1 = RegistryTestHelper.addProfile(baseRegistry, "profile2", true);
+        profile2 = RegistryTestHelper.addProfile(baseRegistry, "profile1", true);
+        component1 = RegistryTestHelper.addComponent(baseRegistry,
+                "component2", true);
+        component2 = RegistryTestHelper.addComponent(baseRegistry,
+                "component1", true);
+        profile1Comment2 = RegistryTestHelper.addComment(baseRegistry, "comment2",
+                ProfileDescription.PROFILE_PREFIX + "profile1",
+                "JUnit@test.com");
+        profile1Comment1 = RegistryTestHelper.addComment(baseRegistry, "comment1",
+                ProfileDescription.PROFILE_PREFIX + "profile1",
+                "JUnit@test.com");
+        component1Comment3 = RegistryTestHelper.addComment(baseRegistry, "comment3",
+                ComponentDescription.COMPONENT_PREFIX + "component1",
+                "JUnit@test.com");
+        component1Comment4 = RegistryTestHelper.addComment(baseRegistry, "comment4",
+                ComponentDescription.COMPONENT_PREFIX + "component1",
+                "JUnit@test.com");
+    }
+
+    private void fillUpPrivateItems() throws Exception {
+        profile3 = RegistryTestHelper.addProfile(baseRegistry, "profile3", false);
+        component3 = RegistryTestHelper.addComponent(baseRegistry,
+                "component3", false);
+        profile3Comment5 = RegistryTestHelper.addComment(baseRegistry, "comment5",
+                ProfileDescription.PROFILE_PREFIX + "profile3",
+                "JUnit@test.com");
+        component3Comment7 = RegistryTestHelper.addComment(baseRegistry, "comment7",
+                ComponentDescription.COMPONENT_PREFIX + "component3",
+                "JUnit@test.com");
+    }
+    
+     protected void createAntherUserRecord() {
+	RegistryUser user = new RegistryUser();
+	user.setName("Another database test user");
+	user.setPrincipalName("anotherPrincipal");
+	userDao.save(user);
+    }
+     
+    private void MakeGroupA(){
+        groupService.createNewGroup("group A", DummyPrincipal.DUMMY_PRINCIPAL.getName());
+    }
+    
+     private void fillUpGroupA() throws ParseException, JAXBException, ItemNotFoundException{
+         
+        MakeGroupA();
+        
+        RegistryTestHelper.addProfile(baseRegistry, "profile-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "component-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "component-2", false);
+        
+        Ownership ownership = new Ownership();
+        ownership.setComponentId(ProfileDescription.PROFILE_PREFIX+"profile-1");
+        ownership.setGroupId(1);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX+"component-1");
+        ownership.setGroupId(1);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX+"component-2");
+        ownership.setGroupId(1);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+    }
+     
+     
+    
+    private void MakeGroupB() throws ItemNotFoundException{
+        createAntherUserRecord();
+        groupService.createNewGroup("group B", "anotherPrincipal");
+        groupService.makeMember(DummyPrincipal.DUMMY_PRINCIPAL.getName(), "group B");
+    }
+    
+     private void MakeGroupC() throws ItemNotFoundException{
+        groupService.createNewGroup("group C", "anotherPrincipal");
+    }
+    
+     private void fillUpGroupB() throws ParseException, JAXBException, ItemNotFoundException{
+         
+        MakeGroupB();
+        
+        RegistryTestHelper.addProfile(baseRegistry, "Bprofile-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "Bcomponent-1", false);
+        RegistryTestHelper.addComponent(baseRegistry, "Bcomponent-2", false);
+        
+        Ownership ownership = new Ownership();
+        ownership.setComponentId(ProfileDescription.PROFILE_PREFIX+"Bprofile-1");
+        ownership.setGroupId(2);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX+"Bcomponent-1");
+        ownership.setGroupId(2);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX+"Bcomponent-2");
+        ownership.setGroupId(2);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+    }
+     
+     private void fillUpGroupC() throws ParseException, JAXBException, ItemNotFoundException{
+         
+        MakeGroupC();
+        
+        RegistryTestHelper.addProfileAnotherPrincipal(baseRegistry, "Cprofile-1", false);
+        RegistryTestHelper.addComponentAnotherPrincipal(baseRegistry, "Ccomponent-1", false);
+        RegistryTestHelper.addComponentAnotherPrincipal(baseRegistry, "Ccomponent-2", false);
+        
+        Ownership ownership = new Ownership();
+        ownership.setComponentId(ProfileDescription.PROFILE_PREFIX+"Cprofile-1");
+        ownership.setGroupId(3);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX+"Ccomponent-1");
+        ownership.setGroupId(3);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+        ownership.setComponentId(ComponentDescription.COMPONENT_PREFIX+"Ccomponent-2");
+        ownership.setGroupId(3);
+        ownership.setUserId(0);
+        groupService.addOwnership(ownership);
+        
+    }
+    
+ 
+    
+     private FormDataMultiPart createFormData(Object content) {
+        return createFormData(content, "My Test");
+    }
+
+    private FormDataMultiPart createFormData(Object content, String description) {
+        FormDataMultiPart form = new FormDataMultiPart();
+        form.field(IComponentRegistryRestService.DATA_FORM_FIELD, content,
+                MediaType.APPLICATION_OCTET_STREAM_TYPE);
+        form.field(IComponentRegistryRestService.NAME_FORM_FIELD, "Test1");
+        form.field(IComponentRegistryRestService.DESCRIPTION_FORM_FIELD,
+                description);
+        form.field(IComponentRegistryRestService.DOMAIN_FORM_FIELD, "My domain");
+        form.field(IComponentRegistryRestService.GROUP_FORM_FIELD, "TestGroup");
+        return form;
+    }
+    
+  
+    
+   
+    
+    @Test
+    public void testGetRegisteredGroupProfilecomponentRawData() throws Exception {
+
+        System.out.println("test getRegisteredComponentAndProfileRawData");
+
+        fillUpGroupB();        
+        fillUpGroupC();
+
+        String id = ComponentDescription.COMPONENT_PREFIX + "Bcomponent-1";
+        String component = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(component
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(component.endsWith("</xs:schema>"));
+
+        component = this.getAuthenticatedResource(getResource().path("/registry/components/" + id + "/xml"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(component
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<CMD_ComponentSpec"));
+        assertTrue(component.endsWith("</CMD_ComponentSpec>"));
+        assertTrue(component.contains("xsi:schemaLocation"));
+        
+        id = ProfileDescription.PROFILE_PREFIX + "Bprofile-1";
+        String profile = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xs:schema"));
+        assertTrue(profile.endsWith("</xs:schema>"));
+
+        profile = this.getAuthenticatedResource(getResource().path("/registry/profiles/" + id + "/xml"))
+                .accept(MediaType.TEXT_XML).get(String.class).trim();
+        assertTrue(profile
+                .startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<CMD_ComponentSpec"));
+        assertTrue(profile.endsWith("</CMD_ComponentSpec>"));
+        assertTrue(profile.contains("xsi:schemaLocation"));
+
+        id = ComponentDescription.COMPONENT_PREFIX + "Ccomponent-1";
+        ClientResponse resp = this.getAuthenticatedResource(getResource()
+                .path("/registry/components/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get( ClientResponse.class);
+        assertEquals("XSD should always be available", 200, resp.getStatus());
+        
+        id = ProfileDescription.PROFILE_PREFIX + "Cprofile-1";
+       resp = this.getAuthenticatedResource(getResource()
+                .path("/registry/profiles/" + id + "/xsd"))
+                .accept(MediaType.TEXT_XML).get( ClientResponse.class);
+        assertEquals("XSD should always be available", 200, resp.getStatus());
+        
+        
+    }
+
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/SingletonTestContainerFactory.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/SingletonTestContainerFactory.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rest/SingletonTestContainerFactory.java	(revision 5961)
@@ -0,0 +1,51 @@
+package clarin.cmdi.componentregistry.rest;
+
+import java.net.URI;
+
+import com.sun.jersey.test.framework.AppDescriptor;
+import com.sun.jersey.test.framework.JerseyTest;
+import com.sun.jersey.test.framework.spi.container.TestContainer;
+import com.sun.jersey.test.framework.spi.container.TestContainerFactory;
+
+/**
+ * Factory for {@link JerseyTest}s that returns reusable servlet container testing contexts thus reducing startup time
+ * @author george.georgovassilis@mpi.nl
+ *
+ */
+public class SingletonTestContainerFactory implements TestContainerFactory {
+	
+	private TestContainerFactory targetFactory;
+	private TestContainer testContainer;
+	private boolean testContainerStarted = false;
+	
+	public void startTestContainer() {
+		testContainer.start();
+		testContainerStarted = true;
+	}
+	
+	public void stopTestContainer() {
+		testContainer.stop();
+		testContainerStarted = false;
+	}
+	
+	public boolean isTestContainerRunning() {
+		return testContainerStarted;
+	}
+	
+	public SingletonTestContainerFactory(TestContainerFactory factory) {
+		this.targetFactory = factory;
+	}
+	
+	@Override
+	public <T extends AppDescriptor> Class<T> supports() {
+		return targetFactory.supports();
+	}
+
+	@Override
+	public TestContainer create(URI baseUri, AppDescriptor ad)
+			throws IllegalArgumentException {
+		if (testContainer == null)
+			testContainer = targetFactory.create(baseUri, ad);
+		return testContainer;
+	}
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/PrintXmlFromRssRunner.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/PrintXmlFromRssRunner.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/PrintXmlFromRssRunner.java	(revision 5961)
@@ -0,0 +1,146 @@
+package clarin.cmdi.componentregistry.rss;
+
+import clarin.cmdi.componentregistry.AuthenticationRequiredException;
+import clarin.cmdi.componentregistry.ComponentRegistry;
+import clarin.cmdi.componentregistry.ComponentRegistryException;
+import clarin.cmdi.componentregistry.ComponentRegistryFactory;
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.ItemNotFoundException;
+import clarin.cmdi.componentregistry.MDMarshaller;
+import clarin.cmdi.componentregistry.UserUnauthorizedException;
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.Comment;
+import clarin.cmdi.componentregistry.rest.RegistryTestHelper;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.text.ParseException;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import javax.xml.bind.JAXBException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ *
+ * non-automatised developer's test class Main method generates an Rss xml-file
+ * to validate it later using one of the on-line rss-source validators
+ */
+public class PrintXmlFromRssRunner {
+
+    private static MDMarshaller marshaller;
+
+    @Autowired
+    public void setMarshaller(MDMarshaller marshaller) {
+	this.marshaller = marshaller;
+    }
+
+    public static <T extends BaseDescription> void printIds(List<T> desc) {
+	for (T current : desc) {
+	    String currentId = current.getId();
+	    System.out.println(currentId);
+	}
+    }
+
+    private static void printXmlRssToFile(Rss rssObject) throws IOException, JAXBException {
+
+	String path = RegistryTestHelper.openTestDir("testRss");
+	String os = marshaller.marshalToString(rssObject);
+	RegistryTestHelper.writeStringToFile(os, path + "testRssResl.xml");
+
+    }
+
+    private static Rss makeRssForDescriptions(List<? extends BaseDescription> descriptions, int kind, String baseUri, int limit) throws ParseException {
+	System.out.println(descriptions.size());
+	Collections.sort(descriptions, BaseDescription.COMPARE_ON_DATE);
+	System.out.println(descriptions.size());
+
+	System.out.println("check if the descriptions are sorted in a proper way, by the dates ");
+	for (BaseDescription desc : descriptions) {
+	    Date date = desc.getRegistrationDate();
+	    System.out.println(date + ", formatted: " + date
+		    + ", Rss=formatted: " + DatesHelper.getRFCDateTime(date));
+	}
+
+	RssCreatorDescriptions instance = new RssCreatorDescriptions(baseUri, (kind == 1) ? "profiles" : "components", limit, descriptions, ComponentUtils.COMPARE_ON_DATE, "Public descriptions");
+	Rss result = instance.getRss();
+
+	return result;
+
+    }
+
+    private static Rss makeRssForComments(List<Comment> comments, int kind, String baseUri, int limit, String profileId, String profileName) throws ParseException {
+	System.out.println(comments.size());
+	Collections.sort(comments, Comment.COMPARE_ON_DATE);
+	System.out.println(comments.size());
+
+	System.out.println("check if the comments are sorted in a proper way, by the dates ");
+	for (Comment commentje : comments) {
+	    System.out.println(commentje.getCommentDate());
+	}
+
+	RssCreatorComments instance = new RssCreatorComments(baseUri, limit, profileId, profileName, (kind == 3) ? "profile" : "component", comments, Comment.COMPARE_ON_DATE, "Comments for profile "+profileId);
+	Rss result = instance.getRss();
+	return result;
+    }
+
+    /*
+     * input: sort of rss -- profiles, or comopnents, or comments (see below the prompt string)
+     */
+    public static void main(String args[]) throws ComponentRegistryException, ParseException, IOException, JAXBException, UserUnauthorizedException, ItemNotFoundException, AuthenticationRequiredException {
+
+	System.out.println("Type 1 or 2, or 3, or 4, \n "
+		+ "to check Rss generaion for profiles, components  or comments for a profile or a component respectively: >> ");
+
+	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+	String buffer = null;
+
+	//  read the username from the command-line; need to use try/catch with the
+	//  readLine() method
+	try {
+	    buffer = br.readLine();
+	} catch (IOException ioe) {
+	    System.out.println("IO error trying get the number");
+	    System.exit(1);
+	}
+
+	int kind = Integer.parseInt(buffer);
+
+	ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContextJDBC.xml");
+	ComponentRegistry registry = ((ComponentRegistryFactory) applicationContext.getBean("componentRegistryFactory")).getPublicRegistry();
+
+	Rss rss = null;
+	String baseUri = "http://localhost:8080/ComponentRegistry"; /* used only as a nice URi-example content for the "link"-field
+	 in this test we do not click on link, we just generate an Rss xml-file to validate it
+	 using one of the on-line rss-source vaidators */
+
+	if (kind == 1 || kind == 2) { // testing Rss for profiles/components
+	    List<? extends BaseDescription> descriptions =
+		    (kind == 1) ? registry.getProfileDescriptions() : registry.getComponentDescriptions();
+	    rss = makeRssForDescriptions(descriptions, kind, baseUri, 10);
+	};
+
+	if (kind == 3 || kind == 4) { // testing Rss comments
+	    List<? extends BaseDescription> descriptions =
+		    (kind == 3) ? registry.getProfileDescriptions() : registry.getComponentDescriptions();
+	    printIds(descriptions);
+	    System.out.println("Pick up and input one of the description id above");// "clarin.eu:cr1:p_1284723009187" "clarin.eu:cr1:c_1288172614011"
+	    try {
+		buffer = br.readLine();
+	    } catch (IOException ioe) {
+		System.out.println("IO error trying to get the id");
+		System.exit(1);
+	    }
+	    final List<Comment> comments = (kind == 3) ? registry.getCommentsInProfile(buffer) : registry.getCommentsInComponent(buffer);
+	    final String name = (kind == 3) ? registry.getProfileDescriptionAccessControlled(buffer).getName() : registry.getComponentDescriptionAccessControlled(buffer).getName();
+	    rss = makeRssForComments(comments, kind, baseUri, 10, buffer, name);
+
+	}
+	printXmlRssToFile(rss);
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/RssCreatorCommentsTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/RssCreatorCommentsTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/RssCreatorCommentsTest.java	(revision 5961)
@@ -0,0 +1,89 @@
+package clarin.cmdi.componentregistry.rss;
+
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.model.Comment;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+import org.apache.commons.lang.time.DateUtils;
+import org.junit.Test;
+
+/**
+ *
+ * @author olhsha
+ */
+public class RssCreatorCommentsTest {
+
+    private Comment makeTestComment(boolean canDelete, boolean isFromProfile, String comtext, Date date, String commentId,
+            String descrId, String userName) {
+        Comment comm = new Comment();
+
+        comm.setCanDelete(canDelete);
+        comm.setComment(comtext);
+        comm.setCommentDate(date);
+        comm.setComponentId(descrId);
+        comm.setId(commentId);
+        comm.setUserName(userName);
+
+        return comm;
+    }
+
+    /**
+     *
+     */
+    private void compareInputsVsRssItems(String href, String commtext, String date, String title, RssItem rssItem) {
+        assertEquals(href, rssItem.getGuid().getValue());
+        assertEquals(href, rssItem.getLink());
+        assertEquals(commtext, rssItem.getDescription());
+        assertEquals(date, rssItem.getPubDate());
+        assertEquals(title, rssItem.getTitle());
+
+    }
+    
+    private Date date(String d) {
+	return DatesHelper.parseIso(d);
+    }
+
+    @Test
+    public void testMakeRss() throws ParseException {
+        String testPrfId = "p_1234";
+        String baseUri = "http://catalog.clarin.eu/ds/ComponentRegistry";
+        boolean isFromProfile = true;
+
+        Comment comm1 = makeTestComment(true, isFromProfile, "this is comment # 1", date("2012-04-02T11:38:23+00:00"), "commentId1", testPrfId,
+                "userello");
+        Comment comm2 = makeTestComment(false, isFromProfile, "this is comment # 2", date("2011-04-02T11:38:22+00:00"), "commentId2", testPrfId,
+                "userino");
+        Comment comm3 = makeTestComment(true, isFromProfile, "this is comment # 3", date("2010-05-02T11:38:22+00:00"), "commentId3", testPrfId,
+                "userito");
+        List<Comment> comms = new ArrayList<Comment>(Arrays.asList(comm1, comm2, comm3));
+
+        RssCreatorComments instance = new RssCreatorComments(baseUri, 3, testPrfId, "Test Profile", "profile", comms, Comment.COMPARE_ON_DATE, "Comments for a private profile");
+        Rss result = instance.getRss();
+
+        String rfcdate1 = DatesHelper.getRFCDateTime(DatesHelper.parseIso("2012-04-02T11:38:23+00:00"));
+        String rfcdate2 = DatesHelper.getRFCDateTime(DatesHelper.parseIso("2011-04-02T11:38:22+00:00"));
+        String rfcdate3 = DatesHelper.getRFCDateTime(DatesHelper.parseIso("2010-05-02T11:38:22+00:00"));
+
+        List<RssItem> resitems = result.getChannel().getItem();
+        String channelLink = baseUri + "?item=" + testPrfId + "&browserview=comments";
+        compareInputsVsRssItems(channelLink + "&commentId=commentId1", "this is comment # 1", rfcdate1,
+                "Comment commentId1\nby userello", resitems.get(0));
+        compareInputsVsRssItems(channelLink + "&commentId=commentId2", "this is comment # 2", rfcdate2,
+                "Comment commentId2\nby userino", resitems.get(1));
+        compareInputsVsRssItems(channelLink + "&commentId=commentId3", "this is comment # 3", rfcdate3,
+                "Comment commentId3\nby userito", resitems.get(2));
+
+        assertEquals("2.0", Double.toString(result.getVersion()));
+        assertEquals("Comments for a private profile", result.getChannel().getTitle());
+        assertEquals(channelLink, result.getChannel().getLink());
+        assertEquals("Comments feed for the profile \"Test Profile\"", result.getChannel().getDescription());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/RssCreatorDescriptionsTest.java
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/RssCreatorDescriptionsTest.java	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/java/clarin/cmdi/componentregistry/rss/RssCreatorDescriptionsTest.java	(revision 5961)
@@ -0,0 +1,111 @@
+package clarin.cmdi.componentregistry.rss;
+
+import clarin.cmdi.componentregistry.DatesHelper;
+import clarin.cmdi.componentregistry.impl.ComponentUtils;
+import clarin.cmdi.componentregistry.model.BaseDescription;
+import clarin.cmdi.componentregistry.model.ComponentDescription;
+import clarin.cmdi.componentregistry.model.ProfileDescription;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import javax.xml.bind.JAXBException;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ *
+ * @author olhsha
+ */
+public class RssCreatorDescriptionsTest {
+
+    private void createTestDescription(BaseDescription desc, String creatorname,
+            String description, String groupname,
+            String name, Date date, String id) {
+
+        desc.setId(id);
+        desc.setName(name);
+        desc.setCreatorName(creatorname);
+        desc.setDescription(description);
+        desc.setGroupName(groupname);
+        desc.setRegistrationDate(date);
+
+    }
+
+    private ProfileDescription createTestProfileDescription(String creatorname,
+            String description, String groupname,
+            String name, boolean editorFlag, Date date, String id) {
+
+        ProfileDescription pdesc = ProfileDescription.createNewDescription();
+        createTestDescription(pdesc, creatorname, description, groupname, name, date, id);
+        pdesc.setShowInEditor(editorFlag);
+        return pdesc;
+    }
+
+    private ComponentDescription createTestComponentDescription(String creatorname,
+            String description, String groupname,
+            String name, Date date, String id) {
+
+        ComponentDescription cdesc = ComponentDescription.createNewDescription();
+        createTestDescription(cdesc, creatorname, description, groupname, name, date, id);
+        return cdesc;
+    }
+
+    private void compareRssVsValues(String description, String itemLink, Date date, String title, RssItem item) {
+
+        assertEquals(description, item.getDescription());
+        assertEquals(itemLink, item.getGuid().getValue());
+        assertEquals(itemLink, item.getLink());
+        assertEquals(DatesHelper.getRFCDateTime(date), item.getPubDate());
+        assertEquals(title, item.getTitle());
+    }
+    
+    private Date date(String ymd) {
+	String[] parts = ymd.split("-");
+	return new Date(Integer.parseInt(parts[0])-1900,Integer.parseInt(parts[1])-1,Integer.parseInt(parts[2]));
+    }
+
+    /**
+     * Creates 3 profile descriptions, makes them into a list, and makes a
+     * 3-item Rss out of this list Checks if the values of the fields in each
+     * item are as expected
+     */
+    @Test
+    public void testMakeRss() throws JAXBException, UnsupportedEncodingException, IOException, ParseException {
+        String baseURI = "http://catalog.clarin.eu/ds/ComponentRegistry";
+        String channelLink = baseURI + "/";
+
+        ProfileDescription desc1 = createTestProfileDescription("Useratti",
+                "description-1", "groupname-1", "name-1", true, date("2001-01-01"), ProfileDescription.PROFILE_PREFIX+"p_1");
+        ProfileDescription desc2 = createTestProfileDescription("Usereno",
+                "description-2", "groupname-2", "name-2", false, date("2001-01-02"), ProfileDescription.PROFILE_PREFIX+"p_2");
+        ProfileDescription desc3 = createTestProfileDescription("Userio",
+                "description-3", "groupname-3", "name-3", true, date("2001-01-03"), ProfileDescription.PROFILE_PREFIX+"p_3");
+
+        List<ProfileDescription> descriptions = Arrays.asList(desc1, desc2, desc3);
+
+        RssCreatorDescriptions instance = new RssCreatorDescriptions(baseURI, "profiles", 3, descriptions, BaseDescription.COMPARE_ON_DATE, "Public profiles");
+        Rss result = instance.getRss();
+
+        List<RssItem> items = result.getChannel().getItem();
+        assertEquals(3, result.getChannel().getItem().size());
+        // the youngest must be on the top (at "0"), the oldest must be on the bottom (at "3")
+        compareRssVsValues("description-1", baseURI + "?item=clarin.eu:cr1:p_p_1", date("2001-01-01"),
+                instance.makeDescriptionTitle("name-1", "Useratti", "groupname-1"), items.get(2));
+        compareRssVsValues("description-2", baseURI + "?item=clarin.eu:cr1:p_p_2", date("2001-01-02"),
+                instance.makeDescriptionTitle("name-2", "Usereno", "groupname-2"), items.get(1));
+        compareRssVsValues("description-3", baseURI + "?item=clarin.eu:cr1:p_p_3", date("2001-01-03"),
+                instance.makeDescriptionTitle("name-3", "Userio", "groupname-3"), items.get(0));
+
+        assertEquals("2.0", Double.toString(result.getVersion()));
+        assertEquals("News feed for the profiles", result.getChannel().getDescription());
+        assertEquals(channelLink, result.getChannel().getLink());
+        assertEquals("Public profiles", result.getChannel().getTitle());
+    }
+}
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/CatalogManager.properties
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/CatalogManager.properties	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/CatalogManager.properties	(revision 5961)
@@ -0,0 +1,5 @@
+catalogs=catalog.cat
+relative-catalogs=false
+static-catalog=yes
+catalog-class-name=org.apache.xml.resolver.Resolver
+verbosity=10
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/catalog.cat
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/catalog.cat	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/catalog.cat	(revision 5961)
@@ -0,0 +1,4 @@
+REWRITE_SYSTEM "http://www.w3.org/2005/08/" "."
+REWRITE_URI "https://infra.clarin.eu/cmd/" "./clarin_catalog/"
+REWRITE_URI "http://infra.clarin.eu/cmd/" "./clarin_catalog/"
+URI "http://lux16.mpi.nl/general-component-schema.xsd" "./clarin_catalog/general-component-schema.xsd"
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/log4j.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/log4j.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/log4j.xml	(revision 5961)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+    <appender class="org.apache.log4j.ConsoleAppender" name="Stdout">
+        <layout class="org.apache.log4j.PatternLayout">
+            <param value="%d %p [%c{1}#%C:%L] - %m%n" name="conversionPattern"/>
+        </layout>
+    </appender>
+    <logger name="clarin.cmdi.componentregistry">
+        <level value="info"/>
+    </logger>
+    <logger name="clarin.cmdi.componentregistry.Configuration">
+        <level value="warn"/>
+    </logger>
+    <logger name="org.springframework.transaction">
+        <level value="warn"/>
+    </logger>
+    <logger name="org.springframework.orm.jpa">
+        <level value="warn"/>
+    </logger>
+    <root>
+        <level value="warn"/>
+        <appender-ref ref="Stdout"/>
+    </root>
+</log4j:configuration>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/spring-config/component-registry.properties
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/spring-config/component-registry.properties	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/spring-config/component-registry.properties	(revision 5961)
@@ -0,0 +1,6 @@
+eu.clarin.cmdi.componentregistry.adminUsers=JUnit.Admin@test.com
+eu.clarin.cmdi.componentregistry.generalComponentSchemaUrl=https://infra.clarin.eu/cmd/general-component-schema.xsd
+eu.clarin.cmdi.componentregistry.component2SchemaXslUrl=https://infra.clarin.eu/cmd/xslt/comp2schema-v2/comp2schema.xsl
+eu.clarin.cmdi.componentregistry.componentSpecSchemaLocation=http://www.clarin.eu/cmd http://lux16.mpi.nl/general-component-schema.xsd
+eu.clarin.cmdi.componentregistry.ccrRestUrl=https://openskos.meertens.knaw.nl/ccr/api/
+eu.clarin.cmdi.componentregistry.jpaDialect=org.hibernate.dialect.HSQLDialect
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/spring-config/test-applicationContext-fragment.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/spring-config/test-applicationContext-fragment.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/spring-config/test-applicationContext-fragment.xml	(revision 5961)
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
+	xsi:schemaLocation="
+     http://www.springframework.org/schema/beans
+     http://www.springframework.org/schema/beans/spring-beans.xsd
+     http://www.springframework.org/schema/aop
+     http://www.springframework.org/schema/aop/spring-aop.xsd
+     http://www.springframework.org/schema/context
+     http://www.springframework.org/schema/context/spring-context.xsd
+     http://www.springframework.org/schema/jdbc
+     http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
+     ">
+
+	<!-- Without the transaction proxy, JdbcTemplate will close the active connection 
+		after each statement -->
+	<bean id="dataSource"
+		class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
+		<property name="targetDataSource" ref="applicationServerDataSource"/>
+	</bean>
+
+
+	<bean id="applicationServerDataSource" class="org.apache.commons.dbcp.BasicDataSource">
+		<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
+		<property name="url"
+			value="jdbc:hsqldb:mem:component_registry;sql.syntax_pgs=true" />
+		<property name="username" value="sa" />
+		<property name="password" value="" />
+		<property name="defaultAutoCommit" value="true" />
+		<property name="initialSize" value="400"/>
+	</bean>
+
+
+	<bean id="RegistryTestHelper" class="clarin.cmdi.componentregistry.rest.RegistryTestHelper"/>
+	<bean id="PrintXmlFromRssRunner" class="clarin.cmdi.componentregistry.rss.PrintXmlFromRssRunner"/>
+</beans>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/xml.xsd
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/xml.xsd	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/xml.xsd	(revision 5961)
@@ -0,0 +1,146 @@
+<?xml version='1.0'?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   See http://www.w3.org/XML/1998/namespace.html and
+   http://www.w3.org/TR/REC-xml for information about this namespace.
+
+    This schema document describes the XML namespace, in a form
+    suitable for import by other schema documents.  
+
+    Note that local names in this namespace are intended to be defined
+    only by the World Wide Web Consortium or its subgroups.  The
+    following names are currently defined in this namespace and should
+    not be used with conflicting semantics by any Working Group,
+    specification, or document instance:
+
+    base (as an attribute name): denotes an attribute whose value
+         provides a URI to be used as the base for interpreting any
+         relative URIs in the scope of the element on which it
+         appears; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML Base specification.
+
+    id   (as an attribute name): denotes an attribute whose value
+         should be interpreted as if declared to be of type ID.
+         The xml:id specification is not yet a W3C Recommendation,
+         but this attribute is included here to facilitate experimentation
+         with the mechanisms it proposes.  Note that it is _not_ included
+         in the specialAttrs attribute group.
+
+    lang (as an attribute name): denotes an attribute whose value
+         is a language code for the natural language of the content of
+         any element; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML specification.
+  
+    space (as an attribute name): denotes an attribute whose
+         value is a keyword indicating what whitespace processing
+         discipline is intended for the content of the element; its
+         value is inherited.  This name is reserved by virtue of its
+         definition in the XML specification.
+
+    Father (in any context at all): denotes Jon Bosak, the chair of 
+         the original XML Working Group.  This name is reserved by 
+         the following decision of the W3C XML Plenary and 
+         XML Coordination groups:
+
+             In appreciation for his vision, leadership and dedication
+             the W3C XML Plenary on this 10th day of February, 2000
+             reserves for Jon Bosak in perpetuity the XML name
+             xml:Father
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>This schema defines attributes and an attribute group
+        suitable for use by
+        schemas wishing to allow xml:base, xml:lang, xml:space or xml:id
+        attributes on elements they define.
+
+        To enable this, such a schema must import this schema
+        for the XML namespace, e.g. as follows:
+        &lt;schema . . .>
+         . . .
+         &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                    schemaLocation="http://www.w3.org/2005/08/xml.xsd"/>
+
+        Subsequently, qualified reference to any of the attributes
+        or the group defined below will have the desired effect, e.g.
+
+        &lt;type . . .>
+         . . .
+         &lt;attributeGroup ref="xml:specialAttrs"/>
+ 
+         will define a type which will schema-validate an instance
+         element with any of those attributes</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>In keeping with the XML Schema WG's standard versioning
+   policy, this schema document will persist at
+   http://www.w3.org/2005/08/xml.xsd.
+   At the date of issue it can also be found at
+   http://www.w3.org/2001/xml.xsd.
+   The schema document at that URI may however change in the future,
+   in order to remain compatible with the latest version of XML Schema
+   itself, or with the XML namespace itself.  In other words, if the XML
+   Schema or XML namespaces change, the version of this document at
+   http://www.w3.org/2001/xml.xsd will change
+   accordingly; the version at
+   http://www.w3.org/2005/08/xml.xsd will not change.
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>Attempting to install the relevant ISO 2- and 3-letter
+         codes as the enumerated possible values is probably never
+         going to be a realistic possibility.  See
+         RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry
+         at http://www.iana.org/assignments/lang-tag-apps.htm for
+         further information.
+
+         The union allows for the 'un-declaration' of xml:lang with
+         the empty string.</xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>    
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xmlbase/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+ 
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xml-id/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+ </xs:attributeGroup>
+
+</xs:schema>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/xml/largeProfile.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/xml/largeProfile.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/ComponentRegistry/src/test/resources/xml/largeProfile.xml	(revision 5961)
@@ -0,0 +1,7792 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<CMD_ComponentSpec isProfile="false" xsi:schemaLocation="http://www.clarin.eu/cmd http://www.clarin.eu/cmd/general-component-schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <Header>
+        <ID>clarin.eu:cr1:c_1331113992522</ID>
+        <Name>SL-ActorResearcher</Name>
+        <Description>Source: IMDI metadata</Description>
+    </Header>
+    <CMD_Component CardinalityMax="unbounded" CardinalityMin="0" name="SL-ActorResearcher">
+        <CMD_Element DisplayPriority="2" CardinalityMax="1" CardinalityMin="1" ConceptLink="http://www.isocat.org/datcat/DC-2559" name="Role">
+            <ValueScheme>
+                <enumeration>
+                    <item AppInfo="" ConceptLink="">Researcher</item>
+                    <item AppInfo="" ConceptLink="">Recorder</item>
+                    <item AppInfo="" ConceptLink="">Annotator</item>
+                </enumeration>
+            </ValueScheme>
+        </CMD_Element>
+        <CMD_Element Multilingual="false" DisplayPriority="1" CardinalityMax="1" CardinalityMin="1" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2556" name="FullName"/>
+        <CMD_Element CardinalityMax="1" CardinalityMin="1" ConceptLink="http://www.isocat.org/datcat/DC-2560" name="Sex">
+            <ValueScheme>
+                <enumeration>
+                    <item AppInfo="" ConceptLink="">Male</item>
+                    <item AppInfo="" ConceptLink="">Female</item>
+                    <item AppInfo="" ConceptLink="">NAP</item>
+                    <item AppInfo="" ConceptLink="">Unspecified</item>
+                    <item AppInfo="" ConceptLink="">Unknown</item>
+                </enumeration>
+            </ValueScheme>
+        </CMD_Element>
+        <CMD_Element Multilingual="false" CardinalityMax="1" CardinalityMin="1" ValueScheme="string" name="Deafness"/>
+        <CMD_Component CardinalityMax="1" CardinalityMin="0" ComponentId="clarin.eu:cr1:c_1271859438180" name="Contact">
+            <CMD_Element CardinalityMax="1" CardinalityMin="0" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2454" name="Name"/>
+            <CMD_Element CardinalityMax="1" CardinalityMin="0" ValueScheme="string" name="Address"/>
+            <CMD_Element CardinalityMax="1" CardinalityMin="0" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2521" name="Email"/>
+            <CMD_Element CardinalityMax="1" CardinalityMin="0" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2459" name="Organisation"/>
+        </CMD_Component>
+        <CMD_Component CardinalityMax="1" CardinalityMin="1" ComponentId="clarin.eu:cr1:c_1271859438177" name="descriptions">
+            <CMD_Element CardinalityMax="unbounded" CardinalityMin="0" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2520" name="Description">
+                <AttributeList>
+                    <Attribute>
+                        <Name>LanguageId</Name>
+                        <Type>string</Type>
+                    </Attribute>
+                </AttributeList>
+            </CMD_Element>
+        </CMD_Component>
+        <CMD_Component CardinalityMax="1" CardinalityMin="1" ComponentId="clarin.eu:cr1:c_1271859438153" name="ActorLanguages">
+            <CMD_Component CardinalityMax="1" CardinalityMin="0" ConceptLink="http://www.isocat.org/datcat/DC-2520" ComponentId="clarin.eu:cr1:c_1271859438118" name="Description">
+                <CMD_Element Multilingual="true" CardinalityMax="1" CardinalityMin="1" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2520" name="Description">
+                    <AttributeList>
+                        <Attribute>
+                            <Name>LanguageID</Name>
+                            <Type>string</Type>
+                        </Attribute>
+                    </AttributeList>
+                </CMD_Element>
+            </CMD_Component>
+            <CMD_Component CardinalityMax="unbounded" CardinalityMin="1" ComponentId="clarin.eu:cr1:c_1271859438147" name="ActorLanguage">
+                <CMD_Element CardinalityMax="1" CardinalityMin="0" ConceptLink="http://www.isocat.org/datcat/DC-2955" name="HomeLanguage">
+                    <ValueScheme>
+                        <enumeration>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2591">Unknown</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2592">Unspecified</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2952">true</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2953">false</item>
+                        </enumeration>
+                    </ValueScheme>
+                </CMD_Element>
+                <CMD_Element CardinalityMax="1" CardinalityMin="0" ConceptLink="http://www.isocat.org/datcat/DC-2955" name="MotherTongue">
+                    <ValueScheme>
+                        <enumeration>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2591">Unknown</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2592">Unspecified</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2952">true</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2953">false</item>
+                        </enumeration>
+                    </ValueScheme>
+                </CMD_Element>
+                <CMD_Element CardinalityMax="1" CardinalityMin="0" ConceptLink="http://www.isocat.org/datcat/DC-2553" name="PrimaryLanguage">
+                    <ValueScheme>
+                        <enumeration>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2591">Unknown</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2592">Unspecified</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2952">true</item>
+                            <item ConceptLink="http://www.isocat.org/datcat/DC-2953">false</item>
+                        </enumeration>
+                    </ValueScheme>
+                </CMD_Element>
+                <CMD_Component CardinalityMax="1" CardinalityMin="0" ConceptLink="http://www.isocat.org/datcat/DC-2520" ComponentId="clarin.eu:cr1:c_1271859438118" name="Description">
+                    <CMD_Element Multilingual="true" CardinalityMax="1" CardinalityMin="1" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2520" name="Description">
+                        <AttributeList>
+                            <Attribute>
+                                <Name>LanguageID</Name>
+                                <Type>string</Type>
+                            </Attribute>
+                        </AttributeList>
+                    </CMD_Element>
+                </CMD_Component>
+                <CMD_Component CardinalityMax="1" CardinalityMin="1" ComponentId="clarin.eu:cr1:c_1271859438111" name="Language">
+                    <CMD_Element Multilingual="true" CardinalityMax="1" CardinalityMin="1" ValueScheme="string" ConceptLink="http://www.isocat.org/datcat/DC-2484" name="LanguageName"/>
+                    <CMD_Component CardinalityMax="1" CardinalityMin="1" ComponentId="clarin.eu:cr1:c_1271859438110" name="ISO639">
+                        <CMD_Element DisplayPriority="1" CardinalityMax="1" CardinalityMin="1" ConceptLink="http://www.isocat.org/datcat/DC-2482" name="iso-639-3-code">
+                            <ValueScheme>
+                                <enumeration>
+                                    <item AppInfo="Ghotuo" ConceptLink="http://cdb.iso.org/lg/CDB-00132443-001">aaa</item>
+                                    <item AppInfo="Alumu-Tesu" ConceptLink="http://cdb.iso.org/lg/CDB-00133770-001">aab</item>
+                                    <item AppInfo="Ari" ConceptLink="http://cdb.iso.org/lg/CDB-00133769-001">aac</item>
+                                    <item AppInfo="Amal" ConceptLink="http://cdb.iso.org/lg/CDB-00133768-001">aad</item>
+                                    <item AppInfo="ArbÃ«reshÃ« Albanian" ConceptLink="http://cdb.iso.org/lg/CDB-00133767-001">aae</item>
+                                    <item AppInfo="Aranadan" ConceptLink="http://cdb.iso.org/lg/CDB-00133766-001">aaf</item>
+                                    <item AppInfo="Ambrak" ConceptLink="http://cdb.iso.org/lg/CDB-00133765-001">aag</item>
+                                    <item AppInfo="Abu' Arapesh" ConceptLink="http://cdb.iso.org/lg/CDB-00133756-001">aah</item>
+                                    <item AppInfo="Arifama-Miniafia" ConceptLink="http://cdb.iso.org/lg/CDB-00133763-001">aai</item>
+                                    <item AppInfo="Ankave" ConceptLink="http://cdb.iso.org/lg/CDB-00133771-001">aak</item>
+                                    <item AppInfo="Afade" ConceptLink="http://cdb.iso.org/lg/CDB-00133761-001">aal</item>
+                                    <item AppInfo="Aramanik" ConceptLink="http://cdb.iso.org/lg/CDB-00133760-001">aam</item>
+                                    <item AppInfo="AnambÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00133759-001">aan</item>
+                                    <item AppInfo="Algerian Saharan Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133758-001">aao</item>
+                                    <item AppInfo="ParÃ¡ ArÃ¡ra" ConceptLink="http://cdb.iso.org/lg/CDB-00133757-001">aap</item>
+                                    <item AppInfo="Eastern Abnaki" ConceptLink="http://cdb.iso.org/lg/CDB-00137967-001">aaq</item>
+                                    <item AppInfo="Afar" ConceptLink="http://cdb.iso.org/lg/CDB-00138650-001">aar</item>
+                                    <item AppInfo="AasÃ¡x" ConceptLink="http://cdb.iso.org/lg/CDB-00133779-001">aas</item>
+                                    <item AppInfo="Arvanitika Albanian" ConceptLink="http://cdb.iso.org/lg/CDB-00133781-001">aat</item>
+                                    <item AppInfo="Abau" ConceptLink="http://cdb.iso.org/lg/CDB-00133764-001">aau</item>
+                                    <item AppInfo="Solong" ConceptLink="http://cdb.iso.org/lg/CDB-00133786-001">aaw</item>
+                                    <item AppInfo="Mandobo Atas" ConceptLink="http://cdb.iso.org/lg/CDB-00133785-001">aax</item>
+                                    <item AppInfo="Amarasi" ConceptLink="http://cdb.iso.org/lg/CDB-00133784-001">aaz</item>
+                                    <item AppInfo="AbÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00133783-001">aba</item>
+                                    <item AppInfo="Bankon" ConceptLink="http://cdb.iso.org/lg/CDB-00133782-001">abb</item>
+                                    <item AppInfo="Ambala Ayta" ConceptLink="http://cdb.iso.org/lg/CDB-00133772-001">abc</item>
+                                    <item AppInfo="Camarines Norte Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00133780-001">abd</item>
+                                    <item AppInfo="Western Abnaki" ConceptLink="http://cdb.iso.org/lg/CDB-00133788-001">abe</item>
+                                    <item AppInfo="Abai Sungai" ConceptLink="http://cdb.iso.org/lg/CDB-00133778-001">abf</item>
+                                    <item AppInfo="Abaga" ConceptLink="http://cdb.iso.org/lg/CDB-00133777-001">abg</item>
+                                    <item AppInfo="Tajiki Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133776-001">abh</item>
+                                    <item AppInfo="Abidji" ConceptLink="http://cdb.iso.org/lg/CDB-00133775-001">abi</item>
+                                    <item AppInfo="Aka-Bea" ConceptLink="http://cdb.iso.org/lg/CDB-00138051-001">abj</item>
+                                    <item AppInfo="Abkhazian; Abkhaz" ConceptLink="http://cdb.iso.org/lg/CDB-00138467-001">abk</item>
+                                    <item AppInfo="Lampung Nyo" ConceptLink="http://cdb.iso.org/lg/CDB-00133774-001">abl</item>
+                                    <item AppInfo="Abanyom" ConceptLink="http://cdb.iso.org/lg/CDB-00133748-001">abm</item>
+                                    <item AppInfo="Abua" ConceptLink="http://cdb.iso.org/lg/CDB-00133787-001">abn</item>
+                                    <item AppInfo="Abon" ConceptLink="http://cdb.iso.org/lg/CDB-00133762-001">abo</item>
+                                    <item AppInfo="Abenlen Ayta" ConceptLink="http://cdb.iso.org/lg/CDB-00133889-001">abp</item>
+                                    <item AppInfo="Abaza" ConceptLink="http://cdb.iso.org/lg/CDB-00133888-001">abq</item>
+                                    <item AppInfo="Abron" ConceptLink="http://cdb.iso.org/lg/CDB-00133910-001">abr</item>
+                                    <item AppInfo="Ambonese Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00133912-001">abs</item>
+                                    <item AppInfo="Ambulas" ConceptLink="http://cdb.iso.org/lg/CDB-00133895-001">abt</item>
+                                    <item AppInfo="Abure" ConceptLink="http://cdb.iso.org/lg/CDB-00133917-001">abu</item>
+                                    <item AppInfo="Baharna Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133916-001">abv</item>
+                                    <item AppInfo="Pal" ConceptLink="http://cdb.iso.org/lg/CDB-00133915-001">abw</item>
+                                    <item AppInfo="Inabaknon" ConceptLink="http://cdb.iso.org/lg/CDB-00133914-001">abx</item>
+                                    <item AppInfo="Aneme Wake" ConceptLink="http://cdb.iso.org/lg/CDB-00133913-001">aby</item>
+                                    <item AppInfo="Abui" ConceptLink="http://cdb.iso.org/lg/CDB-00133903-001">abz</item>
+                                    <item AppInfo="Achagua" ConceptLink="http://cdb.iso.org/lg/CDB-00133911-001">aca</item>
+                                    <item AppInfo="ÃncÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00133919-001">acb</item>
+                                    <item AppInfo="Gikyode" ConceptLink="http://cdb.iso.org/lg/CDB-00133909-001">acd</item>
+                                    <item AppInfo="Achinese" ConceptLink="http://cdb.iso.org/lg/CDB-00133908-001">ace</item>
+                                    <item AppInfo="Saint Lucian Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00133907-001">acf</item>
+                                    <item AppInfo="Acoli" ConceptLink="http://cdb.iso.org/lg/CDB-00133906-001">ach</item>
+                                    <item AppInfo="Aka-Cari" ConceptLink="http://cdb.iso.org/lg/CDB-00137919-001">aci</item>
+                                    <item AppInfo="Aka-Kora" ConceptLink="http://cdb.iso.org/lg/CDB-00137943-001">ack</item>
+                                    <item AppInfo="Akar-Bale" ConceptLink="http://cdb.iso.org/lg/CDB-00137955-001">acl</item>
+                                    <item AppInfo="Mesopotamian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133905-001">acm</item>
+                                    <item AppInfo="Achang" ConceptLink="http://cdb.iso.org/lg/CDB-00133879-001">acn</item>
+                                    <item AppInfo="Eastern Acipa" ConceptLink="http://cdb.iso.org/lg/CDB-00133918-001">acp</item>
+                                    <item AppInfo="Ta'izzi-Adeni Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133893-001">acq</item>
+                                    <item AppInfo="Achi" ConceptLink="http://cdb.iso.org/lg/CDB-00133869-001">acr</item>
+                                    <item AppInfo="AcroÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00137937-001">acs</item>
+                                    <item AppInfo="Achterhoeks" ConceptLink="http://cdb.iso.org/lg/CDB-00133868-001">act</item>
+                                    <item AppInfo="Achuar-Shiwiar" ConceptLink="http://cdb.iso.org/lg/CDB-00133867-001">acu</item>
+                                    <item AppInfo="Achumawi" ConceptLink="http://cdb.iso.org/lg/CDB-00133866-001">acv</item>
+                                    <item AppInfo="Hijazi Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133865-001">acw</item>
+                                    <item AppInfo="Omani Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133864-001">acx</item>
+                                    <item AppInfo="Cypriot Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133855-001">acy</item>
+                                    <item AppInfo="Acheron" ConceptLink="http://cdb.iso.org/lg/CDB-00133862-001">acz</item>
+                                    <item AppInfo="Adangme" ConceptLink="http://cdb.iso.org/lg/CDB-00133870-001">ada</item>
+                                    <item AppInfo="Adabe" ConceptLink="http://cdb.iso.org/lg/CDB-00133860-001">adb</item>
+                                    <item AppInfo="Dzodinka" ConceptLink="http://cdb.iso.org/lg/CDB-00133859-001">add</item>
+                                    <item AppInfo="Adele" ConceptLink="http://cdb.iso.org/lg/CDB-00133858-001">ade</item>
+                                    <item AppInfo="Dhofari Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133857-001">adf</item>
+                                    <item AppInfo="Andegerebinha" ConceptLink="http://cdb.iso.org/lg/CDB-00133877-001">adg</item>
+                                    <item AppInfo="Adhola" ConceptLink="http://cdb.iso.org/lg/CDB-00133861-001">adh</item>
+                                    <item AppInfo="Adi" ConceptLink="http://cdb.iso.org/lg/CDB-00133863-001">adi</item>
+                                    <item AppInfo="Adioukrou" ConceptLink="http://cdb.iso.org/lg/CDB-00133885-001">adj</item>
+                                    <item AppInfo="Galo" ConceptLink="http://cdb.iso.org/lg/CDB-00133884-001">adl</item>
+                                    <item AppInfo="Adang" ConceptLink="http://cdb.iso.org/lg/CDB-00133883-001">adn</item>
+                                    <item AppInfo="Abu" ConceptLink="http://cdb.iso.org/lg/CDB-00133882-001">ado</item>
+                                    <item AppInfo="Adap" ConceptLink="http://cdb.iso.org/lg/CDB-00133881-001">adp</item>
+                                    <item AppInfo="Adangbe" ConceptLink="http://cdb.iso.org/lg/CDB-00133880-001">adq</item>
+                                    <item AppInfo="Adonara" ConceptLink="http://cdb.iso.org/lg/CDB-00133871-001">adr</item>
+                                    <item AppInfo="Adamorobe Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133878-001">ads</item>
+                                    <item AppInfo="Adnyamathanha" ConceptLink="http://cdb.iso.org/lg/CDB-00133886-001">adt</item>
+                                    <item AppInfo="Aduge" ConceptLink="http://cdb.iso.org/lg/CDB-00133876-001">adu</item>
+                                    <item AppInfo="Amundava" ConceptLink="http://cdb.iso.org/lg/CDB-00133875-001">adw</item>
+                                    <item AppInfo="Amdo Tibetan" ConceptLink="http://cdb.iso.org/lg/CDB-00133874-001">adx</item>
+                                    <item AppInfo="Adyghe; Adygei" ConceptLink="http://cdb.iso.org/lg/CDB-00133873-001">ady</item>
+                                    <item AppInfo="Adzera" ConceptLink="http://cdb.iso.org/lg/CDB-00133921-001">adz</item>
+                                    <item AppInfo="Areba" ConceptLink="http://cdb.iso.org/lg/CDB-00133856-001">aea</item>
+                                    <item AppInfo="Tunisian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133904-001">aeb</item>
+                                    <item AppInfo="Saidi Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133966-001">aec</item>
+                                    <item AppInfo="Argentine Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133965-001">aed</item>
+                                    <item AppInfo="Northeast Pashayi" ConceptLink="http://cdb.iso.org/lg/CDB-00133964-001">aee</item>
+                                    <item AppInfo="Haeke" ConceptLink="http://cdb.iso.org/lg/CDB-00133963-001">aek</item>
+                                    <item AppInfo="Ambele" ConceptLink="http://cdb.iso.org/lg/CDB-00133962-001">ael</item>
+                                    <item AppInfo="Arem" ConceptLink="http://cdb.iso.org/lg/CDB-00133961-001">aem</item>
+                                    <item AppInfo="Armenian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133952-001">aen</item>
+                                    <item AppInfo="Aer" ConceptLink="http://cdb.iso.org/lg/CDB-00133959-001">aeq</item>
+                                    <item AppInfo="Eastern Arrernte" ConceptLink="http://cdb.iso.org/lg/CDB-00133967-001">aer</item>
+                                    <item AppInfo="Alsea" ConceptLink="http://cdb.iso.org/lg/CDB-00138050-001">aes</item>
+                                    <item AppInfo="Akeu" ConceptLink="http://cdb.iso.org/lg/CDB-00133957-001">aeu</item>
+                                    <item AppInfo="Ambakich" ConceptLink="http://cdb.iso.org/lg/CDB-00133956-001">aew</item>
+                                    <item AppInfo="Amele" ConceptLink="http://cdb.iso.org/lg/CDB-00133955-001">aey</item>
+                                    <item AppInfo="Aeka" ConceptLink="http://cdb.iso.org/lg/CDB-00133954-001">aez</item>
+                                    <item AppInfo="Gulf Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133953-001">afb</item>
+                                    <item AppInfo="Andai" ConceptLink="http://cdb.iso.org/lg/CDB-00133975-001">afd</item>
+                                    <item AppInfo="Putukwam" ConceptLink="http://cdb.iso.org/lg/CDB-00133977-001">afe</item>
+                                    <item AppInfo="Afghan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133960-001">afg</item>
+                                    <item AppInfo="Afrihili" ConceptLink="http://cdb.iso.org/lg/CDB-00138350-001">afh</item>
+                                    <item AppInfo="Akrukay" ConceptLink="http://cdb.iso.org/lg/CDB-00133982-001">afi</item>
+                                    <item AppInfo="Nanubae" ConceptLink="http://cdb.iso.org/lg/CDB-00133981-001">afk</item>
+                                    <item AppInfo="Defaka" ConceptLink="http://cdb.iso.org/lg/CDB-00133980-001">afn</item>
+                                    <item AppInfo="Eloyi" ConceptLink="http://cdb.iso.org/lg/CDB-00133979-001">afo</item>
+                                    <item AppInfo="Tapei" ConceptLink="http://cdb.iso.org/lg/CDB-00133978-001">afp</item>
+                                    <item AppInfo="Afrikaans" ConceptLink="http://cdb.iso.org/lg/CDB-00138469-001">afr</item>
+                                    <item AppInfo="Afro-Seminole Creole" ConceptLink="http://cdb.iso.org/lg/CDB-00133968-001">afs</item>
+                                    <item AppInfo="Afitti" ConceptLink="http://cdb.iso.org/lg/CDB-00133976-001">aft</item>
+                                    <item AppInfo="Awutu" ConceptLink="http://cdb.iso.org/lg/CDB-00133984-001">afu</item>
+                                    <item AppInfo="Obokuitai" ConceptLink="http://cdb.iso.org/lg/CDB-00133974-001">afz</item>
+                                    <item AppInfo="Aguano" ConceptLink="http://cdb.iso.org/lg/CDB-00138115-001">aga</item>
+                                    <item AppInfo="Legbo" ConceptLink="http://cdb.iso.org/lg/CDB-00133973-001">agb</item>
+                                    <item AppInfo="Agatu" ConceptLink="http://cdb.iso.org/lg/CDB-00133972-001">agc</item>
+                                    <item AppInfo="Agarabi" ConceptLink="http://cdb.iso.org/lg/CDB-00133971-001">agd</item>
+                                    <item AppInfo="Angal" ConceptLink="http://cdb.iso.org/lg/CDB-00133970-001">age</item>
+                                    <item AppInfo="Arguni" ConceptLink="http://cdb.iso.org/lg/CDB-00133944-001">agf</item>
+                                    <item AppInfo="Angor" ConceptLink="http://cdb.iso.org/lg/CDB-00133983-001">agg</item>
+                                    <item AppInfo="Ngelima" ConceptLink="http://cdb.iso.org/lg/CDB-00133958-001">agh</item>
+                                    <item AppInfo="Agariya" ConceptLink="http://cdb.iso.org/lg/CDB-00133934-001">agi</item>
+                                    <item AppInfo="Argobba" ConceptLink="http://cdb.iso.org/lg/CDB-00133933-001">agj</item>
+                                    <item AppInfo="Isarog Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00133932-001">agk</item>
+                                    <item AppInfo="Fembe" ConceptLink="http://cdb.iso.org/lg/CDB-00133931-001">agl</item>
+                                    <item AppInfo="Angaataha" ConceptLink="http://cdb.iso.org/lg/CDB-00133930-001">agm</item>
+                                    <item AppInfo="Agutaynen" ConceptLink="http://cdb.iso.org/lg/CDB-00133929-001">agn</item>
+                                    <item AppInfo="Tainae" ConceptLink="http://cdb.iso.org/lg/CDB-00133920-001">ago</item>
+                                    <item AppInfo="Paranan" ConceptLink="http://cdb.iso.org/lg/CDB-00133927-001">agp</item>
+                                    <item AppInfo="Aghem" ConceptLink="http://cdb.iso.org/lg/CDB-00133935-001">agq</item>
+                                    <item AppInfo="Aguaruna" ConceptLink="http://cdb.iso.org/lg/CDB-00133925-001">agr</item>
+                                    <item AppInfo="Esimbi" ConceptLink="http://cdb.iso.org/lg/CDB-00133924-001">ags</item>
+                                    <item AppInfo="Central Cagayan Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00133923-001">agt</item>
+                                    <item AppInfo="Aguacateco" ConceptLink="http://cdb.iso.org/lg/CDB-00133922-001">agu</item>
+                                    <item AppInfo="Remontado Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00133942-001">agv</item>
+                                    <item AppInfo="Kahua" ConceptLink="http://cdb.iso.org/lg/CDB-00133926-001">agw</item>
+                                    <item AppInfo="Aghul" ConceptLink="http://cdb.iso.org/lg/CDB-00133928-001">agx</item>
+                                    <item AppInfo="Southern Alta" ConceptLink="http://cdb.iso.org/lg/CDB-00133950-001">agy</item>
+                                    <item AppInfo="Mt. Iriga Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00133949-001">agz</item>
+                                    <item AppInfo="Ahanta" ConceptLink="http://cdb.iso.org/lg/CDB-00133948-001">aha</item>
+                                    <item AppInfo="Axamb" ConceptLink="http://cdb.iso.org/lg/CDB-00133947-001">ahb</item>
+                                    <item AppInfo="Qimant" ConceptLink="http://cdb.iso.org/lg/CDB-00133946-001">ahg</item>
+                                    <item AppInfo="Aghu" ConceptLink="http://cdb.iso.org/lg/CDB-00133945-001">ahh</item>
+                                    <item AppInfo="Tiagbamrin Aizi" ConceptLink="http://cdb.iso.org/lg/CDB-00133936-001">ahi</item>
+                                    <item AppInfo="Akha" ConceptLink="http://cdb.iso.org/lg/CDB-00133943-001">ahk</item>
+                                    <item AppInfo="Igo" ConceptLink="http://cdb.iso.org/lg/CDB-00133951-001">ahl</item>
+                                    <item AppInfo="Mobumrin Aizi" ConceptLink="http://cdb.iso.org/lg/CDB-00133941-001">ahm</item>
+                                    <item AppInfo="ÃhÃ n" ConceptLink="http://cdb.iso.org/lg/CDB-00133940-001">ahn</item>
+                                    <item AppInfo="Ahom" ConceptLink="http://cdb.iso.org/lg/CDB-00137981-001">aho</item>
+                                    <item AppInfo="Aproumu Aizi" ConceptLink="http://cdb.iso.org/lg/CDB-00133939-001">ahp</item>
+                                    <item AppInfo="Ahirani" ConceptLink="http://cdb.iso.org/lg/CDB-00133938-001">ahr</item>
+                                    <item AppInfo="Ashe" ConceptLink="http://cdb.iso.org/lg/CDB-00133509-001">ahs</item>
+                                    <item AppInfo="Ahtena" ConceptLink="http://cdb.iso.org/lg/CDB-00134067-001">aht</item>
+                                    <item AppInfo="Arosi" ConceptLink="http://cdb.iso.org/lg/CDB-00133676-001">aia</item>
+                                    <item AppInfo="Ainu" ConceptLink="http://cdb.iso.org/lg/CDB-00133249-001">aib</item>
+                                    <item AppInfo="Ainbai" ConceptLink="http://cdb.iso.org/lg/CDB-00133248-001">aic</item>
+                                    <item AppInfo="Alngith" ConceptLink="http://cdb.iso.org/lg/CDB-00133247-001">aid</item>
+                                    <item AppInfo="Amara" ConceptLink="http://cdb.iso.org/lg/CDB-00133246-001">aie</item>
+                                    <item AppInfo="Agi" ConceptLink="http://cdb.iso.org/lg/CDB-00133245-001">aif</item>
+                                    <item AppInfo="Antigua and Barbuda Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00133244-001">aig</item>
+                                    <item AppInfo="Ai-Cham" ConceptLink="http://cdb.iso.org/lg/CDB-00133235-001">aih</item>
+                                    <item AppInfo="Assyrian Neo-Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00133242-001">aii</item>
+                                    <item AppInfo="Lishanid Noshan" ConceptLink="http://cdb.iso.org/lg/CDB-00133250-001">aij</item>
+                                    <item AppInfo="Ake" ConceptLink="http://cdb.iso.org/lg/CDB-00133240-001">aik</item>
+                                    <item AppInfo="Aimele" ConceptLink="http://cdb.iso.org/lg/CDB-00133239-001">ail</item>
+                                    <item AppInfo="Aimol" ConceptLink="http://cdb.iso.org/lg/CDB-00133238-001">aim</item>
+                                    <item AppInfo="Ainu" ConceptLink="http://cdb.iso.org/lg/CDB-00133237-001">ain</item>
+                                    <item AppInfo="Aiton" ConceptLink="http://cdb.iso.org/lg/CDB-00133236-001">aio</item>
+                                    <item AppInfo="Burumakok" ConceptLink="http://cdb.iso.org/lg/CDB-00133258-001">aip</item>
+                                    <item AppInfo="Aimaq" ConceptLink="http://cdb.iso.org/lg/CDB-00133260-001">aiq</item>
+                                    <item AppInfo="Airoran" ConceptLink="http://cdb.iso.org/lg/CDB-00133243-001">air</item>
+                                    <item AppInfo="Nataoran Amis" ConceptLink="http://cdb.iso.org/lg/CDB-00133265-001">ais</item>
+                                    <item AppInfo="Arikem" ConceptLink="http://cdb.iso.org/lg/CDB-00138315-001">ait</item>
+                                    <item AppInfo="Aari" ConceptLink="http://cdb.iso.org/lg/CDB-00133264-001">aiw</item>
+                                    <item AppInfo="Aighon" ConceptLink="http://cdb.iso.org/lg/CDB-00133263-001">aix</item>
+                                    <item AppInfo="Ali" ConceptLink="http://cdb.iso.org/lg/CDB-00133262-001">aiy</item>
+                                    <item AppInfo="Aja" ConceptLink="http://cdb.iso.org/lg/CDB-00133261-001">aja</item>
+                                    <item AppInfo="Aja" ConceptLink="http://cdb.iso.org/lg/CDB-00133251-001">ajg</item>
+                                    <item AppInfo="AjiÃ«" ConceptLink="http://cdb.iso.org/lg/CDB-00133259-001">aji</item>
+                                    <item AppInfo="South Levantine Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133267-001">ajp</item>
+                                    <item AppInfo="Judeo-Tunisian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133257-001">ajt</item>
+                                    <item AppInfo="Judeo-Moroccan Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133256-001">aju</item>
+                                    <item AppInfo="Ajawa" ConceptLink="http://cdb.iso.org/lg/CDB-00138303-001">ajw</item>
+                                    <item AppInfo="Amri Karbi" ConceptLink="http://cdb.iso.org/lg/CDB-00133255-001">ajz</item>
+                                    <item AppInfo="Akan" ConceptLink="http://cdb.iso.org/lg/CDB-00138470-001">aka</item>
+                                    <item AppInfo="Batak Angkola" ConceptLink="http://cdb.iso.org/lg/CDB-00133254-001">akb</item>
+                                    <item AppInfo="Mpur" ConceptLink="http://cdb.iso.org/lg/CDB-00133253-001">akc</item>
+                                    <item AppInfo="Ukpet-Ehom" ConceptLink="http://cdb.iso.org/lg/CDB-00133227-001">akd</item>
+                                    <item AppInfo="Akawaio" ConceptLink="http://cdb.iso.org/lg/CDB-00133266-001">ake</item>
+                                    <item AppInfo="Akpa" ConceptLink="http://cdb.iso.org/lg/CDB-00133241-001">akf</item>
+                                    <item AppInfo="Anakalangu" ConceptLink="http://cdb.iso.org/lg/CDB-00133217-001">akg</item>
+                                    <item AppInfo="Angal Heneng" ConceptLink="http://cdb.iso.org/lg/CDB-00133216-001">akh</item>
+                                    <item AppInfo="Aiome" ConceptLink="http://cdb.iso.org/lg/CDB-00133215-001">aki</item>
+                                    <item AppInfo="Aka-Jeru" ConceptLink="http://cdb.iso.org/lg/CDB-00138328-001">akj</item>
+                                    <item AppInfo="Akkadian" ConceptLink="http://cdb.iso.org/lg/CDB-00138360-001">akk</item>
+                                    <item AppInfo="Aklanon" ConceptLink="http://cdb.iso.org/lg/CDB-00133214-001">akl</item>
+                                    <item AppInfo="Aka-Bo" ConceptLink="http://cdb.iso.org/lg/CDB-00138140-001">akm</item>
+                                    <item AppInfo="Akurio" ConceptLink="http://cdb.iso.org/lg/CDB-00133213-001">ako</item>
+                                    <item AppInfo="Siwu" ConceptLink="http://cdb.iso.org/lg/CDB-00133212-001">akp</item>
+                                    <item AppInfo="Ak" ConceptLink="http://cdb.iso.org/lg/CDB-00133203-001">akq</item>
+                                    <item AppInfo="Araki" ConceptLink="http://cdb.iso.org/lg/CDB-00133210-001">akr</item>
+                                    <item AppInfo="Akaselem" ConceptLink="http://cdb.iso.org/lg/CDB-00133218-001">aks</item>
+                                    <item AppInfo="Akolet" ConceptLink="http://cdb.iso.org/lg/CDB-00133208-001">akt</item>
+                                    <item AppInfo="Akum" ConceptLink="http://cdb.iso.org/lg/CDB-00133207-001">aku</item>
+                                    <item AppInfo="Akhvakh" ConceptLink="http://cdb.iso.org/lg/CDB-00133206-001">akv</item>
+                                    <item AppInfo="Akwa" ConceptLink="http://cdb.iso.org/lg/CDB-00133205-001">akw</item>
+                                    <item AppInfo="Aka-Kede" ConceptLink="http://cdb.iso.org/lg/CDB-00138157-001">akx</item>
+                                    <item AppInfo="Aka-Kol" ConceptLink="http://cdb.iso.org/lg/CDB-00138217-001">aky</item>
+                                    <item AppInfo="Alabama" ConceptLink="http://cdb.iso.org/lg/CDB-00133225-001">akz</item>
+                                    <item AppInfo="Alago" ConceptLink="http://cdb.iso.org/lg/CDB-00133209-001">ala</item>
+                                    <item AppInfo="Qawasqar" ConceptLink="http://cdb.iso.org/lg/CDB-00133211-001">alc</item>
+                                    <item AppInfo="Alladian" ConceptLink="http://cdb.iso.org/lg/CDB-00133233-001">ald</item>
+                                    <item AppInfo="Aleut" ConceptLink="http://cdb.iso.org/lg/CDB-00133232-001">ale</item>
+                                    <item AppInfo="Alege" ConceptLink="http://cdb.iso.org/lg/CDB-00133231-001">alf</item>
+                                    <item AppInfo="Alawa" ConceptLink="http://cdb.iso.org/lg/CDB-00133230-001">alh</item>
+                                    <item AppInfo="Amaimon" ConceptLink="http://cdb.iso.org/lg/CDB-00133229-001">ali</item>
+                                    <item AppInfo="Alangan" ConceptLink="http://cdb.iso.org/lg/CDB-00133228-001">alj</item>
+                                    <item AppInfo="Alak" ConceptLink="http://cdb.iso.org/lg/CDB-00133219-001">alk</item>
+                                    <item AppInfo="Allar" ConceptLink="http://cdb.iso.org/lg/CDB-00133226-001">all</item>
+                                    <item AppInfo="Amblong" ConceptLink="http://cdb.iso.org/lg/CDB-00133234-001">alm</item>
+                                    <item AppInfo="Gheg Albanian" ConceptLink="http://cdb.iso.org/lg/CDB-00133224-001">aln</item>
+                                    <item AppInfo="Larike-Wakasihu" ConceptLink="http://cdb.iso.org/lg/CDB-00133223-001">alo</item>
+                                    <item AppInfo="Alune" ConceptLink="http://cdb.iso.org/lg/CDB-00133222-001">alp</item>
+                                    <item AppInfo="Algonquin" ConceptLink="http://cdb.iso.org/lg/CDB-00133221-001">alq</item>
+                                    <item AppInfo="Alutor" ConceptLink="http://cdb.iso.org/lg/CDB-00133269-001">alr</item>
+                                    <item AppInfo="Tosk Albanian" ConceptLink="http://cdb.iso.org/lg/CDB-00133204-001">als</item>
+                                    <item AppInfo="Southern Altai" ConceptLink="http://cdb.iso.org/lg/CDB-00133252-001">alt</item>
+                                    <item AppInfo="'Are'are" ConceptLink="http://cdb.iso.org/lg/CDB-00133314-001">alu</item>
+                                    <item AppInfo="Alaba-Kâabeena" ConceptLink="http://cdb.iso.org/lg/CDB-00133313-001">alw</item>
+                                    <item AppInfo="Amol" ConceptLink="http://cdb.iso.org/lg/CDB-00133312-001">alx</item>
+                                    <item AppInfo="Alyawarr" ConceptLink="http://cdb.iso.org/lg/CDB-00133311-001">aly</item>
+                                    <item AppInfo="Alur" ConceptLink="http://cdb.iso.org/lg/CDB-00133310-001">alz</item>
+                                    <item AppInfo="AmanayÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00138167-001">ama</item>
+                                    <item AppInfo="Ambo" ConceptLink="http://cdb.iso.org/lg/CDB-00133309-001">amb</item>
+                                    <item AppInfo="Amahuaca" ConceptLink="http://cdb.iso.org/lg/CDB-00133300-001">amc</item>
+                                    <item AppInfo="Yanesha'" ConceptLink="http://cdb.iso.org/lg/CDB-00133307-001">ame</item>
+                                    <item AppInfo="Hamer-Banna" ConceptLink="http://cdb.iso.org/lg/CDB-00133315-001">amf</item>
+                                    <item AppInfo="Amarag" ConceptLink="http://cdb.iso.org/lg/CDB-00133305-001">amg</item>
+                                    <item AppInfo="Amharic" ConceptLink="http://cdb.iso.org/lg/CDB-00138471-001">amh</item>
+                                    <item AppInfo="Amis" ConceptLink="http://cdb.iso.org/lg/CDB-00133304-001">ami</item>
+                                    <item AppInfo="Amdang" ConceptLink="http://cdb.iso.org/lg/CDB-00133303-001">amj</item>
+                                    <item AppInfo="Ambai" ConceptLink="http://cdb.iso.org/lg/CDB-00133302-001">amk</item>
+                                    <item AppInfo="War-Jaintia" ConceptLink="http://cdb.iso.org/lg/CDB-00133301-001">aml</item>
+                                    <item AppInfo="Ama" ConceptLink="http://cdb.iso.org/lg/CDB-00133323-001">amm</item>
+                                    <item AppInfo="Amanab" ConceptLink="http://cdb.iso.org/lg/CDB-00133325-001">amn</item>
+                                    <item AppInfo="Amo" ConceptLink="http://cdb.iso.org/lg/CDB-00133308-001">amo</item>
+                                    <item AppInfo="Alamblak" ConceptLink="http://cdb.iso.org/lg/CDB-00133330-001">amp</item>
+                                    <item AppInfo="Amahai" ConceptLink="http://cdb.iso.org/lg/CDB-00133329-001">amq</item>
+                                    <item AppInfo="Amarakaeri" ConceptLink="http://cdb.iso.org/lg/CDB-00133328-001">amr</item>
+                                    <item AppInfo="Southern Amami-Oshima" ConceptLink="http://cdb.iso.org/lg/CDB-00133327-001">ams</item>
+                                    <item AppInfo="Amto" ConceptLink="http://cdb.iso.org/lg/CDB-00133326-001">amt</item>
+                                    <item AppInfo="Guerrero Amuzgo" ConceptLink="http://cdb.iso.org/lg/CDB-00133316-001">amu</item>
+                                    <item AppInfo="Ambelau" ConceptLink="http://cdb.iso.org/lg/CDB-00133324-001">amv</item>
+                                    <item AppInfo="Western Neo-Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00133332-001">amw</item>
+                                    <item AppInfo="Anmatyerre" ConceptLink="http://cdb.iso.org/lg/CDB-00133322-001">amx</item>
+                                    <item AppInfo="Ami" ConceptLink="http://cdb.iso.org/lg/CDB-00133321-001">amy</item>
+                                    <item AppInfo="Atampaya" ConceptLink="http://cdb.iso.org/lg/CDB-00133320-001">amz</item>
+                                    <item AppInfo="Andaqui" ConceptLink="http://cdb.iso.org/lg/CDB-00138177-001">ana</item>
+                                    <item AppInfo="Andoa" ConceptLink="http://cdb.iso.org/lg/CDB-00138178-001">anb</item>
+                                    <item AppInfo="Ngas" ConceptLink="http://cdb.iso.org/lg/CDB-00133319-001">anc</item>
+                                    <item AppInfo="Ansus" ConceptLink="http://cdb.iso.org/lg/CDB-00133318-001">and</item>
+                                    <item AppInfo="XÃ¢rÃ¢cÃ¹Ã¹" ConceptLink="http://cdb.iso.org/lg/CDB-00133292-001">ane</item>
+                                    <item AppInfo="Animere" ConceptLink="http://cdb.iso.org/lg/CDB-00133331-001">anf</item>
+                                    <item AppInfo="Old English" ConceptLink="http://cdb.iso.org/lg/CDB-00137851-001">ang</item>
+                                    <item AppInfo="Nend" ConceptLink="http://cdb.iso.org/lg/CDB-00133306-001">anh</item>
+                                    <item AppInfo="Andi" ConceptLink="http://cdb.iso.org/lg/CDB-00133282-001">ani</item>
+                                    <item AppInfo="Anor" ConceptLink="http://cdb.iso.org/lg/CDB-00133281-001">anj</item>
+                                    <item AppInfo="Goemai" ConceptLink="http://cdb.iso.org/lg/CDB-00133280-001">ank</item>
+                                    <item AppInfo="Anu" ConceptLink="http://cdb.iso.org/lg/CDB-00133279-001">anl</item>
+                                    <item AppInfo="Anal" ConceptLink="http://cdb.iso.org/lg/CDB-00133278-001">anm</item>
+                                    <item AppInfo="Obolo" ConceptLink="http://cdb.iso.org/lg/CDB-00133277-001">ann</item>
+                                    <item AppInfo="Andoque" ConceptLink="http://cdb.iso.org/lg/CDB-00133268-001">ano</item>
+                                    <item AppInfo="Angika" ConceptLink="http://cdb.iso.org/lg/CDB-00133275-001">anp</item>
+                                    <item AppInfo="Jarawa" ConceptLink="http://cdb.iso.org/lg/CDB-00133283-001">anq</item>
+                                    <item AppInfo="Andh" ConceptLink="http://cdb.iso.org/lg/CDB-00133273-001">anr</item>
+                                    <item AppInfo="Anserma" ConceptLink="http://cdb.iso.org/lg/CDB-00138129-001">ans</item>
+                                    <item AppInfo="Antakarinya" ConceptLink="http://cdb.iso.org/lg/CDB-00133272-001">ant</item>
+                                    <item AppInfo="Anuak" ConceptLink="http://cdb.iso.org/lg/CDB-00133271-001">anu</item>
+                                    <item AppInfo="Denya" ConceptLink="http://cdb.iso.org/lg/CDB-00133270-001">anv</item>
+                                    <item AppInfo="Anaang" ConceptLink="http://cdb.iso.org/lg/CDB-00133290-001">anw</item>
+                                    <item AppInfo="Andra-Hus" ConceptLink="http://cdb.iso.org/lg/CDB-00133274-001">anx</item>
+                                    <item AppInfo="Anyin" ConceptLink="http://cdb.iso.org/lg/CDB-00133276-001">any</item>
+                                    <item AppInfo="Anem" ConceptLink="http://cdb.iso.org/lg/CDB-00133298-001">anz</item>
+                                    <item AppInfo="Angolar" ConceptLink="http://cdb.iso.org/lg/CDB-00133297-001">aoa</item>
+                                    <item AppInfo="Abom" ConceptLink="http://cdb.iso.org/lg/CDB-00133296-001">aob</item>
+                                    <item AppInfo="Pemon" ConceptLink="http://cdb.iso.org/lg/CDB-00133295-001">aoc</item>
+                                    <item AppInfo="Andarum" ConceptLink="http://cdb.iso.org/lg/CDB-00133294-001">aod</item>
+                                    <item AppInfo="Angal Enen" ConceptLink="http://cdb.iso.org/lg/CDB-00133293-001">aoe</item>
+                                    <item AppInfo="Bragat" ConceptLink="http://cdb.iso.org/lg/CDB-00133284-001">aof</item>
+                                    <item AppInfo="Angoram" ConceptLink="http://cdb.iso.org/lg/CDB-00133291-001">aog</item>
+                                    <item AppInfo="Arma" ConceptLink="http://cdb.iso.org/lg/CDB-00138130-001">aoh</item>
+                                    <item AppInfo="Anindilyakwa" ConceptLink="http://cdb.iso.org/lg/CDB-00133299-001">aoi</item>
+                                    <item AppInfo="Mufian" ConceptLink="http://cdb.iso.org/lg/CDB-00133289-001">aoj</item>
+                                    <item AppInfo="ArhÃ¶" ConceptLink="http://cdb.iso.org/lg/CDB-00133288-001">aok</item>
+                                    <item AppInfo="Alor" ConceptLink="http://cdb.iso.org/lg/CDB-00133287-001">aol</item>
+                                    <item AppInfo="Ãmie" ConceptLink="http://cdb.iso.org/lg/CDB-00133286-001">aom</item>
+                                    <item AppInfo="Bumbita Arapesh" ConceptLink="http://cdb.iso.org/lg/CDB-00133285-001">aon</item>
+                                    <item AppInfo="Aore" ConceptLink="http://cdb.iso.org/lg/CDB-00133187-001">aor</item>
+                                    <item AppInfo="Taikat" ConceptLink="http://cdb.iso.org/lg/CDB-00133090-001">aos</item>
+                                    <item AppInfo="A'tong" ConceptLink="http://cdb.iso.org/lg/CDB-00133220-001">aot</item>
+                                    <item AppInfo="Atorada" ConceptLink="http://cdb.iso.org/lg/CDB-00133118-001">aox</item>
+                                    <item AppInfo="Uab Meto" ConceptLink="http://cdb.iso.org/lg/CDB-00133117-001">aoz</item>
+                                    <item AppInfo="Sa'a" ConceptLink="http://cdb.iso.org/lg/CDB-00133116-001">apb</item>
+                                    <item AppInfo="North Levantine Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133115-001">apc</item>
+                                    <item AppInfo="Sudanese Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133114-001">apd</item>
+                                    <item AppInfo="Bukiyip" ConceptLink="http://cdb.iso.org/lg/CDB-00133105-001">ape</item>
+                                    <item AppInfo="Ampanang" ConceptLink="http://cdb.iso.org/lg/CDB-00133112-001">apg</item>
+                                    <item AppInfo="Athpariya" ConceptLink="http://cdb.iso.org/lg/CDB-00133120-001">aph</item>
+                                    <item AppInfo="ApiakÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00133110-001">api</item>
+                                    <item AppInfo="Jicarilla Apache" ConceptLink="http://cdb.iso.org/lg/CDB-00133109-001">apj</item>
+                                    <item AppInfo="Kiowa Apache" ConceptLink="http://cdb.iso.org/lg/CDB-00133108-001">apk</item>
+                                    <item AppInfo="Lipan Apache" ConceptLink="http://cdb.iso.org/lg/CDB-00133107-001">apl</item>
+                                    <item AppInfo="Mescalero-Chiricahua Apache" ConceptLink="http://cdb.iso.org/lg/CDB-00133106-001">apm</item>
+                                    <item AppInfo="ApinayÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00133128-001">apn</item>
+                                    <item AppInfo="Apalik" ConceptLink="http://cdb.iso.org/lg/CDB-00133130-001">apo</item>
+                                    <item AppInfo="Apma" ConceptLink="http://cdb.iso.org/lg/CDB-00133113-001">app</item>
+                                    <item AppInfo="A-Pucikwar" ConceptLink="http://cdb.iso.org/lg/CDB-00133135-001">apq</item>
+                                    <item AppInfo="Arop-Lokep" ConceptLink="http://cdb.iso.org/lg/CDB-00133134-001">apr</item>
+                                    <item AppInfo="Arop-Sissano" ConceptLink="http://cdb.iso.org/lg/CDB-00133133-001">aps</item>
+                                    <item AppInfo="Apatani" ConceptLink="http://cdb.iso.org/lg/CDB-00133132-001">apt</item>
+                                    <item AppInfo="ApurinÃ£" ConceptLink="http://cdb.iso.org/lg/CDB-00133131-001">apu</item>
+                                    <item AppInfo="Alapmunte" ConceptLink="http://cdb.iso.org/lg/CDB-00138137-001">apv</item>
+                                    <item AppInfo="Western Apache" ConceptLink="http://cdb.iso.org/lg/CDB-00133121-001">apw</item>
+                                    <item AppInfo="Aputai" ConceptLink="http://cdb.iso.org/lg/CDB-00133129-001">apx</item>
+                                    <item AppInfo="ApalaÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00133137-001">apy</item>
+                                    <item AppInfo="Safeyoka" ConceptLink="http://cdb.iso.org/lg/CDB-00133127-001">apz</item>
+                                    <item AppInfo="Archi" ConceptLink="http://cdb.iso.org/lg/CDB-00133126-001">aqc</item>
+                                    <item AppInfo="Arigidi" ConceptLink="http://cdb.iso.org/lg/CDB-00133125-001">aqg</item>
+                                    <item AppInfo="Atohwaim" ConceptLink="http://cdb.iso.org/lg/CDB-00133124-001">aqm</item>
+                                    <item AppInfo="Northern Alta" ConceptLink="http://cdb.iso.org/lg/CDB-00133123-001">aqn</item>
+                                    <item AppInfo="Atakapa" ConceptLink="http://cdb.iso.org/lg/CDB-00138138-001">aqp</item>
+                                    <item AppInfo="ArhÃ¢" ConceptLink="http://cdb.iso.org/lg/CDB-00133097-001">aqr</item>
+                                    <item AppInfo="Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00138473-001">ara</item>
+                                    <item AppInfo="Standard Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00133136-001">arb</item>
+                                    <item AppInfo="Official Aramaic; Imperial Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00138362-001">arc</item>
+                                    <item AppInfo="Arabana" ConceptLink="http://cdb.iso.org/lg/CDB-00133111-001">ard</item>
+                                    <item AppInfo="Western Arrarnta" ConceptLink="http://cdb.iso.org/lg/CDB-00133087-001">are</item>
+                                    <item AppInfo="Aragonese" ConceptLink="http://cdb.iso.org/lg/CDB-00138472-001">arg</item>
+                                    <item AppInfo="Arhuaco" ConceptLink="http://cdb.iso.org/lg/CDB-00133086-001">arh</item>
+                                    <item AppInfo="Arikara" ConceptLink="http://cdb.iso.org/lg/CDB-00133085-001">ari</item>
+                                    <item AppInfo="Arapaso" ConceptLink="http://cdb.iso.org/lg/CDB-00138344-001">arj</item>
+                                    <item AppInfo="ArikapÃº" ConceptLink="http://cdb.iso.org/lg/CDB-00134801-001">ark</item>
+                                    <item AppInfo="Arabela" ConceptLink="http://cdb.iso.org/lg/CDB-00134800-001">arl</item>
+                                    <item AppInfo="Mapudungun; Mapuche" ConceptLink="http://cdb.iso.org/lg/CDB-00134822-001">arn</item>
+                                    <item AppInfo="Araona" ConceptLink="http://cdb.iso.org/lg/CDB-00134824-001">aro</item>
+                                    <item AppInfo="Arapaho" ConceptLink="http://cdb.iso.org/lg/CDB-00134807-001">arp</item>
+                                    <item AppInfo="Algerian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134829-001">arq</item>
+                                    <item AppInfo="Karo" ConceptLink="http://cdb.iso.org/lg/CDB-00134828-001">arr</item>
+                                    <item AppInfo="Najdi Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134827-001">ars</item>
+                                    <item AppInfo="AruÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138247-001">aru</item>
+                                    <item AppInfo="Arbore" ConceptLink="http://cdb.iso.org/lg/CDB-00134826-001">arv</item>
+                                    <item AppInfo="Arawak" ConceptLink="http://cdb.iso.org/lg/CDB-00134825-001">arw</item>
+                                    <item AppInfo="AruÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00134815-001">arx</item>
+                                    <item AppInfo="Moroccan Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134823-001">ary</item>
+                                    <item AppInfo="Egyptian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134831-001">arz</item>
+                                    <item AppInfo="Asu" ConceptLink="http://cdb.iso.org/lg/CDB-00134821-001">asa</item>
+                                    <item AppInfo="Assiniboine" ConceptLink="http://cdb.iso.org/lg/CDB-00134820-001">asb</item>
+                                    <item AppInfo="Casuarina Coast Asmat" ConceptLink="http://cdb.iso.org/lg/CDB-00134819-001">asc</item>
+                                    <item AppInfo="Asas" ConceptLink="http://cdb.iso.org/lg/CDB-00134818-001">asd</item>
+                                    <item AppInfo="American Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134817-001">ase</item>
+                                    <item AppInfo="Australian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134791-001">asf</item>
+                                    <item AppInfo="Cishingini" ConceptLink="http://cdb.iso.org/lg/CDB-00134830-001">asg</item>
+                                    <item AppInfo="Abishira" ConceptLink="http://cdb.iso.org/lg/CDB-00138252-001">ash</item>
+                                    <item AppInfo="Buruwai" ConceptLink="http://cdb.iso.org/lg/CDB-00134805-001">asi</item>
+                                    <item AppInfo="Nsari" ConceptLink="http://cdb.iso.org/lg/CDB-00134781-001">asj</item>
+                                    <item AppInfo="Ashkun" ConceptLink="http://cdb.iso.org/lg/CDB-00134780-001">ask</item>
+                                    <item AppInfo="Asilulu" ConceptLink="http://cdb.iso.org/lg/CDB-00134779-001">asl</item>
+                                    <item AppInfo="Assamese" ConceptLink="http://cdb.iso.org/lg/CDB-00138474-001">asm</item>
+                                    <item AppInfo="XingÃº AsurinÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134778-001">asn</item>
+                                    <item AppInfo="Dano" ConceptLink="http://cdb.iso.org/lg/CDB-00134777-001">aso</item>
+                                    <item AppInfo="Algerian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134776-001">asp</item>
+                                    <item AppInfo="Austrian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134767-001">asq</item>
+                                    <item AppInfo="Asuri" ConceptLink="http://cdb.iso.org/lg/CDB-00134774-001">asr</item>
+                                    <item AppInfo="Ipulo" ConceptLink="http://cdb.iso.org/lg/CDB-00134782-001">ass</item>
+                                    <item AppInfo="Asturian; Bable; Leonese; Asturleonese" ConceptLink="http://cdb.iso.org/lg/CDB-00134772-001">ast</item>
+                                    <item AppInfo="Tocantins Asurini" ConceptLink="http://cdb.iso.org/lg/CDB-00134771-001">asu</item>
+                                    <item AppInfo="Asoa" ConceptLink="http://cdb.iso.org/lg/CDB-00134770-001">asv</item>
+                                    <item AppInfo="Australian Aborigines Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134769-001">asw</item>
+                                    <item AppInfo="Muratayak" ConceptLink="http://cdb.iso.org/lg/CDB-00134789-001">asx</item>
+                                    <item AppInfo="Yaosakor Asmat" ConceptLink="http://cdb.iso.org/lg/CDB-00134773-001">asy</item>
+                                    <item AppInfo="As" ConceptLink="http://cdb.iso.org/lg/CDB-00134775-001">asz</item>
+                                    <item AppInfo="Pele-Ata" ConceptLink="http://cdb.iso.org/lg/CDB-00134797-001">ata</item>
+                                    <item AppInfo="Zaiwa" ConceptLink="http://cdb.iso.org/lg/CDB-00134796-001">atb</item>
+                                    <item AppInfo="Atsahuaca" ConceptLink="http://cdb.iso.org/lg/CDB-00138282-001">atc</item>
+                                    <item AppInfo="Ata Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00134795-001">atd</item>
+                                    <item AppInfo="Atemble" ConceptLink="http://cdb.iso.org/lg/CDB-00134794-001">ate</item>
+                                    <item AppInfo="Ivbie North-Okpela-Arhe" ConceptLink="http://cdb.iso.org/lg/CDB-00134793-001">atg</item>
+                                    <item AppInfo="AttiÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134792-001">ati</item>
+                                    <item AppInfo="Atikamekw" ConceptLink="http://cdb.iso.org/lg/CDB-00134783-001">atj</item>
+                                    <item AppInfo="Ati" ConceptLink="http://cdb.iso.org/lg/CDB-00134790-001">atk</item>
+                                    <item AppInfo="Mt. Iraya Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00134798-001">atl</item>
+                                    <item AppInfo="Ata" ConceptLink="http://cdb.iso.org/lg/CDB-00134788-001">atm</item>
+                                    <item AppInfo="Ashtiani" ConceptLink="http://cdb.iso.org/lg/CDB-00134787-001">atn</item>
+                                    <item AppInfo="Atong" ConceptLink="http://cdb.iso.org/lg/CDB-00134786-001">ato</item>
+                                    <item AppInfo="Pudtol Atta" ConceptLink="http://cdb.iso.org/lg/CDB-00134785-001">atp</item>
+                                    <item AppInfo="Aralle-Tabulahan" ConceptLink="http://cdb.iso.org/lg/CDB-00134784-001">atq</item>
+                                    <item AppInfo="Waimiri-Atroari" ConceptLink="http://cdb.iso.org/lg/CDB-00134846-001">atr</item>
+                                    <item AppInfo="Gros Ventre" ConceptLink="http://cdb.iso.org/lg/CDB-00134896-001">ats</item>
+                                    <item AppInfo="Pamplona Atta" ConceptLink="http://cdb.iso.org/lg/CDB-00134816-001">att</item>
+                                    <item AppInfo="Reel" ConceptLink="http://cdb.iso.org/lg/CDB-00134878-001">atu</item>
+                                    <item AppInfo="Northern Altai" ConceptLink="http://cdb.iso.org/lg/CDB-00134877-001">atv</item>
+                                    <item AppInfo="Atsugewi" ConceptLink="http://cdb.iso.org/lg/CDB-00134876-001">atw</item>
+                                    <item AppInfo="Arutani" ConceptLink="http://cdb.iso.org/lg/CDB-00134875-001">atx</item>
+                                    <item AppInfo="Aneityum" ConceptLink="http://cdb.iso.org/lg/CDB-00134874-001">aty</item>
+                                    <item AppInfo="Arta" ConceptLink="http://cdb.iso.org/lg/CDB-00134865-001">atz</item>
+                                    <item AppInfo="Asumboa" ConceptLink="http://cdb.iso.org/lg/CDB-00134872-001">aua</item>
+                                    <item AppInfo="Alugu" ConceptLink="http://cdb.iso.org/lg/CDB-00134880-001">aub</item>
+                                    <item AppInfo="Waorani" ConceptLink="http://cdb.iso.org/lg/CDB-00134870-001">auc</item>
+                                    <item AppInfo="Anuta" ConceptLink="http://cdb.iso.org/lg/CDB-00134869-001">aud</item>
+                                    <item AppInfo="=/Kx'au//'ein" ConceptLink="http://cdb.iso.org/lg/CDB-00134868-001">aue</item>
+                                    <item AppInfo="Aguna" ConceptLink="http://cdb.iso.org/lg/CDB-00134867-001">aug</item>
+                                    <item AppInfo="Aushi" ConceptLink="http://cdb.iso.org/lg/CDB-00134866-001">auh</item>
+                                    <item AppInfo="Anuki" ConceptLink="http://cdb.iso.org/lg/CDB-00134888-001">aui</item>
+                                    <item AppInfo="Awjilah" ConceptLink="http://cdb.iso.org/lg/CDB-00134890-001">auj</item>
+                                    <item AppInfo="Heyo" ConceptLink="http://cdb.iso.org/lg/CDB-00134873-001">auk</item>
+                                    <item AppInfo="Aulua" ConceptLink="http://cdb.iso.org/lg/CDB-00134895-001">aul</item>
+                                    <item AppInfo="Asu" ConceptLink="http://cdb.iso.org/lg/CDB-00134894-001">aum</item>
+                                    <item AppInfo="Molmo One" ConceptLink="http://cdb.iso.org/lg/CDB-00134893-001">aun</item>
+                                    <item AppInfo="Auyokawa" ConceptLink="http://cdb.iso.org/lg/CDB-00138006-001">auo</item>
+                                    <item AppInfo="Makayam" ConceptLink="http://cdb.iso.org/lg/CDB-00134892-001">aup</item>
+                                    <item AppInfo="Anus" ConceptLink="http://cdb.iso.org/lg/CDB-00134891-001">auq</item>
+                                    <item AppInfo="Aruek" ConceptLink="http://cdb.iso.org/lg/CDB-00134881-001">aur</item>
+                                    <item AppInfo="Austral" ConceptLink="http://cdb.iso.org/lg/CDB-00134889-001">aut</item>
+                                    <item AppInfo="Auye" ConceptLink="http://cdb.iso.org/lg/CDB-00134897-001">auu</item>
+                                    <item AppInfo="Awyi" ConceptLink="http://cdb.iso.org/lg/CDB-00134887-001">auw</item>
+                                    <item AppInfo="AurÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00134886-001">aux</item>
+                                    <item AppInfo="Awiyaana" ConceptLink="http://cdb.iso.org/lg/CDB-00134885-001">auy</item>
+                                    <item AppInfo="Uzbeki Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134884-001">auz</item>
+                                    <item AppInfo="Avar; Avarish; Avaric" ConceptLink="http://cdb.iso.org/lg/CDB-00138475-001">ava</item>
+                                    <item AppInfo="Avau" ConceptLink="http://cdb.iso.org/lg/CDB-00134883-001">avb</item>
+                                    <item AppInfo="Alviri-Vidari" ConceptLink="http://cdb.iso.org/lg/CDB-00134882-001">avd</item>
+                                    <item AppInfo="Avestan" ConceptLink="http://cdb.iso.org/lg/CDB-00138468-001">ave</item>
+                                    <item AppInfo="Avikam" ConceptLink="http://cdb.iso.org/lg/CDB-00134863-001">avi</item>
+                                    <item AppInfo="Kotava" ConceptLink="http://cdb.iso.org/lg/CDB-00138358-001">avk</item>
+                                    <item AppInfo="Eastern Egyptian Bedawi Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134838-001">avl</item>
+                                    <item AppInfo="Avatime" ConceptLink="http://cdb.iso.org/lg/CDB-00134871-001">avn</item>
+                                    <item AppInfo="Agavotaguerra" ConceptLink="http://cdb.iso.org/lg/CDB-00137991-001">avo</item>
+                                    <item AppInfo="Aushiri" ConceptLink="http://cdb.iso.org/lg/CDB-00137969-001">avs</item>
+                                    <item AppInfo="Au" ConceptLink="http://cdb.iso.org/lg/CDB-00134845-001">avt</item>
+                                    <item AppInfo="Avokaya" ConceptLink="http://cdb.iso.org/lg/CDB-00134844-001">avu</item>
+                                    <item AppInfo="AvÃ¡-Canoeiro" ConceptLink="http://cdb.iso.org/lg/CDB-00134843-001">avv</item>
+                                    <item AppInfo="Awadhi" ConceptLink="http://cdb.iso.org/lg/CDB-00134842-001">awa</item>
+                                    <item AppInfo="Awa" ConceptLink="http://cdb.iso.org/lg/CDB-00134841-001">awb</item>
+                                    <item AppInfo="Cicipu" ConceptLink="http://cdb.iso.org/lg/CDB-00134832-001">awc</item>
+                                    <item AppInfo="AwetÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134839-001">awe</item>
+                                    <item AppInfo="Awbono" ConceptLink="http://cdb.iso.org/lg/CDB-00134847-001">awh</item>
+                                    <item AppInfo="Aekyom" ConceptLink="http://cdb.iso.org/lg/CDB-00134837-001">awi</item>
+                                    <item AppInfo="Awabakal" ConceptLink="http://cdb.iso.org/lg/CDB-00137953-001">awk</item>
+                                    <item AppInfo="Arawum" ConceptLink="http://cdb.iso.org/lg/CDB-00134836-001">awm</item>
+                                    <item AppInfo="Awngi" ConceptLink="http://cdb.iso.org/lg/CDB-00134835-001">awn</item>
+                                    <item AppInfo="Awak" ConceptLink="http://cdb.iso.org/lg/CDB-00134834-001">awo</item>
+                                    <item AppInfo="Awera" ConceptLink="http://cdb.iso.org/lg/CDB-00134833-001">awr</item>
+                                    <item AppInfo="South Awyu" ConceptLink="http://cdb.iso.org/lg/CDB-00134855-001">aws</item>
+                                    <item AppInfo="ArawetÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134857-001">awt</item>
+                                    <item AppInfo="Central Awyu" ConceptLink="http://cdb.iso.org/lg/CDB-00134840-001">awu</item>
+                                    <item AppInfo="Jair Awyu" ConceptLink="http://cdb.iso.org/lg/CDB-00134862-001">awv</item>
+                                    <item AppInfo="Awun" ConceptLink="http://cdb.iso.org/lg/CDB-00134861-001">aww</item>
+                                    <item AppInfo="Awara" ConceptLink="http://cdb.iso.org/lg/CDB-00134860-001">awx</item>
+                                    <item AppInfo="Edera Awyu" ConceptLink="http://cdb.iso.org/lg/CDB-00134859-001">awy</item>
+                                    <item AppInfo="Abipon" ConceptLink="http://cdb.iso.org/lg/CDB-00138024-001">axb</item>
+                                    <item AppInfo="Mato Grosso ArÃ¡ra" ConceptLink="http://cdb.iso.org/lg/CDB-00138090-001">axg</item>
+                                    <item AppInfo="Yaka" ConceptLink="http://cdb.iso.org/lg/CDB-00134858-001">axk</item>
+                                    <item AppInfo="Middle Armenian" ConceptLink="http://cdb.iso.org/lg/CDB-00137871-001">axm</item>
+                                    <item AppInfo="Xaragure" ConceptLink="http://cdb.iso.org/lg/CDB-00134848-001">axx</item>
+                                    <item AppInfo="Awar" ConceptLink="http://cdb.iso.org/lg/CDB-00134856-001">aya</item>
+                                    <item AppInfo="Ayizo Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00134864-001">ayb</item>
+                                    <item AppInfo="Southern Aymara" ConceptLink="http://cdb.iso.org/lg/CDB-00134854-001">ayc</item>
+                                    <item AppInfo="Ayabadhu" ConceptLink="http://cdb.iso.org/lg/CDB-00134853-001">ayd</item>
+                                    <item AppInfo="Ayere" ConceptLink="http://cdb.iso.org/lg/CDB-00134852-001">aye</item>
+                                    <item AppInfo="Ginyanga" ConceptLink="http://cdb.iso.org/lg/CDB-00134851-001">ayg</item>
+                                    <item AppInfo="Hadrami Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134850-001">ayh</item>
+                                    <item AppInfo="Leyigha" ConceptLink="http://cdb.iso.org/lg/CDB-00134751-001">ayi</item>
+                                    <item AppInfo="Akuku" ConceptLink="http://cdb.iso.org/lg/CDB-00134879-001">ayk</item>
+                                    <item AppInfo="Libyan Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134768-001">ayl</item>
+                                    <item AppInfo="Aymara" ConceptLink="http://cdb.iso.org/lg/CDB-00138476-001">aym</item>
+                                    <item AppInfo="Sanaani Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134683-001">ayn</item>
+                                    <item AppInfo="Ayoreo" ConceptLink="http://cdb.iso.org/lg/CDB-00134682-001">ayo</item>
+                                    <item AppInfo="North Mesopotamian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134681-001">ayp</item>
+                                    <item AppInfo="Ayi" ConceptLink="http://cdb.iso.org/lg/CDB-00134680-001">ayq</item>
+                                    <item AppInfo="Central Aymara" ConceptLink="http://cdb.iso.org/lg/CDB-00134679-001">ayr</item>
+                                    <item AppInfo="Sorsogon Ayta" ConceptLink="http://cdb.iso.org/lg/CDB-00134678-001">ays</item>
+                                    <item AppInfo="Bataan Ayta" ConceptLink="http://cdb.iso.org/lg/CDB-00134669-001">ayt</item>
+                                    <item AppInfo="Ayu" ConceptLink="http://cdb.iso.org/lg/CDB-00134676-001">ayu</item>
+                                    <item AppInfo="Ayi" ConceptLink="http://cdb.iso.org/lg/CDB-00134684-001">ayx</item>
+                                    <item AppInfo="Tayabas Ayta" ConceptLink="http://cdb.iso.org/lg/CDB-00138037-001">ayy</item>
+                                    <item AppInfo="Mai Brat" ConceptLink="http://cdb.iso.org/lg/CDB-00134674-001">ayz</item>
+                                    <item AppInfo="Azha" ConceptLink="http://cdb.iso.org/lg/CDB-00134673-001">aza</item>
+                                    <item AppInfo="South Azerbaijani" ConceptLink="http://cdb.iso.org/lg/CDB-00134672-001">azb</item>
+                                    <item AppInfo="Azerbaijani" ConceptLink="http://cdb.iso.org/lg/CDB-00138477-001">aze</item>
+                                    <item AppInfo="San Pedro Amuzgos Amuzgo" ConceptLink="http://cdb.iso.org/lg/CDB-00134671-001">azg</item>
+                                    <item AppInfo="North Azerbaijani" ConceptLink="http://cdb.iso.org/lg/CDB-00134670-001">azj</item>
+                                    <item AppInfo="Ipalapa Amuzgo" ConceptLink="http://cdb.iso.org/lg/CDB-00134692-001">azm</item>
+                                    <item AppInfo="Awing" ConceptLink="http://cdb.iso.org/lg/CDB-00134694-001">azo</item>
+                                    <item AppInfo="Faire Atta" ConceptLink="http://cdb.iso.org/lg/CDB-00134677-001">azt</item>
+                                    <item AppInfo="Highland Puebla Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00134699-001">azz</item>
+                                    <item AppInfo="Babatana" ConceptLink="http://cdb.iso.org/lg/CDB-00134698-001">baa</item>
+                                    <item AppInfo="Bainouk-GunyuÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00134697-001">bab</item>
+                                    <item AppInfo="Badui" ConceptLink="http://cdb.iso.org/lg/CDB-00134696-001">bac</item>
+                                    <item AppInfo="BarÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00138013-001">bae</item>
+                                    <item AppInfo="Nubaca" ConceptLink="http://cdb.iso.org/lg/CDB-00134695-001">baf</item>
+                                    <item AppInfo="Tuki" ConceptLink="http://cdb.iso.org/lg/CDB-00134685-001">bag</item>
+                                    <item AppInfo="Bahamas Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00134693-001">bah</item>
+                                    <item AppInfo="Barakai" ConceptLink="http://cdb.iso.org/lg/CDB-00134701-001">baj</item>
+                                    <item AppInfo="Bashkir" ConceptLink="http://cdb.iso.org/lg/CDB-00138478-001">bak</item>
+                                    <item AppInfo="Baluchi" ConceptLink="http://cdb.iso.org/lg/CDB-00131002-001">bal</item>
+                                    <item AppInfo="Bambara" ConceptLink="http://cdb.iso.org/lg/CDB-00138482-001">bam</item>
+                                    <item AppInfo="Balinese" ConceptLink="http://cdb.iso.org/lg/CDB-00134691-001">ban</item>
+                                    <item AppInfo="Waimaha" ConceptLink="http://cdb.iso.org/lg/CDB-00134690-001">bao</item>
+                                    <item AppInfo="Bantawa" ConceptLink="http://cdb.iso.org/lg/CDB-00134689-001">bap</item>
+                                    <item AppInfo="Bavarian" ConceptLink="http://cdb.iso.org/lg/CDB-00134688-001">bar</item>
+                                    <item AppInfo="Basa" ConceptLink="http://cdb.iso.org/lg/CDB-00134687-001">bas</item>
+                                    <item AppInfo="Bada" ConceptLink="http://cdb.iso.org/lg/CDB-00134661-001">bau</item>
+                                    <item AppInfo="Vengo" ConceptLink="http://cdb.iso.org/lg/CDB-00134700-001">bav</item>
+                                    <item AppInfo="Bambili-Bambui" ConceptLink="http://cdb.iso.org/lg/CDB-00134675-001">baw</item>
+                                    <item AppInfo="Bamun" ConceptLink="http://cdb.iso.org/lg/CDB-00134651-001">bax</item>
+                                    <item AppInfo="Batuley" ConceptLink="http://cdb.iso.org/lg/CDB-00134650-001">bay</item>
+                                    <item AppInfo="Tunen" ConceptLink="http://cdb.iso.org/lg/CDB-00134649-001">baz</item>
+                                    <item AppInfo="Baatonum" ConceptLink="http://cdb.iso.org/lg/CDB-00134648-001">bba</item>
+                                    <item AppInfo="Barai" ConceptLink="http://cdb.iso.org/lg/CDB-00134647-001">bbb</item>
+                                    <item AppInfo="Batak Toba" ConceptLink="http://cdb.iso.org/lg/CDB-00134646-001">bbc</item>
+                                    <item AppInfo="Bau" ConceptLink="http://cdb.iso.org/lg/CDB-00134637-001">bbd</item>
+                                    <item AppInfo="Bangba" ConceptLink="http://cdb.iso.org/lg/CDB-00134644-001">bbe</item>
+                                    <item AppInfo="Baibai" ConceptLink="http://cdb.iso.org/lg/CDB-00134652-001">bbf</item>
+                                    <item AppInfo="Barama" ConceptLink="http://cdb.iso.org/lg/CDB-00134642-001">bbg</item>
+                                    <item AppInfo="Bugan" ConceptLink="http://cdb.iso.org/lg/CDB-00134641-001">bbh</item>
+                                    <item AppInfo="Barombi" ConceptLink="http://cdb.iso.org/lg/CDB-00134640-001">bbi</item>
+                                    <item AppInfo="GhomÃ¡lÃ¡'" ConceptLink="http://cdb.iso.org/lg/CDB-00134639-001">bbj</item>
+                                    <item AppInfo="Babanki" ConceptLink="http://cdb.iso.org/lg/CDB-00134659-001">bbk</item>
+                                    <item AppInfo="Bats" ConceptLink="http://cdb.iso.org/lg/CDB-00134643-001">bbl</item>
+                                    <item AppInfo="Babango" ConceptLink="http://cdb.iso.org/lg/CDB-00134645-001">bbm</item>
+                                    <item AppInfo="Uneapa" ConceptLink="http://cdb.iso.org/lg/CDB-00134667-001">bbn</item>
+                                    <item AppInfo="Northern Bobo MadarÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134666-001">bbo</item>
+                                    <item AppInfo="West Central Banda" ConceptLink="http://cdb.iso.org/lg/CDB-00134665-001">bbp</item>
+                                    <item AppInfo="Bamali" ConceptLink="http://cdb.iso.org/lg/CDB-00134664-001">bbq</item>
+                                    <item AppInfo="Girawa" ConceptLink="http://cdb.iso.org/lg/CDB-00134663-001">bbr</item>
+                                    <item AppInfo="Bakpinka" ConceptLink="http://cdb.iso.org/lg/CDB-00134662-001">bbs</item>
+                                    <item AppInfo="Mburku" ConceptLink="http://cdb.iso.org/lg/CDB-00134653-001">bbt</item>
+                                    <item AppInfo="Kulung" ConceptLink="http://cdb.iso.org/lg/CDB-00134660-001">bbu</item>
+                                    <item AppInfo="Karnai" ConceptLink="http://cdb.iso.org/lg/CDB-00134668-001">bbv</item>
+                                    <item AppInfo="Baba" ConceptLink="http://cdb.iso.org/lg/CDB-00134658-001">bbw</item>
+                                    <item AppInfo="Bubia" ConceptLink="http://cdb.iso.org/lg/CDB-00134657-001">bbx</item>
+                                    <item AppInfo="Befang" ConceptLink="http://cdb.iso.org/lg/CDB-00134656-001">bby</item>
+                                    <item AppInfo="Babalia Creole Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00134655-001">bbz</item>
+                                    <item AppInfo="Central Bai" ConceptLink="http://cdb.iso.org/lg/CDB-00134703-001">bca</item>
+                                    <item AppInfo="Bainouk-Samik" ConceptLink="http://cdb.iso.org/lg/CDB-00134638-001">bcb</item>
+                                    <item AppInfo="Southern Balochi" ConceptLink="http://cdb.iso.org/lg/CDB-00134686-001">bcc</item>
+                                    <item AppInfo="North Babar" ConceptLink="http://cdb.iso.org/lg/CDB-00134748-001">bcd</item>
+                                    <item AppInfo="Bamenyam" ConceptLink="http://cdb.iso.org/lg/CDB-00134747-001">bce</item>
+                                    <item AppInfo="Bamu" ConceptLink="http://cdb.iso.org/lg/CDB-00134746-001">bcf</item>
+                                    <item AppInfo="Baga Binari" ConceptLink="http://cdb.iso.org/lg/CDB-00134745-001">bcg</item>
+                                    <item AppInfo="Bariai" ConceptLink="http://cdb.iso.org/lg/CDB-00134744-001">bch</item>
+                                    <item AppInfo="BaoulÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134743-001">bci</item>
+                                    <item AppInfo="Bardi" ConceptLink="http://cdb.iso.org/lg/CDB-00134734-001">bcj</item>
+                                    <item AppInfo="Bunaba" ConceptLink="http://cdb.iso.org/lg/CDB-00134741-001">bck</item>
+                                    <item AppInfo="Central Bicolano" ConceptLink="http://cdb.iso.org/lg/CDB-00134749-001">bcl</item>
+                                    <item AppInfo="Bannoni" ConceptLink="http://cdb.iso.org/lg/CDB-00134739-001">bcm</item>
+                                    <item AppInfo="Bali" ConceptLink="http://cdb.iso.org/lg/CDB-00134738-001">bcn</item>
+                                    <item AppInfo="Kaluli" ConceptLink="http://cdb.iso.org/lg/CDB-00134737-001">bco</item>
+                                    <item AppInfo="Bali" ConceptLink="http://cdb.iso.org/lg/CDB-00134736-001">bcp</item>
+                                    <item AppInfo="Bench" ConceptLink="http://cdb.iso.org/lg/CDB-00134735-001">bcq</item>
+                                    <item AppInfo="Babine" ConceptLink="http://cdb.iso.org/lg/CDB-00134757-001">bcr</item>
+                                    <item AppInfo="Kohumono" ConceptLink="http://cdb.iso.org/lg/CDB-00134759-001">bcs</item>
+                                    <item AppInfo="Bendi" ConceptLink="http://cdb.iso.org/lg/CDB-00134742-001">bct</item>
+                                    <item AppInfo="Awad Bing" ConceptLink="http://cdb.iso.org/lg/CDB-00134764-001">bcu</item>
+                                    <item AppInfo="Shoo-Minda-Nye" ConceptLink="http://cdb.iso.org/lg/CDB-00134763-001">bcv</item>
+                                    <item AppInfo="Bana" ConceptLink="http://cdb.iso.org/lg/CDB-00134762-001">bcw</item>
+                                    <item AppInfo="Bacama" ConceptLink="http://cdb.iso.org/lg/CDB-00134761-001">bcy</item>
+                                    <item AppInfo="Bainouk-Gunyaamolo" ConceptLink="http://cdb.iso.org/lg/CDB-00134760-001">bcz</item>
+                                    <item AppInfo="Bayot" ConceptLink="http://cdb.iso.org/lg/CDB-00134750-001">bda</item>
+                                    <item AppInfo="Basap" ConceptLink="http://cdb.iso.org/lg/CDB-00134758-001">bdb</item>
+                                    <item AppInfo="EmberÃ¡-BaudÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00134766-001">bdc</item>
+                                    <item AppInfo="Bunama" ConceptLink="http://cdb.iso.org/lg/CDB-00134756-001">bdd</item>
+                                    <item AppInfo="Bade" ConceptLink="http://cdb.iso.org/lg/CDB-00134755-001">bde</item>
+                                    <item AppInfo="Bonggi" ConceptLink="http://cdb.iso.org/lg/CDB-00134754-001">bdg</item>
+                                    <item AppInfo="Baka" ConceptLink="http://cdb.iso.org/lg/CDB-00134753-001">bdh</item>
+                                    <item AppInfo="Burun" ConceptLink="http://cdb.iso.org/lg/CDB-00134752-001">bdi</item>
+                                    <item AppInfo="Bai" ConceptLink="http://cdb.iso.org/lg/CDB-00134726-001">bdj</item>
+                                    <item AppInfo="Budukh" ConceptLink="http://cdb.iso.org/lg/CDB-00134765-001">bdk</item>
+                                    <item AppInfo="Indonesian Bajau" ConceptLink="http://cdb.iso.org/lg/CDB-00134740-001">bdl</item>
+                                    <item AppInfo="Buduma" ConceptLink="http://cdb.iso.org/lg/CDB-00134716-001">bdm</item>
+                                    <item AppInfo="Baldemu" ConceptLink="http://cdb.iso.org/lg/CDB-00134715-001">bdn</item>
+                                    <item AppInfo="Morom" ConceptLink="http://cdb.iso.org/lg/CDB-00134714-001">bdo</item>
+                                    <item AppInfo="Bende" ConceptLink="http://cdb.iso.org/lg/CDB-00134713-001">bdp</item>
+                                    <item AppInfo="Bahnar" ConceptLink="http://cdb.iso.org/lg/CDB-00134712-001">bdq</item>
+                                    <item AppInfo="West Coast Bajau" ConceptLink="http://cdb.iso.org/lg/CDB-00134711-001">bdr</item>
+                                    <item AppInfo="Burunge" ConceptLink="http://cdb.iso.org/lg/CDB-00134702-001">bds</item>
+                                    <item AppInfo="Bokoto" ConceptLink="http://cdb.iso.org/lg/CDB-00134709-001">bdt</item>
+                                    <item AppInfo="Oroko" ConceptLink="http://cdb.iso.org/lg/CDB-00134717-001">bdu</item>
+                                    <item AppInfo="Bodo Parja" ConceptLink="http://cdb.iso.org/lg/CDB-00134707-001">bdv</item>
+                                    <item AppInfo="Baham" ConceptLink="http://cdb.iso.org/lg/CDB-00134706-001">bdw</item>
+                                    <item AppInfo="Budong-Budong" ConceptLink="http://cdb.iso.org/lg/CDB-00134705-001">bdx</item>
+                                    <item AppInfo="Bandjalang" ConceptLink="http://cdb.iso.org/lg/CDB-00134704-001">bdy</item>
+                                    <item AppInfo="Badeshi" ConceptLink="http://cdb.iso.org/lg/CDB-00134724-001">bdz</item>
+                                    <item AppInfo="Beaver" ConceptLink="http://cdb.iso.org/lg/CDB-00134708-001">bea</item>
+                                    <item AppInfo="Bebele" ConceptLink="http://cdb.iso.org/lg/CDB-00134710-001">beb</item>
+                                    <item AppInfo="Iceve-Maci" ConceptLink="http://cdb.iso.org/lg/CDB-00134732-001">bec</item>
+                                    <item AppInfo="Bedoanas" ConceptLink="http://cdb.iso.org/lg/CDB-00134731-001">bed</item>
+                                    <item AppInfo="Byangsi" ConceptLink="http://cdb.iso.org/lg/CDB-00134730-001">bee</item>
+                                    <item AppInfo="Benabena" ConceptLink="http://cdb.iso.org/lg/CDB-00134729-001">bef</item>
+                                    <item AppInfo="Belait" ConceptLink="http://cdb.iso.org/lg/CDB-00134728-001">beg</item>
+                                    <item AppInfo="Biali" ConceptLink="http://cdb.iso.org/lg/CDB-00134727-001">beh</item>
+                                    <item AppInfo="Bekati'" ConceptLink="http://cdb.iso.org/lg/CDB-00134718-001">bei</item>
+                                    <item AppInfo="Beja; Bedawiyet" ConceptLink="http://cdb.iso.org/lg/CDB-00134725-001">bej</item>
+                                    <item AppInfo="Bebeli" ConceptLink="http://cdb.iso.org/lg/CDB-00134733-001">bek</item>
+                                    <item AppInfo="Belarusian" ConceptLink="http://cdb.iso.org/lg/CDB-00138479-001">bel</item>
+                                    <item AppInfo="Bemba" ConceptLink="http://cdb.iso.org/lg/CDB-00134723-001">bem</item>
+                                    <item AppInfo="Bengali; Bangla" ConceptLink="http://cdb.iso.org/lg/CDB-00138483-001">ben</item>
+                                    <item AppInfo="Beami" ConceptLink="http://cdb.iso.org/lg/CDB-00134722-001">beo</item>
+                                    <item AppInfo="Besoa" ConceptLink="http://cdb.iso.org/lg/CDB-00134721-001">bep</item>
+                                    <item AppInfo="Beembe" ConceptLink="http://cdb.iso.org/lg/CDB-00134720-001">beq</item>
+                                    <item AppInfo="Besme" ConceptLink="http://cdb.iso.org/lg/CDB-00134915-001">bes</item>
+                                    <item AppInfo="Guiberoua BÃ©te" ConceptLink="http://cdb.iso.org/lg/CDB-00133738-001">bet</item>
+                                    <item AppInfo="Blagar" ConceptLink="http://cdb.iso.org/lg/CDB-00133737-001">beu</item>
+                                    <item AppInfo="Daloa BÃ©tÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00133736-001">bev</item>
+                                    <item AppInfo="Betawi" ConceptLink="http://cdb.iso.org/lg/CDB-00133735-001">bew</item>
+                                    <item AppInfo="Jur Modo" ConceptLink="http://cdb.iso.org/lg/CDB-00133734-001">bex</item>
+                                    <item AppInfo="Beli" ConceptLink="http://cdb.iso.org/lg/CDB-00133733-001">bey</item>
+                                    <item AppInfo="Bena" ConceptLink="http://cdb.iso.org/lg/CDB-00133724-001">bez</item>
+                                    <item AppInfo="Bari" ConceptLink="http://cdb.iso.org/lg/CDB-00133731-001">bfa</item>
+                                    <item AppInfo="Pauri Bareli" ConceptLink="http://cdb.iso.org/lg/CDB-00133739-001">bfb</item>
+                                    <item AppInfo="Northern Bai" ConceptLink="http://cdb.iso.org/lg/CDB-00133729-001">bfc</item>
+                                    <item AppInfo="Bafut" ConceptLink="http://cdb.iso.org/lg/CDB-00133728-001">bfd</item>
+                                    <item AppInfo="Betaf" ConceptLink="http://cdb.iso.org/lg/CDB-00133727-001">bfe</item>
+                                    <item AppInfo="Bofi" ConceptLink="http://cdb.iso.org/lg/CDB-00133726-001">bff</item>
+                                    <item AppInfo="Busang Kayan" ConceptLink="http://cdb.iso.org/lg/CDB-00133746-001">bfg</item>
+                                    <item AppInfo="Blafe" ConceptLink="http://cdb.iso.org/lg/CDB-00133730-001">bfh</item>
+                                    <item AppInfo="British Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133732-001">bfi</item>
+                                    <item AppInfo="Bafanji" ConceptLink="http://cdb.iso.org/lg/CDB-00133754-001">bfj</item>
+                                    <item AppInfo="Ban Khor Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133753-001">bfk</item>
+                                    <item AppInfo="Banda-NdÃ©lÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00133752-001">bfl</item>
+                                    <item AppInfo="Mmen" ConceptLink="http://cdb.iso.org/lg/CDB-00133751-001">bfm</item>
+                                    <item AppInfo="Bunak" ConceptLink="http://cdb.iso.org/lg/CDB-00133750-001">bfn</item>
+                                    <item AppInfo="Malba Birifor" ConceptLink="http://cdb.iso.org/lg/CDB-00133749-001">bfo</item>
+                                    <item AppInfo="Beba" ConceptLink="http://cdb.iso.org/lg/CDB-00133740-001">bfp</item>
+                                    <item AppInfo="Badaga" ConceptLink="http://cdb.iso.org/lg/CDB-00133747-001">bfq</item>
+                                    <item AppInfo="Bazigar" ConceptLink="http://cdb.iso.org/lg/CDB-00133755-001">bfr</item>
+                                    <item AppInfo="Southern Bai" ConceptLink="http://cdb.iso.org/lg/CDB-00133745-001">bfs</item>
+                                    <item AppInfo="Balti" ConceptLink="http://cdb.iso.org/lg/CDB-00133744-001">bft</item>
+                                    <item AppInfo="Gahri" ConceptLink="http://cdb.iso.org/lg/CDB-00133743-001">bfu</item>
+                                    <item AppInfo="Bondo" ConceptLink="http://cdb.iso.org/lg/CDB-00133742-001">bfw</item>
+                                    <item AppInfo="Bagheli" ConceptLink="http://cdb.iso.org/lg/CDB-00133741-001">bfy</item>
+                                    <item AppInfo="Mahasu Pahari" ConceptLink="http://cdb.iso.org/lg/CDB-00133803-001">bfz</item>
+                                    <item AppInfo="Gwamhi-Wuri" ConceptLink="http://cdb.iso.org/lg/CDB-00133853-001">bga</item>
+                                    <item AppInfo="Bobongko" ConceptLink="http://cdb.iso.org/lg/CDB-00133773-001">bgb</item>
+                                    <item AppInfo="Haryanvi" ConceptLink="http://cdb.iso.org/lg/CDB-00133835-001">bgc</item>
+                                    <item AppInfo="Rathwi Bareli" ConceptLink="http://cdb.iso.org/lg/CDB-00133834-001">bgd</item>
+                                    <item AppInfo="Bauria" ConceptLink="http://cdb.iso.org/lg/CDB-00133833-001">bge</item>
+                                    <item AppInfo="Bangandu" ConceptLink="http://cdb.iso.org/lg/CDB-00133832-001">bgf</item>
+                                    <item AppInfo="Bugun" ConceptLink="http://cdb.iso.org/lg/CDB-00133831-001">bgg</item>
+                                    <item AppInfo="Giangan" ConceptLink="http://cdb.iso.org/lg/CDB-00133822-001">bgi</item>
+                                    <item AppInfo="Bangolan" ConceptLink="http://cdb.iso.org/lg/CDB-00133829-001">bgj</item>
+                                    <item AppInfo="Bit" ConceptLink="http://cdb.iso.org/lg/CDB-00133837-001">bgk</item>
+                                    <item AppInfo="Bo" ConceptLink="http://cdb.iso.org/lg/CDB-00133827-001">bgl</item>
+                                    <item AppInfo="Baga Mboteni" ConceptLink="http://cdb.iso.org/lg/CDB-00133826-001">bgm</item>
+                                    <item AppInfo="Western Balochi" ConceptLink="http://cdb.iso.org/lg/CDB-00133825-001">bgn</item>
+                                    <item AppInfo="Baga Koga" ConceptLink="http://cdb.iso.org/lg/CDB-00133824-001">bgo</item>
+                                    <item AppInfo="Eastern Balochi" ConceptLink="http://cdb.iso.org/lg/CDB-00133823-001">bgp</item>
+                                    <item AppInfo="Bagri" ConceptLink="http://cdb.iso.org/lg/CDB-00133845-001">bgq</item>
+                                    <item AppInfo="Bawm Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133847-001">bgr</item>
+                                    <item AppInfo="Tagabawa" ConceptLink="http://cdb.iso.org/lg/CDB-00133830-001">bgs</item>
+                                    <item AppInfo="Bughotu" ConceptLink="http://cdb.iso.org/lg/CDB-00133852-001">bgt</item>
+                                    <item AppInfo="Mbongno" ConceptLink="http://cdb.iso.org/lg/CDB-00133851-001">bgu</item>
+                                    <item AppInfo="Warkay-Bipim" ConceptLink="http://cdb.iso.org/lg/CDB-00133850-001">bgv</item>
+                                    <item AppInfo="Bhatri" ConceptLink="http://cdb.iso.org/lg/CDB-00133849-001">bgw</item>
+                                    <item AppInfo="Balkan Gagauz Turkish" ConceptLink="http://cdb.iso.org/lg/CDB-00133848-001">bgx</item>
+                                    <item AppInfo="Benggoi" ConceptLink="http://cdb.iso.org/lg/CDB-00133838-001">bgy</item>
+                                    <item AppInfo="Banggai" ConceptLink="http://cdb.iso.org/lg/CDB-00133846-001">bgz</item>
+                                    <item AppInfo="Bharia" ConceptLink="http://cdb.iso.org/lg/CDB-00133854-001">bha</item>
+                                    <item AppInfo="Bhili" ConceptLink="http://cdb.iso.org/lg/CDB-00133844-001">bhb</item>
+                                    <item AppInfo="Biga" ConceptLink="http://cdb.iso.org/lg/CDB-00133843-001">bhc</item>
+                                    <item AppInfo="Bhadrawahi" ConceptLink="http://cdb.iso.org/lg/CDB-00133842-001">bhd</item>
+                                    <item AppInfo="Bhaya" ConceptLink="http://cdb.iso.org/lg/CDB-00133841-001">bhe</item>
+                                    <item AppInfo="Odiai" ConceptLink="http://cdb.iso.org/lg/CDB-00133840-001">bhf</item>
+                                    <item AppInfo="Binandere" ConceptLink="http://cdb.iso.org/lg/CDB-00133839-001">bhg</item>
+                                    <item AppInfo="Bukharic" ConceptLink="http://cdb.iso.org/lg/CDB-00133820-001">bhh</item>
+                                    <item AppInfo="Bhilali" ConceptLink="http://cdb.iso.org/lg/CDB-00133795-001">bhi</item>
+                                    <item AppInfo="Bahing" ConceptLink="http://cdb.iso.org/lg/CDB-00133828-001">bhj</item>
+                                    <item AppInfo="Albay Bicolano" ConceptLink="http://cdb.iso.org/lg/CDB-00133802-001">bhk</item>
+                                    <item AppInfo="Bimin" ConceptLink="http://cdb.iso.org/lg/CDB-00133801-001">bhl</item>
+                                    <item AppInfo="Bathari" ConceptLink="http://cdb.iso.org/lg/CDB-00133800-001">bhm</item>
+                                    <item AppInfo="Bohtan Neo-Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00133799-001">bhn</item>
+                                    <item AppInfo="Bhojpuri" ConceptLink="http://cdb.iso.org/lg/CDB-00133798-001">bho</item>
+                                    <item AppInfo="Bima" ConceptLink="http://cdb.iso.org/lg/CDB-00133789-001">bhp</item>
+                                    <item AppInfo="Tukang Besi South" ConceptLink="http://cdb.iso.org/lg/CDB-00133796-001">bhq</item>
+                                    <item AppInfo="Bara Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00133804-001">bhr</item>
+                                    <item AppInfo="Buwal" ConceptLink="http://cdb.iso.org/lg/CDB-00133794-001">bhs</item>
+                                    <item AppInfo="Bhattiyali" ConceptLink="http://cdb.iso.org/lg/CDB-00133793-001">bht</item>
+                                    <item AppInfo="Bhunjia" ConceptLink="http://cdb.iso.org/lg/CDB-00133792-001">bhu</item>
+                                    <item AppInfo="Bahau" ConceptLink="http://cdb.iso.org/lg/CDB-00133791-001">bhv</item>
+                                    <item AppInfo="Biak" ConceptLink="http://cdb.iso.org/lg/CDB-00133790-001">bhw</item>
+                                    <item AppInfo="Bhalay" ConceptLink="http://cdb.iso.org/lg/CDB-00133812-001">bhx</item>
+                                    <item AppInfo="Bhele" ConceptLink="http://cdb.iso.org/lg/CDB-00133814-001">bhy</item>
+                                    <item AppInfo="Bada" ConceptLink="http://cdb.iso.org/lg/CDB-00133797-001">bhz</item>
+                                    <item AppInfo="Badimaya" ConceptLink="http://cdb.iso.org/lg/CDB-00133819-001">bia</item>
+                                    <item AppInfo="Bissa" ConceptLink="http://cdb.iso.org/lg/CDB-00133818-001">bib</item>
+                                    <item AppInfo="Bikaru" ConceptLink="http://cdb.iso.org/lg/CDB-00133817-001">bic</item>
+                                    <item AppInfo="Bidiyo" ConceptLink="http://cdb.iso.org/lg/CDB-00133816-001">bid</item>
+                                    <item AppInfo="Bepour" ConceptLink="http://cdb.iso.org/lg/CDB-00133815-001">bie</item>
+                                    <item AppInfo="Biafada" ConceptLink="http://cdb.iso.org/lg/CDB-00133805-001">bif</item>
+                                    <item AppInfo="Biangai" ConceptLink="http://cdb.iso.org/lg/CDB-00133813-001">big</item>
+                                    <item AppInfo="Vaghat-Ya-Bijim-Legeri" ConceptLink="http://cdb.iso.org/lg/CDB-00133821-001">bij</item>
+                                    <item AppInfo="Bikol" ConceptLink="http://cdb.iso.org/lg/CDB-00130981-001">bik</item>
+                                    <item AppInfo="Bile" ConceptLink="http://cdb.iso.org/lg/CDB-00133811-001">bil</item>
+                                    <item AppInfo="Bimoba" ConceptLink="http://cdb.iso.org/lg/CDB-00133810-001">bim</item>
+                                    <item AppInfo="Bini; Edo" ConceptLink="http://cdb.iso.org/lg/CDB-00133809-001">bin</item>
+                                    <item AppInfo="Nai" ConceptLink="http://cdb.iso.org/lg/CDB-00133808-001">bio</item>
+                                    <item AppInfo="Bila" ConceptLink="http://cdb.iso.org/lg/CDB-00133807-001">bip</item>
+                                    <item AppInfo="Bipi" ConceptLink="http://cdb.iso.org/lg/CDB-00133708-001">biq</item>
+                                    <item AppInfo="Bisorio" ConceptLink="http://cdb.iso.org/lg/CDB-00133836-001">bir</item>
+                                    <item AppInfo="Bislama" ConceptLink="http://cdb.iso.org/lg/CDB-00138481-001">bis</item>
+                                    <item AppInfo="Berinomo" ConceptLink="http://cdb.iso.org/lg/CDB-00133725-001">bit</item>
+                                    <item AppInfo="Biete" ConceptLink="http://cdb.iso.org/lg/CDB-00133640-001">biu</item>
+                                    <item AppInfo="Southern Birifor" ConceptLink="http://cdb.iso.org/lg/CDB-00133639-001">biv</item>
+                                    <item AppInfo="Kol" ConceptLink="http://cdb.iso.org/lg/CDB-00133638-001">biw</item>
+                                    <item AppInfo="Bijori" ConceptLink="http://cdb.iso.org/lg/CDB-00133637-001">bix</item>
+                                    <item AppInfo="Birhor" ConceptLink="http://cdb.iso.org/lg/CDB-00133636-001">biy</item>
+                                    <item AppInfo="Baloi" ConceptLink="http://cdb.iso.org/lg/CDB-00133635-001">biz</item>
+                                    <item AppInfo="Budza" ConceptLink="http://cdb.iso.org/lg/CDB-00133626-001">bja</item>
+                                    <item AppInfo="Banggarla" ConceptLink="http://cdb.iso.org/lg/CDB-00137987-001">bjb</item>
+                                    <item AppInfo="Bariji" ConceptLink="http://cdb.iso.org/lg/CDB-00133633-001">bjc</item>
+                                    <item AppInfo="Bandjigali" ConceptLink="http://cdb.iso.org/lg/CDB-00133641-001">bjd</item>
+                                    <item AppInfo="Biao-Jiao Mien" ConceptLink="http://cdb.iso.org/lg/CDB-00133631-001">bje</item>
+                                    <item AppInfo="Barzani Jewish Neo-Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00133630-001">bjf</item>
+                                    <item AppInfo="Bidyogo" ConceptLink="http://cdb.iso.org/lg/CDB-00133629-001">bjg</item>
+                                    <item AppInfo="Bahinemo" ConceptLink="http://cdb.iso.org/lg/CDB-00133628-001">bjh</item>
+                                    <item AppInfo="Burji" ConceptLink="http://cdb.iso.org/lg/CDB-00133627-001">bji</item>
+                                    <item AppInfo="Kanauji" ConceptLink="http://cdb.iso.org/lg/CDB-00133649-001">bjj</item>
+                                    <item AppInfo="Barok" ConceptLink="http://cdb.iso.org/lg/CDB-00133651-001">bjk</item>
+                                    <item AppInfo="Bulu" ConceptLink="http://cdb.iso.org/lg/CDB-00133634-001">bjl</item>
+                                    <item AppInfo="Bajelani" ConceptLink="http://cdb.iso.org/lg/CDB-00133656-001">bjm</item>
+                                    <item AppInfo="Banjar" ConceptLink="http://cdb.iso.org/lg/CDB-00133655-001">bjn</item>
+                                    <item AppInfo="Mid-Southern Banda" ConceptLink="http://cdb.iso.org/lg/CDB-00133654-001">bjo</item>
+                                    <item AppInfo="Southern Betsimisaraka Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00133653-001">bjq</item>
+                                    <item AppInfo="Binumarien" ConceptLink="http://cdb.iso.org/lg/CDB-00133652-001">bjr</item>
+                                    <item AppInfo="Bajan" ConceptLink="http://cdb.iso.org/lg/CDB-00133642-001">bjs</item>
+                                    <item AppInfo="Balanta-Ganja" ConceptLink="http://cdb.iso.org/lg/CDB-00133650-001">bjt</item>
+                                    <item AppInfo="Busuu" ConceptLink="http://cdb.iso.org/lg/CDB-00133658-001">bju</item>
+                                    <item AppInfo="Bedjond" ConceptLink="http://cdb.iso.org/lg/CDB-00133648-001">bjv</item>
+                                    <item AppInfo="BakwÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00133647-001">bjw</item>
+                                    <item AppInfo="Banao Itneg" ConceptLink="http://cdb.iso.org/lg/CDB-00133646-001">bjx</item>
+                                    <item AppInfo="Bayali" ConceptLink="http://cdb.iso.org/lg/CDB-00138103-001">bjy</item>
+                                    <item AppInfo="Baruga" ConceptLink="http://cdb.iso.org/lg/CDB-00133645-001">bjz</item>
+                                    <item AppInfo="Kyak" ConceptLink="http://cdb.iso.org/lg/CDB-00133644-001">bka</item>
+                                    <item AppInfo="Finallig" ConceptLink="http://cdb.iso.org/lg/CDB-00133618-001">bkb</item>
+                                    <item AppInfo="Baka" ConceptLink="http://cdb.iso.org/lg/CDB-00133657-001">bkc</item>
+                                    <item AppInfo="Binukid" ConceptLink="http://cdb.iso.org/lg/CDB-00133632-001">bkd</item>
+                                    <item AppInfo="Beeke" ConceptLink="http://cdb.iso.org/lg/CDB-00133608-001">bkf</item>
+                                    <item AppInfo="Buraka" ConceptLink="http://cdb.iso.org/lg/CDB-00133607-001">bkg</item>
+                                    <item AppInfo="Bakoko" ConceptLink="http://cdb.iso.org/lg/CDB-00133606-001">bkh</item>
+                                    <item AppInfo="Baki" ConceptLink="http://cdb.iso.org/lg/CDB-00133605-001">bki</item>
+                                    <item AppInfo="Pande" ConceptLink="http://cdb.iso.org/lg/CDB-00133604-001">bkj</item>
+                                    <item AppInfo="Brokskat" ConceptLink="http://cdb.iso.org/lg/CDB-00133603-001">bkk</item>
+                                    <item AppInfo="Berik" ConceptLink="http://cdb.iso.org/lg/CDB-00133594-001">bkl</item>
+                                    <item AppInfo="Kom" ConceptLink="http://cdb.iso.org/lg/CDB-00133601-001">bkm</item>
+                                    <item AppInfo="Bukitan" ConceptLink="http://cdb.iso.org/lg/CDB-00133609-001">bkn</item>
+                                    <item AppInfo="Kwa'" ConceptLink="http://cdb.iso.org/lg/CDB-00133599-001">bko</item>
+                                    <item AppInfo="Boko" ConceptLink="http://cdb.iso.org/lg/CDB-00133598-001">bkp</item>
+                                    <item AppInfo="BakairÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00133597-001">bkq</item>
+                                    <item AppInfo="Bakumpai" ConceptLink="http://cdb.iso.org/lg/CDB-00133596-001">bkr</item>
+                                    <item AppInfo="Masbate Sorsogon" ConceptLink="http://cdb.iso.org/lg/CDB-00133616-001">bks</item>
+                                    <item AppInfo="Boloki" ConceptLink="http://cdb.iso.org/lg/CDB-00133600-001">bkt</item>
+                                    <item AppInfo="Buhid" ConceptLink="http://cdb.iso.org/lg/CDB-00133602-001">bku</item>
+                                    <item AppInfo="Bekwarra" ConceptLink="http://cdb.iso.org/lg/CDB-00133624-001">bkv</item>
+                                    <item AppInfo="Bekwil" ConceptLink="http://cdb.iso.org/lg/CDB-00133623-001">bkw</item>
+                                    <item AppInfo="Baikeno" ConceptLink="http://cdb.iso.org/lg/CDB-00133622-001">bkx</item>
+                                    <item AppInfo="Bokyi" ConceptLink="http://cdb.iso.org/lg/CDB-00133621-001">bky</item>
+                                    <item AppInfo="Bungku" ConceptLink="http://cdb.iso.org/lg/CDB-00133620-001">bkz</item>
+                                    <item AppInfo="Siksika" ConceptLink="http://cdb.iso.org/lg/CDB-00133619-001">bla</item>
+                                    <item AppInfo="Bilua" ConceptLink="http://cdb.iso.org/lg/CDB-00133610-001">blb</item>
+                                    <item AppInfo="Bella Coola" ConceptLink="http://cdb.iso.org/lg/CDB-00133617-001">blc</item>
+                                    <item AppInfo="Bolango" ConceptLink="http://cdb.iso.org/lg/CDB-00133625-001">bld</item>
+                                    <item AppInfo="Balanta-Kentohe" ConceptLink="http://cdb.iso.org/lg/CDB-00133615-001">ble</item>
+                                    <item AppInfo="Buol" ConceptLink="http://cdb.iso.org/lg/CDB-00133614-001">blf</item>
+                                    <item AppInfo="Balau" ConceptLink="http://cdb.iso.org/lg/CDB-00133613-001">blg</item>
+                                    <item AppInfo="Kuwaa" ConceptLink="http://cdb.iso.org/lg/CDB-00133612-001">blh</item>
+                                    <item AppInfo="Bolia" ConceptLink="http://cdb.iso.org/lg/CDB-00133660-001">bli</item>
+                                    <item AppInfo="Bolongan" ConceptLink="http://cdb.iso.org/lg/CDB-00133595-001">blj</item>
+                                    <item AppInfo="Pa'o Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00133643-001">blk</item>
+                                    <item AppInfo="Biloxi" ConceptLink="http://cdb.iso.org/lg/CDB-00138312-001">bll</item>
+                                    <item AppInfo="Beli" ConceptLink="http://cdb.iso.org/lg/CDB-00133705-001">blm</item>
+                                    <item AppInfo="Southern Catanduanes Bicolano" ConceptLink="http://cdb.iso.org/lg/CDB-00133704-001">bln</item>
+                                    <item AppInfo="Anii" ConceptLink="http://cdb.iso.org/lg/CDB-00133703-001">blo</item>
+                                    <item AppInfo="Blablanga" ConceptLink="http://cdb.iso.org/lg/CDB-00133702-001">blp</item>
+                                    <item AppInfo="Baluan-Pam" ConceptLink="http://cdb.iso.org/lg/CDB-00133701-001">blq</item>
+                                    <item AppInfo="Blang" ConceptLink="http://cdb.iso.org/lg/CDB-00133700-001">blr</item>
+                                    <item AppInfo="Balaesang" ConceptLink="http://cdb.iso.org/lg/CDB-00133691-001">bls</item>
+                                    <item AppInfo="Tai Dam" ConceptLink="http://cdb.iso.org/lg/CDB-00133698-001">blt</item>
+                                    <item AppInfo="Bolo" ConceptLink="http://cdb.iso.org/lg/CDB-00133706-001">blv</item>
+                                    <item AppInfo="Balangao" ConceptLink="http://cdb.iso.org/lg/CDB-00133696-001">blw</item>
+                                    <item AppInfo="Mag-Indi Ayta" ConceptLink="http://cdb.iso.org/lg/CDB-00133695-001">blx</item>
+                                    <item AppInfo="Notre" ConceptLink="http://cdb.iso.org/lg/CDB-00133694-001">bly</item>
+                                    <item AppInfo="Balantak" ConceptLink="http://cdb.iso.org/lg/CDB-00133693-001">blz</item>
+                                    <item AppInfo="Lame" ConceptLink="http://cdb.iso.org/lg/CDB-00133692-001">bma</item>
+                                    <item AppInfo="Bembe" ConceptLink="http://cdb.iso.org/lg/CDB-00133714-001">bmb</item>
+                                    <item AppInfo="Biem" ConceptLink="http://cdb.iso.org/lg/CDB-00133716-001">bmc</item>
+                                    <item AppInfo="Baga Manduri" ConceptLink="http://cdb.iso.org/lg/CDB-00133699-001">bmd</item>
+                                    <item AppInfo="Limassa" ConceptLink="http://cdb.iso.org/lg/CDB-00133721-001">bme</item>
+                                    <item AppInfo="Bom" ConceptLink="http://cdb.iso.org/lg/CDB-00133720-001">bmf</item>
+                                    <item AppInfo="Bamwe" ConceptLink="http://cdb.iso.org/lg/CDB-00133719-001">bmg</item>
+                                    <item AppInfo="Kein" ConceptLink="http://cdb.iso.org/lg/CDB-00133718-001">bmh</item>
+                                    <item AppInfo="Bagirmi" ConceptLink="http://cdb.iso.org/lg/CDB-00133717-001">bmi</item>
+                                    <item AppInfo="Bote-Majhi" ConceptLink="http://cdb.iso.org/lg/CDB-00133707-001">bmj</item>
+                                    <item AppInfo="Ghayavi" ConceptLink="http://cdb.iso.org/lg/CDB-00133715-001">bmk</item>
+                                    <item AppInfo="Bomboli" ConceptLink="http://cdb.iso.org/lg/CDB-00133723-001">bml</item>
+                                    <item AppInfo="Northern Betsimisaraka Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00133713-001">bmm</item>
+                                    <item AppInfo="Bina" ConceptLink="http://cdb.iso.org/lg/CDB-00138171-001">bmn</item>
+                                    <item AppInfo="Bambalang" ConceptLink="http://cdb.iso.org/lg/CDB-00133712-001">bmo</item>
+                                    <item AppInfo="Bulgebi" ConceptLink="http://cdb.iso.org/lg/CDB-00133711-001">bmp</item>
+                                    <item AppInfo="Bomu" ConceptLink="http://cdb.iso.org/lg/CDB-00133710-001">bmq</item>
+                                    <item AppInfo="Muinane" ConceptLink="http://cdb.iso.org/lg/CDB-00133709-001">bmr</item>
+                                    <item AppInfo="Bilma Kanuri" ConceptLink="http://cdb.iso.org/lg/CDB-00133683-001">bms</item>
+                                    <item AppInfo="Biao Mon" ConceptLink="http://cdb.iso.org/lg/CDB-00133722-001">bmt</item>
+                                    <item AppInfo="Burum-Mindik" ConceptLink="http://cdb.iso.org/lg/CDB-00133697-001">bmu</item>
+                                    <item AppInfo="Bum" ConceptLink="http://cdb.iso.org/lg/CDB-00133673-001">bmv</item>
+                                    <item AppInfo="Bomwali" ConceptLink="http://cdb.iso.org/lg/CDB-00133672-001">bmw</item>
+                                    <item AppInfo="Baimak" ConceptLink="http://cdb.iso.org/lg/CDB-00133671-001">bmx</item>
+                                    <item AppInfo="Bemba" ConceptLink="http://cdb.iso.org/lg/CDB-00133670-001">bmy</item>
+                                    <item AppInfo="Baramu" ConceptLink="http://cdb.iso.org/lg/CDB-00133669-001">bmz</item>
+                                    <item AppInfo="Bonerate" ConceptLink="http://cdb.iso.org/lg/CDB-00133668-001">bna</item>
+                                    <item AppInfo="Bookan" ConceptLink="http://cdb.iso.org/lg/CDB-00133659-001">bnb</item>
+                                    <item AppInfo="Central Bontoc" ConceptLink="http://cdb.iso.org/lg/CDB-00133666-001">bnc</item>
+                                    <item AppInfo="Banda" ConceptLink="http://cdb.iso.org/lg/CDB-00133674-001">bnd</item>
+                                    <item AppInfo="Bintauna" ConceptLink="http://cdb.iso.org/lg/CDB-00133664-001">bne</item>
+                                    <item AppInfo="Masiwang" ConceptLink="http://cdb.iso.org/lg/CDB-00133663-001">bnf</item>
+                                    <item AppInfo="Benga" ConceptLink="http://cdb.iso.org/lg/CDB-00133662-001">bng</item>
+                                    <item AppInfo="Bangi" ConceptLink="http://cdb.iso.org/lg/CDB-00133661-001">bni</item>
+                                    <item AppInfo="Eastern Tawbuid" ConceptLink="http://cdb.iso.org/lg/CDB-00133681-001">bnj</item>
+                                    <item AppInfo="Bierebo" ConceptLink="http://cdb.iso.org/lg/CDB-00133665-001">bnk</item>
+                                    <item AppInfo="Boon" ConceptLink="http://cdb.iso.org/lg/CDB-00133667-001">bnl</item>
+                                    <item AppInfo="Batanga" ConceptLink="http://cdb.iso.org/lg/CDB-00133689-001">bnm</item>
+                                    <item AppInfo="Bunun" ConceptLink="http://cdb.iso.org/lg/CDB-00133688-001">bnn</item>
+                                    <item AppInfo="Bantoanon" ConceptLink="http://cdb.iso.org/lg/CDB-00133687-001">bno</item>
+                                    <item AppInfo="Bola" ConceptLink="http://cdb.iso.org/lg/CDB-00133686-001">bnp</item>
+                                    <item AppInfo="Bantik" ConceptLink="http://cdb.iso.org/lg/CDB-00133685-001">bnq</item>
+                                    <item AppInfo="Butmas-Tur" ConceptLink="http://cdb.iso.org/lg/CDB-00133684-001">bnr</item>
+                                    <item AppInfo="Bundeli" ConceptLink="http://cdb.iso.org/lg/CDB-00133675-001">bns</item>
+                                    <item AppInfo="Bentong" ConceptLink="http://cdb.iso.org/lg/CDB-00133682-001">bnu</item>
+                                    <item AppInfo="Bonerif" ConceptLink="http://cdb.iso.org/lg/CDB-00133690-001">bnv</item>
+                                    <item AppInfo="Bisis" ConceptLink="http://cdb.iso.org/lg/CDB-00133680-001">bnw</item>
+                                    <item AppInfo="Bangubangu" ConceptLink="http://cdb.iso.org/lg/CDB-00133679-001">bnx</item>
+                                    <item AppInfo="Bintulu" ConceptLink="http://cdb.iso.org/lg/CDB-00133678-001">bny</item>
+                                    <item AppInfo="Beezen" ConceptLink="http://cdb.iso.org/lg/CDB-00133677-001">bnz</item>
+                                    <item AppInfo="Bora" ConceptLink="http://cdb.iso.org/lg/CDB-00133872-001">boa</item>
+                                    <item AppInfo="Aweer" ConceptLink="http://cdb.iso.org/lg/CDB-00133611-001">bob</item>
+                                    <item AppInfo="Tibetan" ConceptLink="http://cdb.iso.org/lg/CDB-00138484-001">bod</item>
+                                    <item AppInfo="Mundabli" ConceptLink="http://cdb.iso.org/lg/CDB-00133806-001">boe</item>
+                                    <item AppInfo="Bolon" ConceptLink="http://cdb.iso.org/lg/CDB-00134031-001">bof</item>
+                                    <item AppInfo="Bamako Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134030-001">bog</item>
+                                    <item AppInfo="Boma" ConceptLink="http://cdb.iso.org/lg/CDB-00134029-001">boh</item>
+                                    <item AppInfo="BarbareÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00138223-001">boi</item>
+                                    <item AppInfo="Anjam" ConceptLink="http://cdb.iso.org/lg/CDB-00134028-001">boj</item>
+                                    <item AppInfo="Bonjo" ConceptLink="http://cdb.iso.org/lg/CDB-00134027-001">bok</item>
+                                    <item AppInfo="Bole" ConceptLink="http://cdb.iso.org/lg/CDB-00134026-001">bol</item>
+                                    <item AppInfo="Berom" ConceptLink="http://cdb.iso.org/lg/CDB-00134017-001">bom</item>
+                                    <item AppInfo="Bine" ConceptLink="http://cdb.iso.org/lg/CDB-00134024-001">bon</item>
+                                    <item AppInfo="TiemacÃšwÃš Bozo" ConceptLink="http://cdb.iso.org/lg/CDB-00134032-001">boo</item>
+                                    <item AppInfo="Bonkiman" ConceptLink="http://cdb.iso.org/lg/CDB-00134022-001">bop</item>
+                                    <item AppInfo="Bogaya" ConceptLink="http://cdb.iso.org/lg/CDB-00134021-001">boq</item>
+                                    <item AppInfo="BorÃŽro" ConceptLink="http://cdb.iso.org/lg/CDB-00134020-001">bor</item>
+                                    <item AppInfo="Bosnian" ConceptLink="http://cdb.iso.org/lg/CDB-00138486-001">bos</item>
+                                    <item AppInfo="Bongo" ConceptLink="http://cdb.iso.org/lg/CDB-00134019-001">bot</item>
+                                    <item AppInfo="Bondei" ConceptLink="http://cdb.iso.org/lg/CDB-00134018-001">bou</item>
+                                    <item AppInfo="Tuwuli" ConceptLink="http://cdb.iso.org/lg/CDB-00134040-001">bov</item>
+                                    <item AppInfo="Rema" ConceptLink="http://cdb.iso.org/lg/CDB-00138190-001">bow</item>
+                                    <item AppInfo="Buamu" ConceptLink="http://cdb.iso.org/lg/CDB-00134042-001">box</item>
+                                    <item AppInfo="Bodo" ConceptLink="http://cdb.iso.org/lg/CDB-00134025-001">boy</item>
+                                    <item AppInfo="TiÃ©yaxo Bozo" ConceptLink="http://cdb.iso.org/lg/CDB-00134047-001">boz</item>
+                                    <item AppInfo="Dakaka" ConceptLink="http://cdb.iso.org/lg/CDB-00134046-001">bpa</item>
+                                    <item AppInfo="Barbacoas" ConceptLink="http://cdb.iso.org/lg/CDB-00138203-001">bpb</item>
+                                    <item AppInfo="Banda-Banda" ConceptLink="http://cdb.iso.org/lg/CDB-00134045-001">bpd</item>
+                                    <item AppInfo="Bonggo" ConceptLink="http://cdb.iso.org/lg/CDB-00134044-001">bpg</item>
+                                    <item AppInfo="Botlikh" ConceptLink="http://cdb.iso.org/lg/CDB-00134043-001">bph</item>
+                                    <item AppInfo="Bagupi" ConceptLink="http://cdb.iso.org/lg/CDB-00134033-001">bpi</item>
+                                    <item AppInfo="Binji" ConceptLink="http://cdb.iso.org/lg/CDB-00134041-001">bpj</item>
+                                    <item AppInfo="Orowe" ConceptLink="http://cdb.iso.org/lg/CDB-00134049-001">bpk</item>
+                                    <item AppInfo="Broome Pearling Lugger Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00134039-001">bpl</item>
+                                    <item AppInfo="Biyom" ConceptLink="http://cdb.iso.org/lg/CDB-00134038-001">bpm</item>
+                                    <item AppInfo="Dzao Min" ConceptLink="http://cdb.iso.org/lg/CDB-00134037-001">bpn</item>
+                                    <item AppInfo="Anasi" ConceptLink="http://cdb.iso.org/lg/CDB-00134036-001">bpo</item>
+                                    <item AppInfo="Kaure" ConceptLink="http://cdb.iso.org/lg/CDB-00134035-001">bpp</item>
+                                    <item AppInfo="Banda Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00134009-001">bpq</item>
+                                    <item AppInfo="Koronadal Blaan" ConceptLink="http://cdb.iso.org/lg/CDB-00134048-001">bpr</item>
+                                    <item AppInfo="Sarangani Blaan" ConceptLink="http://cdb.iso.org/lg/CDB-00134023-001">bps</item>
+                                    <item AppInfo="Barrow Point" ConceptLink="http://cdb.iso.org/lg/CDB-00133999-001">bpt</item>
+                                    <item AppInfo="Bongu" ConceptLink="http://cdb.iso.org/lg/CDB-00133998-001">bpu</item>
+                                    <item AppInfo="Bian Marind" ConceptLink="http://cdb.iso.org/lg/CDB-00133997-001">bpv</item>
+                                    <item AppInfo="Bo" ConceptLink="http://cdb.iso.org/lg/CDB-00133996-001">bpw</item>
+                                    <item AppInfo="Palya Bareli" ConceptLink="http://cdb.iso.org/lg/CDB-00133995-001">bpx</item>
+                                    <item AppInfo="Bishnupriya" ConceptLink="http://cdb.iso.org/lg/CDB-00133994-001">bpy</item>
+                                    <item AppInfo="Bilba" ConceptLink="http://cdb.iso.org/lg/CDB-00133985-001">bpz</item>
+                                    <item AppInfo="Tchumbuli" ConceptLink="http://cdb.iso.org/lg/CDB-00133992-001">bqa</item>
+                                    <item AppInfo="Bagusa" ConceptLink="http://cdb.iso.org/lg/CDB-00134000-001">bqb</item>
+                                    <item AppInfo="Boko" ConceptLink="http://cdb.iso.org/lg/CDB-00133990-001">bqc</item>
+                                    <item AppInfo="Bung" ConceptLink="http://cdb.iso.org/lg/CDB-00133989-001">bqd</item>
+                                    <item AppInfo="Baga Kaloum" ConceptLink="http://cdb.iso.org/lg/CDB-00138235-001">bqf</item>
+                                    <item AppInfo="Bago-Kusuntu" ConceptLink="http://cdb.iso.org/lg/CDB-00133988-001">bqg</item>
+                                    <item AppInfo="Baima" ConceptLink="http://cdb.iso.org/lg/CDB-00133987-001">bqh</item>
+                                    <item AppInfo="Bakhtiari" ConceptLink="http://cdb.iso.org/lg/CDB-00134007-001">bqi</item>
+                                    <item AppInfo="Bandial" ConceptLink="http://cdb.iso.org/lg/CDB-00133991-001">bqj</item>
+                                    <item AppInfo="Banda-MbrÃšs" ConceptLink="http://cdb.iso.org/lg/CDB-00133993-001">bqk</item>
+                                    <item AppInfo="Bilakura" ConceptLink="http://cdb.iso.org/lg/CDB-00134015-001">bql</item>
+                                    <item AppInfo="Wumboko" ConceptLink="http://cdb.iso.org/lg/CDB-00134014-001">bqm</item>
+                                    <item AppInfo="Bulgarian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134013-001">bqn</item>
+                                    <item AppInfo="Balo" ConceptLink="http://cdb.iso.org/lg/CDB-00134012-001">bqo</item>
+                                    <item AppInfo="Busa" ConceptLink="http://cdb.iso.org/lg/CDB-00134011-001">bqp</item>
+                                    <item AppInfo="Biritai" ConceptLink="http://cdb.iso.org/lg/CDB-00134010-001">bqq</item>
+                                    <item AppInfo="Burusu" ConceptLink="http://cdb.iso.org/lg/CDB-00134001-001">bqr</item>
+                                    <item AppInfo="Bosngun" ConceptLink="http://cdb.iso.org/lg/CDB-00134008-001">bqs</item>
+                                    <item AppInfo="Bamukumbit" ConceptLink="http://cdb.iso.org/lg/CDB-00134016-001">bqt</item>
+                                    <item AppInfo="Boguru" ConceptLink="http://cdb.iso.org/lg/CDB-00134006-001">bqu</item>
+                                    <item AppInfo="Begbere-Ejar" ConceptLink="http://cdb.iso.org/lg/CDB-00134005-001">bqv</item>
+                                    <item AppInfo="Buru" ConceptLink="http://cdb.iso.org/lg/CDB-00134004-001">bqw</item>
+                                    <item AppInfo="Baangi" ConceptLink="http://cdb.iso.org/lg/CDB-00134003-001">bqx</item>
+                                    <item AppInfo="Bengkala Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134002-001">bqy</item>
+                                    <item AppInfo="Bakaka" ConceptLink="http://cdb.iso.org/lg/CDB-00134064-001">bqz</item>
+                                    <item AppInfo="Braj" ConceptLink="http://cdb.iso.org/lg/CDB-00134114-001">bra</item>
+                                    <item AppInfo="Lave" ConceptLink="http://cdb.iso.org/lg/CDB-00134034-001">brb</item>
+                                    <item AppInfo="Berbice Creole Dutch" ConceptLink="http://cdb.iso.org/lg/CDB-00134096-001">brc</item>
+                                    <item AppInfo="Baraamu" ConceptLink="http://cdb.iso.org/lg/CDB-00134095-001">brd</item>
+                                    <item AppInfo="Breton" ConceptLink="http://cdb.iso.org/lg/CDB-00138485-001">bre</item>
+                                    <item AppInfo="Bera" ConceptLink="http://cdb.iso.org/lg/CDB-00134094-001">brf</item>
+                                    <item AppInfo="Baure" ConceptLink="http://cdb.iso.org/lg/CDB-00134093-001">brg</item>
+                                    <item AppInfo="Brahui" ConceptLink="http://cdb.iso.org/lg/CDB-00134092-001">brh</item>
+                                    <item AppInfo="Mokpwe" ConceptLink="http://cdb.iso.org/lg/CDB-00134083-001">bri</item>
+                                    <item AppInfo="Bieria" ConceptLink="http://cdb.iso.org/lg/CDB-00134090-001">brj</item>
+                                    <item AppInfo="Birked" ConceptLink="http://cdb.iso.org/lg/CDB-00138134-001">brk</item>
+                                    <item AppInfo="Birwa" ConceptLink="http://cdb.iso.org/lg/CDB-00134098-001">brl</item>
+                                    <item AppInfo="Barambu" ConceptLink="http://cdb.iso.org/lg/CDB-00134088-001">brm</item>
+                                    <item AppInfo="Boruca" ConceptLink="http://cdb.iso.org/lg/CDB-00134087-001">brn</item>
+                                    <item AppInfo="Brokkat" ConceptLink="http://cdb.iso.org/lg/CDB-00134086-001">bro</item>
+                                    <item AppInfo="Barapasi" ConceptLink="http://cdb.iso.org/lg/CDB-00134085-001">brp</item>
+                                    <item AppInfo="Breri" ConceptLink="http://cdb.iso.org/lg/CDB-00134084-001">brq</item>
+                                    <item AppInfo="Birao" ConceptLink="http://cdb.iso.org/lg/CDB-00134106-001">brr</item>
+                                    <item AppInfo="Baras" ConceptLink="http://cdb.iso.org/lg/CDB-00134108-001">brs</item>
+                                    <item AppInfo="Bitare" ConceptLink="http://cdb.iso.org/lg/CDB-00134091-001">brt</item>
+                                    <item AppInfo="Eastern Bru" ConceptLink="http://cdb.iso.org/lg/CDB-00134113-001">bru</item>
+                                    <item AppInfo="Western Bru" ConceptLink="http://cdb.iso.org/lg/CDB-00134112-001">brv</item>
+                                    <item AppInfo="Bellari" ConceptLink="http://cdb.iso.org/lg/CDB-00134111-001">brw</item>
+                                    <item AppInfo="Bodo" ConceptLink="http://cdb.iso.org/lg/CDB-00134110-001">brx</item>
+                                    <item AppInfo="Burui" ConceptLink="http://cdb.iso.org/lg/CDB-00134109-001">bry</item>
+                                    <item AppInfo="Bilbil" ConceptLink="http://cdb.iso.org/lg/CDB-00134099-001">brz</item>
+                                    <item AppInfo="Abinomn" ConceptLink="http://cdb.iso.org/lg/CDB-00134107-001">bsa</item>
+                                    <item AppInfo="Brunei Bisaya" ConceptLink="http://cdb.iso.org/lg/CDB-00134115-001">bsb</item>
+                                    <item AppInfo="Bassari" ConceptLink="http://cdb.iso.org/lg/CDB-00134105-001">bsc</item>
+                                    <item AppInfo="Wushi" ConceptLink="http://cdb.iso.org/lg/CDB-00134104-001">bse</item>
+                                    <item AppInfo="Bauchi" ConceptLink="http://cdb.iso.org/lg/CDB-00134103-001">bsf</item>
+                                    <item AppInfo="Bashkardi" ConceptLink="http://cdb.iso.org/lg/CDB-00134102-001">bsg</item>
+                                    <item AppInfo="Kati" ConceptLink="http://cdb.iso.org/lg/CDB-00134101-001">bsh</item>
+                                    <item AppInfo="Bassossi" ConceptLink="http://cdb.iso.org/lg/CDB-00134100-001">bsi</item>
+                                    <item AppInfo="Bangwinji" ConceptLink="http://cdb.iso.org/lg/CDB-00134081-001">bsj</item>
+                                    <item AppInfo="Burushaski" ConceptLink="http://cdb.iso.org/lg/CDB-00134056-001">bsk</item>
+                                    <item AppInfo="Basa-Gumna" ConceptLink="http://cdb.iso.org/lg/CDB-00138165-001">bsl</item>
+                                    <item AppInfo="Busami" ConceptLink="http://cdb.iso.org/lg/CDB-00134089-001">bsm</item>
+                                    <item AppInfo="Barasana-Eduria" ConceptLink="http://cdb.iso.org/lg/CDB-00134063-001">bsn</item>
+                                    <item AppInfo="Buso" ConceptLink="http://cdb.iso.org/lg/CDB-00134062-001">bso</item>
+                                    <item AppInfo="Baga Sitemu" ConceptLink="http://cdb.iso.org/lg/CDB-00134061-001">bsp</item>
+                                    <item AppInfo="Bassa" ConceptLink="http://cdb.iso.org/lg/CDB-00134060-001">bsq</item>
+                                    <item AppInfo="Bassa-Kontagora" ConceptLink="http://cdb.iso.org/lg/CDB-00134059-001">bsr</item>
+                                    <item AppInfo="Akoose" ConceptLink="http://cdb.iso.org/lg/CDB-00134050-001">bss</item>
+                                    <item AppInfo="Basketo" ConceptLink="http://cdb.iso.org/lg/CDB-00134057-001">bst</item>
+                                    <item AppInfo="Bahonsuai" ConceptLink="http://cdb.iso.org/lg/CDB-00134065-001">bsu</item>
+                                    <item AppInfo="Baga SobanÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00138325-001">bsv</item>
+                                    <item AppInfo="Baiso" ConceptLink="http://cdb.iso.org/lg/CDB-00134055-001">bsw</item>
+                                    <item AppInfo="Yangkam" ConceptLink="http://cdb.iso.org/lg/CDB-00134054-001">bsx</item>
+                                    <item AppInfo="Sabah Bisaya" ConceptLink="http://cdb.iso.org/lg/CDB-00134053-001">bsy</item>
+                                    <item AppInfo="Bata" ConceptLink="http://cdb.iso.org/lg/CDB-00134052-001">bta</item>
+                                    <item AppInfo="Beti" ConceptLink="http://cdb.iso.org/lg/CDB-00134051-001">btb</item>
+                                    <item AppInfo="Bati" ConceptLink="http://cdb.iso.org/lg/CDB-00134073-001">btc</item>
+                                    <item AppInfo="Batak Dairi" ConceptLink="http://cdb.iso.org/lg/CDB-00134075-001">btd</item>
+                                    <item AppInfo="Gamo-Ningi" ConceptLink="http://cdb.iso.org/lg/CDB-00138343-001">bte</item>
+                                    <item AppInfo="Birgit" ConceptLink="http://cdb.iso.org/lg/CDB-00134058-001">btf</item>
+                                    <item AppInfo="Gagnoa BÃ©tÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134080-001">btg</item>
+                                    <item AppInfo="Biatah Bidayuh" ConceptLink="http://cdb.iso.org/lg/CDB-00134079-001">bth</item>
+                                    <item AppInfo="Burate" ConceptLink="http://cdb.iso.org/lg/CDB-00134078-001">bti</item>
+                                    <item AppInfo="Bacanese Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00134077-001">btj</item>
+                                    <item AppInfo="Bhatola" ConceptLink="http://cdb.iso.org/lg/CDB-00134076-001">btl</item>
+                                    <item AppInfo="Batak Mandailing" ConceptLink="http://cdb.iso.org/lg/CDB-00134066-001">btm</item>
+                                    <item AppInfo="Ratagnon" ConceptLink="http://cdb.iso.org/lg/CDB-00134074-001">btn</item>
+                                    <item AppInfo="Iriga Bicolano" ConceptLink="http://cdb.iso.org/lg/CDB-00134082-001">bto</item>
+                                    <item AppInfo="Budibud" ConceptLink="http://cdb.iso.org/lg/CDB-00134072-001">btp</item>
+                                    <item AppInfo="Batek" ConceptLink="http://cdb.iso.org/lg/CDB-00134071-001">btq</item>
+                                    <item AppInfo="Baetora" ConceptLink="http://cdb.iso.org/lg/CDB-00134070-001">btr</item>
+                                    <item AppInfo="Batak Simalungun" ConceptLink="http://cdb.iso.org/lg/CDB-00134069-001">bts</item>
+                                    <item AppInfo="Bete-Bendi" ConceptLink="http://cdb.iso.org/lg/CDB-00134068-001">btt</item>
+                                    <item AppInfo="Batu" ConceptLink="http://cdb.iso.org/lg/CDB-00133969-001">btu</item>
+                                    <item AppInfo="Bateri" ConceptLink="http://cdb.iso.org/lg/CDB-00134097-001">btv</item>
+                                    <item AppInfo="Butuanon" ConceptLink="http://cdb.iso.org/lg/CDB-00133986-001">btw</item>
+                                    <item AppInfo="Batak Karo" ConceptLink="http://cdb.iso.org/lg/CDB-00133901-001">btx</item>
+                                    <item AppInfo="Bobot" ConceptLink="http://cdb.iso.org/lg/CDB-00133900-001">bty</item>
+                                    <item AppInfo="Batak Alas-Kluet" ConceptLink="http://cdb.iso.org/lg/CDB-00133899-001">btz</item>
+                                    <item AppInfo="Buriat" ConceptLink="http://cdb.iso.org/lg/CDB-00130997-001">bua</item>
+                                    <item AppInfo="Bua" ConceptLink="http://cdb.iso.org/lg/CDB-00133898-001">bub</item>
+                                    <item AppInfo="Bushi" ConceptLink="http://cdb.iso.org/lg/CDB-00133897-001">buc</item>
+                                    <item AppInfo="Ntcham" ConceptLink="http://cdb.iso.org/lg/CDB-00133896-001">bud</item>
+                                    <item AppInfo="Beothuk" ConceptLink="http://cdb.iso.org/lg/CDB-00138047-001">bue</item>
+                                    <item AppInfo="Bushoong" ConceptLink="http://cdb.iso.org/lg/CDB-00133887-001">buf</item>
+                                    <item AppInfo="Buginese" ConceptLink="http://cdb.iso.org/lg/CDB-00133894-001">bug</item>
+                                    <item AppInfo="Younuo Bunu" ConceptLink="http://cdb.iso.org/lg/CDB-00133902-001">buh</item>
+                                    <item AppInfo="Bongili" ConceptLink="http://cdb.iso.org/lg/CDB-00133892-001">bui</item>
+                                    <item AppInfo="Basa-Gurmana" ConceptLink="http://cdb.iso.org/lg/CDB-00133891-001">buj</item>
+                                    <item AppInfo="Bugawac" ConceptLink="http://cdb.iso.org/lg/CDB-00133890-001">buk</item>
+                                    <item AppInfo="Bulgarian" ConceptLink="http://cdb.iso.org/lg/CDB-00138480-001">bul</item>
+                                    <item AppInfo="Bulu" ConceptLink="http://cdb.iso.org/lg/CDB-00134654-001">bum</item>
+                                    <item AppInfo="Sherbro" ConceptLink="http://cdb.iso.org/lg/CDB-00134849-001">bun</item>
+                                    <item AppInfo="Terei" ConceptLink="http://cdb.iso.org/lg/CDB-00135074-001">buo</item>
+                                    <item AppInfo="Busoa" ConceptLink="http://cdb.iso.org/lg/CDB-00135073-001">bup</item>
+                                    <item AppInfo="Brem" ConceptLink="http://cdb.iso.org/lg/CDB-00135072-001">buq</item>
+                                    <item AppInfo="Bokobaru" ConceptLink="http://cdb.iso.org/lg/CDB-00135071-001">bus</item>
+                                    <item AppInfo="Bungain" ConceptLink="http://cdb.iso.org/lg/CDB-00135070-001">but</item>
+                                    <item AppInfo="Budu" ConceptLink="http://cdb.iso.org/lg/CDB-00135069-001">buu</item>
+                                    <item AppInfo="Bun" ConceptLink="http://cdb.iso.org/lg/CDB-00135060-001">buv</item>
+                                    <item AppInfo="Bubi" ConceptLink="http://cdb.iso.org/lg/CDB-00135067-001">buw</item>
+                                    <item AppInfo="Boghom" ConceptLink="http://cdb.iso.org/lg/CDB-00135075-001">bux</item>
+                                    <item AppInfo="Bullom So" ConceptLink="http://cdb.iso.org/lg/CDB-00135065-001">buy</item>
+                                    <item AppInfo="Bukwen" ConceptLink="http://cdb.iso.org/lg/CDB-00135064-001">buz</item>
+                                    <item AppInfo="Barein" ConceptLink="http://cdb.iso.org/lg/CDB-00135063-001">bva</item>
+                                    <item AppInfo="Bube" ConceptLink="http://cdb.iso.org/lg/CDB-00135062-001">bvb</item>
+                                    <item AppInfo="Baelelea" ConceptLink="http://cdb.iso.org/lg/CDB-00135061-001">bvc</item>
+                                    <item AppInfo="Baeggu" ConceptLink="http://cdb.iso.org/lg/CDB-00135083-001">bvd</item>
+                                    <item AppInfo="Berau Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00135085-001">bve</item>
+                                    <item AppInfo="Boor" ConceptLink="http://cdb.iso.org/lg/CDB-00135068-001">bvf</item>
+                                    <item AppInfo="Bonkeng" ConceptLink="http://cdb.iso.org/lg/CDB-00135090-001">bvg</item>
+                                    <item AppInfo="Bure" ConceptLink="http://cdb.iso.org/lg/CDB-00135089-001">bvh</item>
+                                    <item AppInfo="Belanda Viri" ConceptLink="http://cdb.iso.org/lg/CDB-00135088-001">bvi</item>
+                                    <item AppInfo="Baan" ConceptLink="http://cdb.iso.org/lg/CDB-00135087-001">bvj</item>
+                                    <item AppInfo="Bukat" ConceptLink="http://cdb.iso.org/lg/CDB-00135086-001">bvk</item>
+                                    <item AppInfo="Bolivian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135076-001">bvl</item>
+                                    <item AppInfo="Bamunka" ConceptLink="http://cdb.iso.org/lg/CDB-00135084-001">bvm</item>
+                                    <item AppInfo="Buna" ConceptLink="http://cdb.iso.org/lg/CDB-00135092-001">bvn</item>
+                                    <item AppInfo="Bolgo" ConceptLink="http://cdb.iso.org/lg/CDB-00135082-001">bvo</item>
+                                    <item AppInfo="Birri" ConceptLink="http://cdb.iso.org/lg/CDB-00135081-001">bvq</item>
+                                    <item AppInfo="Burarra" ConceptLink="http://cdb.iso.org/lg/CDB-00135080-001">bvr</item>
+                                    <item AppInfo="Bati" ConceptLink="http://cdb.iso.org/lg/CDB-00135079-001">bvt</item>
+                                    <item AppInfo="Bukit Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00135078-001">bvu</item>
+                                    <item AppInfo="Baniva" ConceptLink="http://cdb.iso.org/lg/CDB-00138093-001">bvv</item>
+                                    <item AppInfo="Boga" ConceptLink="http://cdb.iso.org/lg/CDB-00135052-001">bvw</item>
+                                    <item AppInfo="Dibole" ConceptLink="http://cdb.iso.org/lg/CDB-00135091-001">bvx</item>
+                                    <item AppInfo="Bauzi" ConceptLink="http://cdb.iso.org/lg/CDB-00135066-001">bvz</item>
+                                    <item AppInfo="Bwatoo" ConceptLink="http://cdb.iso.org/lg/CDB-00135042-001">bwa</item>
+                                    <item AppInfo="Namosi-Naitasiri-Serua" ConceptLink="http://cdb.iso.org/lg/CDB-00135041-001">bwb</item>
+                                    <item AppInfo="Bwile" ConceptLink="http://cdb.iso.org/lg/CDB-00135040-001">bwc</item>
+                                    <item AppInfo="Bwaidoka" ConceptLink="http://cdb.iso.org/lg/CDB-00135039-001">bwd</item>
+                                    <item AppInfo="Bwe Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00134998-001">bwe</item>
+                                    <item AppInfo="Boselewa" ConceptLink="http://cdb.iso.org/lg/CDB-00134997-001">bwf</item>
+                                    <item AppInfo="Barwe" ConceptLink="http://cdb.iso.org/lg/CDB-00134996-001">bwg</item>
+                                    <item AppInfo="Bishuo" ConceptLink="http://cdb.iso.org/lg/CDB-00135018-001">bwh</item>
+                                    <item AppInfo="Baniwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135020-001">bwi</item>
+                                    <item AppInfo="LÃ¡Ã¡ LÃ¡Ã¡ Bwamu" ConceptLink="http://cdb.iso.org/lg/CDB-00135003-001">bwj</item>
+                                    <item AppInfo="Bauwaki" ConceptLink="http://cdb.iso.org/lg/CDB-00135025-001">bwk</item>
+                                    <item AppInfo="Bwela" ConceptLink="http://cdb.iso.org/lg/CDB-00135024-001">bwl</item>
+                                    <item AppInfo="Biwat" ConceptLink="http://cdb.iso.org/lg/CDB-00135023-001">bwm</item>
+                                    <item AppInfo="Wunai Bunu" ConceptLink="http://cdb.iso.org/lg/CDB-00135022-001">bwn</item>
+                                    <item AppInfo="Boro" ConceptLink="http://cdb.iso.org/lg/CDB-00135021-001">bwo</item>
+                                    <item AppInfo="Mandobo Bawah" ConceptLink="http://cdb.iso.org/lg/CDB-00135011-001">bwp</item>
+                                    <item AppInfo="Southern Bobo MadarÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00135019-001">bwq</item>
+                                    <item AppInfo="Bura-Pabir" ConceptLink="http://cdb.iso.org/lg/CDB-00135027-001">bwr</item>
+                                    <item AppInfo="Bomboma" ConceptLink="http://cdb.iso.org/lg/CDB-00135017-001">bws</item>
+                                    <item AppInfo="Bafaw-Balong" ConceptLink="http://cdb.iso.org/lg/CDB-00135016-001">bwt</item>
+                                    <item AppInfo="Buli" ConceptLink="http://cdb.iso.org/lg/CDB-00135015-001">bwu</item>
+                                    <item AppInfo="Bwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135014-001">bww</item>
+                                    <item AppInfo="Bu-Nao Bunu" ConceptLink="http://cdb.iso.org/lg/CDB-00135013-001">bwx</item>
+                                    <item AppInfo="Cwi Bwamu" ConceptLink="http://cdb.iso.org/lg/CDB-00134987-001">bwy</item>
+                                    <item AppInfo="Bwisi" ConceptLink="http://cdb.iso.org/lg/CDB-00135026-001">bwz</item>
+                                    <item AppInfo="Bauro" ConceptLink="http://cdb.iso.org/lg/CDB-00135001-001">bxa</item>
+                                    <item AppInfo="Belanda Bor" ConceptLink="http://cdb.iso.org/lg/CDB-00134977-001">bxb</item>
+                                    <item AppInfo="Molengue" ConceptLink="http://cdb.iso.org/lg/CDB-00134976-001">bxc</item>
+                                    <item AppInfo="Pela" ConceptLink="http://cdb.iso.org/lg/CDB-00134975-001">bxd</item>
+                                    <item AppInfo="Birale" ConceptLink="http://cdb.iso.org/lg/CDB-00134974-001">bxe</item>
+                                    <item AppInfo="Bilur" ConceptLink="http://cdb.iso.org/lg/CDB-00134973-001">bxf</item>
+                                    <item AppInfo="Bangala" ConceptLink="http://cdb.iso.org/lg/CDB-00134972-001">bxg</item>
+                                    <item AppInfo="Buhutu" ConceptLink="http://cdb.iso.org/lg/CDB-00134963-001">bxh</item>
+                                    <item AppInfo="Pirlatapa" ConceptLink="http://cdb.iso.org/lg/CDB-00138320-001">bxi</item>
+                                    <item AppInfo="Bayungu" ConceptLink="http://cdb.iso.org/lg/CDB-00134970-001">bxj</item>
+                                    <item AppInfo="Bukusu" ConceptLink="http://cdb.iso.org/lg/CDB-00134978-001">bxk</item>
+                                    <item AppInfo="Jalkunan" ConceptLink="http://cdb.iso.org/lg/CDB-00134968-001">bxl</item>
+                                    <item AppInfo="Mongolia Buriat" ConceptLink="http://cdb.iso.org/lg/CDB-00134967-001">bxm</item>
+                                    <item AppInfo="Burduna" ConceptLink="http://cdb.iso.org/lg/CDB-00134966-001">bxn</item>
+                                    <item AppInfo="Barikanchi" ConceptLink="http://cdb.iso.org/lg/CDB-00134965-001">bxo</item>
+                                    <item AppInfo="Bebil" ConceptLink="http://cdb.iso.org/lg/CDB-00134985-001">bxp</item>
+                                    <item AppInfo="Beele" ConceptLink="http://cdb.iso.org/lg/CDB-00134969-001">bxq</item>
+                                    <item AppInfo="Russia Buriat" ConceptLink="http://cdb.iso.org/lg/CDB-00134971-001">bxr</item>
+                                    <item AppInfo="Busam" ConceptLink="http://cdb.iso.org/lg/CDB-00134993-001">bxs</item>
+                                    <item AppInfo="China Buriat" ConceptLink="http://cdb.iso.org/lg/CDB-00134992-001">bxu</item>
+                                    <item AppInfo="Berakou" ConceptLink="http://cdb.iso.org/lg/CDB-00134991-001">bxv</item>
+                                    <item AppInfo="Bankagooma" ConceptLink="http://cdb.iso.org/lg/CDB-00134990-001">bxw</item>
+                                    <item AppInfo="Borna" ConceptLink="http://cdb.iso.org/lg/CDB-00134989-001">bxx</item>
+                                    <item AppInfo="Binahari" ConceptLink="http://cdb.iso.org/lg/CDB-00134988-001">bxz</item>
+                                    <item AppInfo="Batak" ConceptLink="http://cdb.iso.org/lg/CDB-00134979-001">bya</item>
+                                    <item AppInfo="Bikya" ConceptLink="http://cdb.iso.org/lg/CDB-00134986-001">byb</item>
+                                    <item AppInfo="Ubaghara" ConceptLink="http://cdb.iso.org/lg/CDB-00134994-001">byc</item>
+                                    <item AppInfo="Benyadu'" ConceptLink="http://cdb.iso.org/lg/CDB-00134984-001">byd</item>
+                                    <item AppInfo="Pouye" ConceptLink="http://cdb.iso.org/lg/CDB-00134983-001">bye</item>
+                                    <item AppInfo="Bete" ConceptLink="http://cdb.iso.org/lg/CDB-00134982-001">byf</item>
+                                    <item AppInfo="Baygo" ConceptLink="http://cdb.iso.org/lg/CDB-00138164-001">byg</item>
+                                    <item AppInfo="Bujhyal" ConceptLink="http://cdb.iso.org/lg/CDB-00134981-001">byh</item>
+                                    <item AppInfo="Buyu" ConceptLink="http://cdb.iso.org/lg/CDB-00134552-001">byi</item>
+                                    <item AppInfo="Bina" ConceptLink="http://cdb.iso.org/lg/CDB-00135110-001">byj</item>
+                                    <item AppInfo="Biao" ConceptLink="http://cdb.iso.org/lg/CDB-00134719-001">byk</item>
+                                    <item AppInfo="Bayono" ConceptLink="http://cdb.iso.org/lg/CDB-00134292-001">byl</item>
+                                    <item AppInfo="Bidyara" ConceptLink="http://cdb.iso.org/lg/CDB-00134291-001">bym</item>
+                                    <item AppInfo="Blin; Bilin" ConceptLink="http://cdb.iso.org/lg/CDB-00134290-001">byn</item>
+                                    <item AppInfo="Biyo" ConceptLink="http://cdb.iso.org/lg/CDB-00134289-001">byo</item>
+                                    <item AppInfo="Bumaji" ConceptLink="http://cdb.iso.org/lg/CDB-00134288-001">byp</item>
+                                    <item AppInfo="Basay" ConceptLink="http://cdb.iso.org/lg/CDB-00138172-001">byq</item>
+                                    <item AppInfo="Baruya" ConceptLink="http://cdb.iso.org/lg/CDB-00134287-001">byr</item>
+                                    <item AppInfo="Burak" ConceptLink="http://cdb.iso.org/lg/CDB-00134278-001">bys</item>
+                                    <item AppInfo="Berti" ConceptLink="http://cdb.iso.org/lg/CDB-00138174-001">byt</item>
+                                    <item AppInfo="Medumba" ConceptLink="http://cdb.iso.org/lg/CDB-00134285-001">byv</item>
+                                    <item AppInfo="Belhariya" ConceptLink="http://cdb.iso.org/lg/CDB-00134293-001">byw</item>
+                                    <item AppInfo="Qaqet" ConceptLink="http://cdb.iso.org/lg/CDB-00134283-001">byx</item>
+                                    <item AppInfo="Buya" ConceptLink="http://cdb.iso.org/lg/CDB-00134282-001">byy</item>
+                                    <item AppInfo="Banaro" ConceptLink="http://cdb.iso.org/lg/CDB-00134281-001">byz</item>
+                                    <item AppInfo="Bandi" ConceptLink="http://cdb.iso.org/lg/CDB-00134280-001">bza</item>
+                                    <item AppInfo="Andio" ConceptLink="http://cdb.iso.org/lg/CDB-00134279-001">bzb</item>
+                                    <item AppInfo="Bribri" ConceptLink="http://cdb.iso.org/lg/CDB-00134301-001">bzd</item>
+                                    <item AppInfo="Jenaama Bozo" ConceptLink="http://cdb.iso.org/lg/CDB-00134303-001">bze</item>
+                                    <item AppInfo="Boikin" ConceptLink="http://cdb.iso.org/lg/CDB-00134286-001">bzf</item>
+                                    <item AppInfo="Babuza" ConceptLink="http://cdb.iso.org/lg/CDB-00134308-001">bzg</item>
+                                    <item AppInfo="Mapos Buang" ConceptLink="http://cdb.iso.org/lg/CDB-00134307-001">bzh</item>
+                                    <item AppInfo="Bisu" ConceptLink="http://cdb.iso.org/lg/CDB-00134306-001">bzi</item>
+                                    <item AppInfo="Belize Kriol English" ConceptLink="http://cdb.iso.org/lg/CDB-00134305-001">bzj</item>
+                                    <item AppInfo="Nicaragua Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00134304-001">bzk</item>
+                                    <item AppInfo="Boano" ConceptLink="http://cdb.iso.org/lg/CDB-00134294-001">bzl</item>
+                                    <item AppInfo="Bolondo" ConceptLink="http://cdb.iso.org/lg/CDB-00134302-001">bzm</item>
+                                    <item AppInfo="Boano" ConceptLink="http://cdb.iso.org/lg/CDB-00134310-001">bzn</item>
+                                    <item AppInfo="Bozaba" ConceptLink="http://cdb.iso.org/lg/CDB-00134300-001">bzo</item>
+                                    <item AppInfo="Kemberano" ConceptLink="http://cdb.iso.org/lg/CDB-00134299-001">bzp</item>
+                                    <item AppInfo="Buli" ConceptLink="http://cdb.iso.org/lg/CDB-00134298-001">bzq</item>
+                                    <item AppInfo="Biri" ConceptLink="http://cdb.iso.org/lg/CDB-00138136-001">bzr</item>
+                                    <item AppInfo="Brazilian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134297-001">bzs</item>
+                                    <item AppInfo="Brithenig" ConceptLink="http://cdb.iso.org/lg/CDB-00138354-001">bzt</item>
+                                    <item AppInfo="Burmeso" ConceptLink="http://cdb.iso.org/lg/CDB-00134296-001">bzu</item>
+                                    <item AppInfo="Bebe" ConceptLink="http://cdb.iso.org/lg/CDB-00134270-001">bzv</item>
+                                    <item AppInfo="Basa" ConceptLink="http://cdb.iso.org/lg/CDB-00134309-001">bzw</item>
+                                    <item AppInfo="Hainyaxo Bozo" ConceptLink="http://cdb.iso.org/lg/CDB-00134284-001">bzx</item>
+                                    <item AppInfo="Obanliku" ConceptLink="http://cdb.iso.org/lg/CDB-00134260-001">bzy</item>
+                                    <item AppInfo="Evant" ConceptLink="http://cdb.iso.org/lg/CDB-00134259-001">bzz</item>
+                                    <item AppInfo="ChortÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134258-001">caa</item>
+                                    <item AppInfo="Garifuna" ConceptLink="http://cdb.iso.org/lg/CDB-00134257-001">cab</item>
+                                    <item AppInfo="Chuj" ConceptLink="http://cdb.iso.org/lg/CDB-00134256-001">cac</item>
+                                    <item AppInfo="Caddo" ConceptLink="http://cdb.iso.org/lg/CDB-00134255-001">cad</item>
+                                    <item AppInfo="Lehar" ConceptLink="http://cdb.iso.org/lg/CDB-00134246-001">cae</item>
+                                    <item AppInfo="Southern Carrier" ConceptLink="http://cdb.iso.org/lg/CDB-00134253-001">caf</item>
+                                    <item AppInfo="NivaclÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134261-001">cag</item>
+                                    <item AppInfo="Cahuarano" ConceptLink="http://cdb.iso.org/lg/CDB-00134251-001">cah</item>
+                                    <item AppInfo="ChanÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00138151-001">caj</item>
+                                    <item AppInfo="Kaqchikel" ConceptLink="http://cdb.iso.org/lg/CDB-00134250-001">cak</item>
+                                    <item AppInfo="Carolinian" ConceptLink="http://cdb.iso.org/lg/CDB-00134249-001">cal</item>
+                                    <item AppInfo="CemuhÃ®" ConceptLink="http://cdb.iso.org/lg/CDB-00134248-001">cam</item>
+                                    <item AppInfo="Chambri" ConceptLink="http://cdb.iso.org/lg/CDB-00134268-001">can</item>
+                                    <item AppInfo="ChÃ¡cobo" ConceptLink="http://cdb.iso.org/lg/CDB-00134252-001">cao</item>
+                                    <item AppInfo="Chipaya" ConceptLink="http://cdb.iso.org/lg/CDB-00134254-001">cap</item>
+                                    <item AppInfo="Car Nicobarese" ConceptLink="http://cdb.iso.org/lg/CDB-00134276-001">caq</item>
+                                    <item AppInfo="Galibi Carib" ConceptLink="http://cdb.iso.org/lg/CDB-00134275-001">car</item>
+                                    <item AppInfo="TsimanÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134274-001">cas</item>
+                                    <item AppInfo="Catalan; Valencian" ConceptLink="http://cdb.iso.org/lg/CDB-00138487-001">cat</item>
+                                    <item AppInfo="CavineÅa" ConceptLink="http://cdb.iso.org/lg/CDB-00134273-001">cav</item>
+                                    <item AppInfo="Callawalla" ConceptLink="http://cdb.iso.org/lg/CDB-00134272-001">caw</item>
+                                    <item AppInfo="Chiquitano" ConceptLink="http://cdb.iso.org/lg/CDB-00134271-001">cax</item>
+                                    <item AppInfo="Cayuga" ConceptLink="http://cdb.iso.org/lg/CDB-00134262-001">cay</item>
+                                    <item AppInfo="Canichana" ConceptLink="http://cdb.iso.org/lg/CDB-00138224-001">caz</item>
+                                    <item AppInfo="CabiyarÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134269-001">cbb</item>
+                                    <item AppInfo="Carapana" ConceptLink="http://cdb.iso.org/lg/CDB-00134277-001">cbc</item>
+                                    <item AppInfo="Carijona" ConceptLink="http://cdb.iso.org/lg/CDB-00134267-001">cbd</item>
+                                    <item AppInfo="Chipiajes" ConceptLink="http://cdb.iso.org/lg/CDB-00138228-001">cbe</item>
+                                    <item AppInfo="Chimila" ConceptLink="http://cdb.iso.org/lg/CDB-00134266-001">cbg</item>
+                                    <item AppInfo="Cagua" ConceptLink="http://cdb.iso.org/lg/CDB-00138230-001">cbh</item>
+                                    <item AppInfo="Chachi" ConceptLink="http://cdb.iso.org/lg/CDB-00134265-001">cbi</item>
+                                    <item AppInfo="Ede Cabe" ConceptLink="http://cdb.iso.org/lg/CDB-00134264-001">cbj</item>
+                                    <item AppInfo="Chavacano" ConceptLink="http://cdb.iso.org/lg/CDB-00134312-001">cbk</item>
+                                    <item AppInfo="Bualkhaw Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00134247-001">cbl</item>
+                                    <item AppInfo="Nyahkur" ConceptLink="http://cdb.iso.org/lg/CDB-00134295-001">cbn</item>
+                                    <item AppInfo="Izora" ConceptLink="http://cdb.iso.org/lg/CDB-00134357-001">cbo</item>
+                                    <item AppInfo="Cashibo-Cacataibo" ConceptLink="http://cdb.iso.org/lg/CDB-00134356-001">cbr</item>
+                                    <item AppInfo="Cashinahua" ConceptLink="http://cdb.iso.org/lg/CDB-00134355-001">cbs</item>
+                                    <item AppInfo="Chayahuita" ConceptLink="http://cdb.iso.org/lg/CDB-00134354-001">cbt</item>
+                                    <item AppInfo="Candoshi-Shapra" ConceptLink="http://cdb.iso.org/lg/CDB-00134353-001">cbu</item>
+                                    <item AppInfo="Cacua" ConceptLink="http://cdb.iso.org/lg/CDB-00134352-001">cbv</item>
+                                    <item AppInfo="Carabayo" ConceptLink="http://cdb.iso.org/lg/CDB-00134343-001">cby</item>
+                                    <item AppInfo="Cauca" ConceptLink="http://cdb.iso.org/lg/CDB-00138243-001">cca</item>
+                                    <item AppInfo="Chamicuro" ConceptLink="http://cdb.iso.org/lg/CDB-00134350-001">ccc</item>
+                                    <item AppInfo="Cafundo Creole" ConceptLink="http://cdb.iso.org/lg/CDB-00134358-001">ccd</item>
+                                    <item AppInfo="Chopi" ConceptLink="http://cdb.iso.org/lg/CDB-00134348-001">cce</item>
+                                    <item AppInfo="Samba Daka" ConceptLink="http://cdb.iso.org/lg/CDB-00134347-001">ccg</item>
+                                    <item AppInfo="Atsam" ConceptLink="http://cdb.iso.org/lg/CDB-00134346-001">cch</item>
+                                    <item AppInfo="Kasanga" ConceptLink="http://cdb.iso.org/lg/CDB-00134345-001">ccj</item>
+                                    <item AppInfo="Cutchi-Swahili" ConceptLink="http://cdb.iso.org/lg/CDB-00134344-001">ccl</item>
+                                    <item AppInfo="Malaccan Creole Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00134366-001">ccm</item>
+                                    <item AppInfo="Comaltepec Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00134368-001">cco</item>
+                                    <item AppInfo="Chakma" ConceptLink="http://cdb.iso.org/lg/CDB-00134351-001">ccp</item>
+                                    <item AppInfo="Chaungtha" ConceptLink="http://cdb.iso.org/lg/CDB-00134373-001">ccq</item>
+                                    <item AppInfo="Cacaopera" ConceptLink="http://cdb.iso.org/lg/CDB-00138194-001">ccr</item>
+                                    <item AppInfo="Choni" ConceptLink="http://cdb.iso.org/lg/CDB-00134372-001">cda</item>
+                                    <item AppInfo="Chenchu" ConceptLink="http://cdb.iso.org/lg/CDB-00134371-001">cde</item>
+                                    <item AppInfo="Chiru" ConceptLink="http://cdb.iso.org/lg/CDB-00134370-001">cdf</item>
+                                    <item AppInfo="Chamari" ConceptLink="http://cdb.iso.org/lg/CDB-00134369-001">cdg</item>
+                                    <item AppInfo="Chambeali" ConceptLink="http://cdb.iso.org/lg/CDB-00134359-001">cdh</item>
+                                    <item AppInfo="Chodri" ConceptLink="http://cdb.iso.org/lg/CDB-00134367-001">cdi</item>
+                                    <item AppInfo="Churahi" ConceptLink="http://cdb.iso.org/lg/CDB-00134375-001">cdj</item>
+                                    <item AppInfo="Chepang" ConceptLink="http://cdb.iso.org/lg/CDB-00133084-001">cdm</item>
+                                    <item AppInfo="Chaudangsi" ConceptLink="http://cdb.iso.org/lg/CDB-00133083-001">cdn</item>
+                                    <item AppInfo="Min Dong Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00133082-001">cdo</item>
+                                    <item AppInfo="Cinda-Regi-Tiyal" ConceptLink="http://cdb.iso.org/lg/CDB-00133073-001">cdr</item>
+                                    <item AppInfo="Chadian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133080-001">cds</item>
+                                    <item AppInfo="Chadong" ConceptLink="http://cdb.iso.org/lg/CDB-00133088-001">cdy</item>
+                                    <item AppInfo="Koda" ConceptLink="http://cdb.iso.org/lg/CDB-00133078-001">cdz</item>
+                                    <item AppInfo="Lower Chehalis" ConceptLink="http://cdb.iso.org/lg/CDB-00138155-001">cea</item>
+                                    <item AppInfo="Cebuano" ConceptLink="http://cdb.iso.org/lg/CDB-00133077-001">ceb</item>
+                                    <item AppInfo="Chamacoco" ConceptLink="http://cdb.iso.org/lg/CDB-00133076-001">ceg</item>
+                                    <item AppInfo="Cen" ConceptLink="http://cdb.iso.org/lg/CDB-00133075-001">cen</item>
+                                    <item AppInfo="Czech" ConceptLink="http://cdb.iso.org/lg/CDB-00138492-001">ces</item>
+                                    <item AppInfo="CentÃºÃºm" ConceptLink="http://cdb.iso.org/lg/CDB-00133095-001">cet</item>
+                                    <item AppInfo="Dijim-Bwilim" ConceptLink="http://cdb.iso.org/lg/CDB-00133079-001">cfa</item>
+                                    <item AppInfo="Cara" ConceptLink="http://cdb.iso.org/lg/CDB-00133081-001">cfd</item>
+                                    <item AppInfo="Como Karim" ConceptLink="http://cdb.iso.org/lg/CDB-00133103-001">cfg</item>
+                                    <item AppInfo="Falam Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133102-001">cfm</item>
+                                    <item AppInfo="Changriwa" ConceptLink="http://cdb.iso.org/lg/CDB-00133101-001">cga</item>
+                                    <item AppInfo="Kagayanen" ConceptLink="http://cdb.iso.org/lg/CDB-00133100-001">cgc</item>
+                                    <item AppInfo="Chiga" ConceptLink="http://cdb.iso.org/lg/CDB-00133099-001">cgg</item>
+                                    <item AppInfo="Chocangacakha" ConceptLink="http://cdb.iso.org/lg/CDB-00133098-001">cgk</item>
+                                    <item AppInfo="Chamorro" ConceptLink="http://cdb.iso.org/lg/CDB-00138489-001">cha</item>
+                                    <item AppInfo="Chibcha" ConceptLink="http://cdb.iso.org/lg/CDB-00138143-001">chb</item>
+                                    <item AppInfo="Catawba" ConceptLink="http://cdb.iso.org/lg/CDB-00138144-001">chc</item>
+                                    <item AppInfo="Highland Oaxaca Chontal" ConceptLink="http://cdb.iso.org/lg/CDB-00133089-001">chd</item>
+                                    <item AppInfo="Chechen" ConceptLink="http://cdb.iso.org/lg/CDB-00138488-001">che</item>
+                                    <item AppInfo="Tabasco Chontal" ConceptLink="http://cdb.iso.org/lg/CDB-00133096-001">chf</item>
+                                    <item AppInfo="Chagatai" ConceptLink="http://cdb.iso.org/lg/CDB-00138146-001">chg</item>
+                                    <item AppInfo="Chinook" ConceptLink="http://cdb.iso.org/lg/CDB-00133104-001">chh</item>
+                                    <item AppInfo="OjitlÃ¡n Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133094-001">chj</item>
+                                    <item AppInfo="Chuukese" ConceptLink="http://cdb.iso.org/lg/CDB-00133093-001">chk</item>
+                                    <item AppInfo="Cahuilla" ConceptLink="http://cdb.iso.org/lg/CDB-00133092-001">chl</item>
+                                    <item AppInfo="Mari" ConceptLink="http://cdb.iso.org/lg/CDB-00130994-001">chm</item>
+                                    <item AppInfo="Chinook jargon" ConceptLink="http://cdb.iso.org/lg/CDB-00133091-001">chn</item>
+                                    <item AppInfo="Choctaw" ConceptLink="http://cdb.iso.org/lg/CDB-00133139-001">cho</item>
+                                    <item AppInfo="Chipewyan; Dene Suline" ConceptLink="http://cdb.iso.org/lg/CDB-00133074-001">chp</item>
+                                    <item AppInfo="Quiotepec Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133122-001">chq</item>
+                                    <item AppInfo="Cherokee" ConceptLink="http://cdb.iso.org/lg/CDB-00133184-001">chr</item>
+                                    <item AppInfo="CholÃ³n" ConceptLink="http://cdb.iso.org/lg/CDB-00138154-001">cht</item>
+                                    <item AppInfo="Church Slavic; Old Slavonic; Old Church Slavonic; Church Slavonic; Old Bulgarian" ConceptLink="http://cdb.iso.org/lg/CDB-00138493-001">chu</item>
+                                    <item AppInfo="Chuvash" ConceptLink="http://cdb.iso.org/lg/CDB-00138494-001">chv</item>
+                                    <item AppInfo="Chuwabu" ConceptLink="http://cdb.iso.org/lg/CDB-00133183-001">chw</item>
+                                    <item AppInfo="Chantyal" ConceptLink="http://cdb.iso.org/lg/CDB-00133182-001">chx</item>
+                                    <item AppInfo="Cheyenne" ConceptLink="http://cdb.iso.org/lg/CDB-00133181-001">chy</item>
+                                    <item AppInfo="OzumacÃ­n Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133180-001">chz</item>
+                                    <item AppInfo="Cia-Cia" ConceptLink="http://cdb.iso.org/lg/CDB-00133179-001">cia</item>
+                                    <item AppInfo="Ci Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00133170-001">cib</item>
+                                    <item AppInfo="Chickasaw" ConceptLink="http://cdb.iso.org/lg/CDB-00133177-001">cic</item>
+                                    <item AppInfo="Chimariko" ConceptLink="http://cdb.iso.org/lg/CDB-00138219-001">cid</item>
+                                    <item AppInfo="Cineni" ConceptLink="http://cdb.iso.org/lg/CDB-00133185-001">cie</item>
+                                    <item AppInfo="Chinali" ConceptLink="http://cdb.iso.org/lg/CDB-00133175-001">cih</item>
+                                    <item AppInfo="Chitkuli Kinnauri" ConceptLink="http://cdb.iso.org/lg/CDB-00133174-001">cik</item>
+                                    <item AppInfo="Cimbrian" ConceptLink="http://cdb.iso.org/lg/CDB-00133173-001">cim</item>
+                                    <item AppInfo="Cinta Larga" ConceptLink="http://cdb.iso.org/lg/CDB-00133172-001">cin</item>
+                                    <item AppInfo="Chiapanec" ConceptLink="http://cdb.iso.org/lg/CDB-00133171-001">cip</item>
+                                    <item AppInfo="Tiri" ConceptLink="http://cdb.iso.org/lg/CDB-00133193-001">cir</item>
+                                    <item AppInfo="Chippewa" ConceptLink="http://cdb.iso.org/lg/CDB-00133195-001">ciw</item>
+                                    <item AppInfo="Chaima" ConceptLink="http://cdb.iso.org/lg/CDB-00133178-001">ciy</item>
+                                    <item AppInfo="Western Cham" ConceptLink="http://cdb.iso.org/lg/CDB-00133200-001">cja</item>
+                                    <item AppInfo="Chru" ConceptLink="http://cdb.iso.org/lg/CDB-00133199-001">cje</item>
+                                    <item AppInfo="Upper Chehalis" ConceptLink="http://cdb.iso.org/lg/CDB-00138226-001">cjh</item>
+                                    <item AppInfo="Chamalal" ConceptLink="http://cdb.iso.org/lg/CDB-00133198-001">cji</item>
+                                    <item AppInfo="Chokwe" ConceptLink="http://cdb.iso.org/lg/CDB-00133197-001">cjk</item>
+                                    <item AppInfo="Eastern Cham" ConceptLink="http://cdb.iso.org/lg/CDB-00133196-001">cjm</item>
+                                    <item AppInfo="Chenapian" ConceptLink="http://cdb.iso.org/lg/CDB-00133186-001">cjn</item>
+                                    <item AppInfo="AshÃ©ninka Pajonal" ConceptLink="http://cdb.iso.org/lg/CDB-00133194-001">cjo</item>
+                                    <item AppInfo="CabÃ©car" ConceptLink="http://cdb.iso.org/lg/CDB-00133202-001">cjp</item>
+                                    <item AppInfo="Chorotega" ConceptLink="http://cdb.iso.org/lg/CDB-00138234-001">cjr</item>
+                                    <item AppInfo="Shor" ConceptLink="http://cdb.iso.org/lg/CDB-00133192-001">cjs</item>
+                                    <item AppInfo="Chuave" ConceptLink="http://cdb.iso.org/lg/CDB-00133191-001">cjv</item>
+                                    <item AppInfo="Jinyu Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00133190-001">cjy</item>
+                                    <item AppInfo="Khumi Awa Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133189-001">cka</item>
+                                    <item AppInfo="Central Kurdish" ConceptLink="http://cdb.iso.org/lg/CDB-00133188-001">ckb</item>
+                                    <item AppInfo="Chak" ConceptLink="http://cdb.iso.org/lg/CDB-00133162-001">ckh</item>
+                                    <item AppInfo="Cibak" ConceptLink="http://cdb.iso.org/lg/CDB-00133201-001">ckl</item>
+                                    <item AppInfo="Anufo" ConceptLink="http://cdb.iso.org/lg/CDB-00133176-001">cko</item>
+                                    <item AppInfo="Kajakse" ConceptLink="http://cdb.iso.org/lg/CDB-00133152-001">ckq</item>
+                                    <item AppInfo="Kairak" ConceptLink="http://cdb.iso.org/lg/CDB-00133151-001">ckr</item>
+                                    <item AppInfo="Tayo" ConceptLink="http://cdb.iso.org/lg/CDB-00133150-001">cks</item>
+                                    <item AppInfo="Chukot" ConceptLink="http://cdb.iso.org/lg/CDB-00133149-001">ckt</item>
+                                    <item AppInfo="Koasati" ConceptLink="http://cdb.iso.org/lg/CDB-00133148-001">cku</item>
+                                    <item AppInfo="Kavalan" ConceptLink="http://cdb.iso.org/lg/CDB-00133147-001">ckv</item>
+                                    <item AppInfo="Caka" ConceptLink="http://cdb.iso.org/lg/CDB-00133138-001">ckx</item>
+                                    <item AppInfo="Cakfem-Mushere" ConceptLink="http://cdb.iso.org/lg/CDB-00133145-001">cky</item>
+                                    <item AppInfo="Cakchiquel-QuichÃ© Mixed Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133153-001">ckz</item>
+                                    <item AppInfo="Ron" ConceptLink="http://cdb.iso.org/lg/CDB-00133143-001">cla</item>
+                                    <item AppInfo="Chilcotin" ConceptLink="http://cdb.iso.org/lg/CDB-00133142-001">clc</item>
+                                    <item AppInfo="Chaldean Neo-Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00133141-001">cld</item>
+                                    <item AppInfo="Lealao Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133140-001">cle</item>
+                                    <item AppInfo="Chilisso" ConceptLink="http://cdb.iso.org/lg/CDB-00133160-001">clh</item>
+                                    <item AppInfo="Chakali" ConceptLink="http://cdb.iso.org/lg/CDB-00133144-001">cli</item>
+                                    <item AppInfo="Idu-Mishmi" ConceptLink="http://cdb.iso.org/lg/CDB-00133146-001">clk</item>
+                                    <item AppInfo="Chala" ConceptLink="http://cdb.iso.org/lg/CDB-00133168-001">cll</item>
+                                    <item AppInfo="Clallam" ConceptLink="http://cdb.iso.org/lg/CDB-00133167-001">clm</item>
+                                    <item AppInfo="Lowland Oaxaca Chontal" ConceptLink="http://cdb.iso.org/lg/CDB-00133166-001">clo</item>
+                                    <item AppInfo="Caluyanun" ConceptLink="http://cdb.iso.org/lg/CDB-00133165-001">clu</item>
+                                    <item AppInfo="Chulym" ConceptLink="http://cdb.iso.org/lg/CDB-00133164-001">clw</item>
+                                    <item AppInfo="Eastern Highland Chatino" ConceptLink="http://cdb.iso.org/lg/CDB-00133163-001">cly</item>
+                                    <item AppInfo="Maa" ConceptLink="http://cdb.iso.org/lg/CDB-00133154-001">cma</item>
+                                    <item AppInfo="Cerma" ConceptLink="http://cdb.iso.org/lg/CDB-00133161-001">cme</item>
+                                    <item AppInfo="Classical Mongolian" ConceptLink="http://cdb.iso.org/lg/CDB-00137855-001">cmg</item>
+                                    <item AppInfo="EmberÃ¡-ChamÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00133169-001">cmi</item>
+                                    <item AppInfo="Chimakum" ConceptLink="http://cdb.iso.org/lg/CDB-00138188-001">cmk</item>
+                                    <item AppInfo="Campalagian" ConceptLink="http://cdb.iso.org/lg/CDB-00133159-001">cml</item>
+                                    <item AppInfo="Michigamea" ConceptLink="http://cdb.iso.org/lg/CDB-00138192-001">cmm</item>
+                                    <item AppInfo="Mandarin Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00133158-001">cmn</item>
+                                    <item AppInfo="Central Mnong" ConceptLink="http://cdb.iso.org/lg/CDB-00133157-001">cmo</item>
+                                    <item AppInfo="Mro Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133156-001">cmr</item>
+                                    <item AppInfo="Messapic" ConceptLink="http://cdb.iso.org/lg/CDB-00138372-001">cms</item>
+                                    <item AppInfo="Camtho" ConceptLink="http://cdb.iso.org/lg/CDB-00133155-001">cmt</item>
+                                    <item AppInfo="Changthang" ConceptLink="http://cdb.iso.org/lg/CDB-00133350-001">cna</item>
+                                    <item AppInfo="Chinbon Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133545-001">cnb</item>
+                                    <item AppInfo="CÃŽÃŽng" ConceptLink="http://cdb.iso.org/lg/CDB-00133317-001">cnc</item>
+                                    <item AppInfo="Northern Qiang" ConceptLink="http://cdb.iso.org/lg/CDB-00133508-001">cng</item>
+                                    <item AppInfo="Haka Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133507-001">cnh</item>
+                                    <item AppInfo="AshÃ¡ninka" ConceptLink="http://cdb.iso.org/lg/CDB-00133506-001">cni</item>
+                                    <item AppInfo="Khumi Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133505-001">cnk</item>
+                                    <item AppInfo="Lalana Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133504-001">cnl</item>
+                                    <item AppInfo="Con" ConceptLink="http://cdb.iso.org/lg/CDB-00133495-001">cno</item>
+                                    <item AppInfo="Central Asmat" ConceptLink="http://cdb.iso.org/lg/CDB-00133502-001">cns</item>
+                                    <item AppInfo="Tepetotutla Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133510-001">cnt</item>
+                                    <item AppInfo="Chenoua" ConceptLink="http://cdb.iso.org/lg/CDB-00133500-001">cnu</item>
+                                    <item AppInfo="Ngawn Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133499-001">cnw</item>
+                                    <item AppInfo="Middle Cornish" ConceptLink="http://cdb.iso.org/lg/CDB-00137850-001">cnx</item>
+                                    <item AppInfo="Cocos Islands Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00133498-001">coa</item>
+                                    <item AppInfo="Chicomuceltec" ConceptLink="http://cdb.iso.org/lg/CDB-00138209-001">cob</item>
+                                    <item AppInfo="Cocopa" ConceptLink="http://cdb.iso.org/lg/CDB-00133497-001">coc</item>
+                                    <item AppInfo="Cocama-Cocamilla" ConceptLink="http://cdb.iso.org/lg/CDB-00133496-001">cod</item>
+                                    <item AppInfo="Koreguaje" ConceptLink="http://cdb.iso.org/lg/CDB-00133518-001">coe</item>
+                                    <item AppInfo="Colorado" ConceptLink="http://cdb.iso.org/lg/CDB-00133520-001">cof</item>
+                                    <item AppInfo="Chong" ConceptLink="http://cdb.iso.org/lg/CDB-00133503-001">cog</item>
+                                    <item AppInfo="Chonyi-Dzihana-Kauma" ConceptLink="http://cdb.iso.org/lg/CDB-00133525-001">coh</item>
+                                    <item AppInfo="Cochimi" ConceptLink="http://cdb.iso.org/lg/CDB-00138210-001">coj</item>
+                                    <item AppInfo="Santa Teresa Cora" ConceptLink="http://cdb.iso.org/lg/CDB-00133524-001">cok</item>
+                                    <item AppInfo="Columbia-Wenatchi" ConceptLink="http://cdb.iso.org/lg/CDB-00133523-001">col</item>
+                                    <item AppInfo="Comanche" ConceptLink="http://cdb.iso.org/lg/CDB-00133522-001">com</item>
+                                    <item AppInfo="CofÃ¡n" ConceptLink="http://cdb.iso.org/lg/CDB-00133521-001">con</item>
+                                    <item AppInfo="Comox" ConceptLink="http://cdb.iso.org/lg/CDB-00133511-001">coo</item>
+                                    <item AppInfo="Coptic" ConceptLink="http://cdb.iso.org/lg/CDB-00138207-001">cop</item>
+                                    <item AppInfo="Coquille" ConceptLink="http://cdb.iso.org/lg/CDB-00138204-001">coq</item>
+                                    <item AppInfo="Cornish" ConceptLink="http://cdb.iso.org/lg/CDB-00138554-001">cor</item>
+                                    <item AppInfo="Corsican" ConceptLink="http://cdb.iso.org/lg/CDB-00138490-001">cos</item>
+                                    <item AppInfo="Caquinte" ConceptLink="http://cdb.iso.org/lg/CDB-00133519-001">cot</item>
+                                    <item AppInfo="Wamey" ConceptLink="http://cdb.iso.org/lg/CDB-00133527-001">cou</item>
+                                    <item AppInfo="Cao Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00133517-001">cov</item>
+                                    <item AppInfo="Cowlitz" ConceptLink="http://cdb.iso.org/lg/CDB-00138202-001">cow</item>
+                                    <item AppInfo="Nanti" ConceptLink="http://cdb.iso.org/lg/CDB-00133516-001">cox</item>
+                                    <item AppInfo="Coyaima" ConceptLink="http://cdb.iso.org/lg/CDB-00138186-001">coy</item>
+                                    <item AppInfo="Chochotec" ConceptLink="http://cdb.iso.org/lg/CDB-00133515-001">coz</item>
+                                    <item AppInfo="Palantla Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133514-001">cpa</item>
+                                    <item AppInfo="Ucayali-YurÃºa AshÃ©ninka" ConceptLink="http://cdb.iso.org/lg/CDB-00133513-001">cpb</item>
+                                    <item AppInfo="AjyÃ­ninka Apurucayali" ConceptLink="http://cdb.iso.org/lg/CDB-00133487-001">cpc</item>
+                                    <item AppInfo="Cappadocian Greek" ConceptLink="http://cdb.iso.org/lg/CDB-00138197-001">cpg</item>
+                                    <item AppInfo="Chinese Pidgin English" ConceptLink="http://cdb.iso.org/lg/CDB-00133526-001">cpi</item>
+                                    <item AppInfo="Cherepon" ConceptLink="http://cdb.iso.org/lg/CDB-00133501-001">cpn</item>
+                                    <item AppInfo="Capiznon" ConceptLink="http://cdb.iso.org/lg/CDB-00133477-001">cps</item>
+                                    <item AppInfo="Pichis AshÃ©ninka" ConceptLink="http://cdb.iso.org/lg/CDB-00133476-001">cpu</item>
+                                    <item AppInfo="Pu-Xian Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00133475-001">cpx</item>
+                                    <item AppInfo="South Ucayali AshÃ©ninka" ConceptLink="http://cdb.iso.org/lg/CDB-00133474-001">cpy</item>
+                                    <item AppInfo="Chuanqiandian Cluster Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00133473-001">cqd</item>
+                                    <item AppInfo="Chilean Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00133472-001">cqu</item>
+                                    <item AppInfo="Chara" ConceptLink="http://cdb.iso.org/lg/CDB-00133463-001">cra</item>
+                                    <item AppInfo="Island Carib" ConceptLink="http://cdb.iso.org/lg/CDB-00138229-001">crb</item>
+                                    <item AppInfo="Lonwolwol" ConceptLink="http://cdb.iso.org/lg/CDB-00133470-001">crc</item>
+                                    <item AppInfo="Coeur d'Alene" ConceptLink="http://cdb.iso.org/lg/CDB-00133478-001">crd</item>
+                                    <item AppInfo="Cree" ConceptLink="http://cdb.iso.org/lg/CDB-00138491-001">cre</item>
+                                    <item AppInfo="Caramanta" ConceptLink="http://cdb.iso.org/lg/CDB-00138201-001">crf</item>
+                                    <item AppInfo="Michif" ConceptLink="http://cdb.iso.org/lg/CDB-00133468-001">crg</item>
+                                    <item AppInfo="Crimean Tatar; Crimean Turkish" ConceptLink="http://cdb.iso.org/lg/CDB-00133467-001">crh</item>
+                                    <item AppInfo="SÃ£otomense" ConceptLink="http://cdb.iso.org/lg/CDB-00133466-001">cri</item>
+                                    <item AppInfo="Southern East Cree" ConceptLink="http://cdb.iso.org/lg/CDB-00133465-001">crj</item>
+                                    <item AppInfo="Plains Cree" ConceptLink="http://cdb.iso.org/lg/CDB-00133485-001">crk</item>
+                                    <item AppInfo="Northern East Cree" ConceptLink="http://cdb.iso.org/lg/CDB-00133469-001">crl</item>
+                                    <item AppInfo="Moose Cree" ConceptLink="http://cdb.iso.org/lg/CDB-00133471-001">crm</item>
+                                    <item AppInfo="El Nayar Cora" ConceptLink="http://cdb.iso.org/lg/CDB-00133493-001">crn</item>
+                                    <item AppInfo="Crow" ConceptLink="http://cdb.iso.org/lg/CDB-00133492-001">cro</item>
+                                    <item AppInfo="Iyo'wujwa Chorote" ConceptLink="http://cdb.iso.org/lg/CDB-00133491-001">crq</item>
+                                    <item AppInfo="Carolina Algonquian" ConceptLink="http://cdb.iso.org/lg/CDB-00138242-001">crr</item>
+                                    <item AppInfo="Seselwa Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00133490-001">crs</item>
+                                    <item AppInfo="Iyojwa'ja Chorote" ConceptLink="http://cdb.iso.org/lg/CDB-00133489-001">crt</item>
+                                    <item AppInfo="Chaura" ConceptLink="http://cdb.iso.org/lg/CDB-00133488-001">crv</item>
+                                    <item AppInfo="Chrau" ConceptLink="http://cdb.iso.org/lg/CDB-00133479-001">crw</item>
+                                    <item AppInfo="Carrier" ConceptLink="http://cdb.iso.org/lg/CDB-00133486-001">crx</item>
+                                    <item AppInfo="Cori" ConceptLink="http://cdb.iso.org/lg/CDB-00133494-001">cry</item>
+                                    <item AppInfo="CruzeÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00138240-001">crz</item>
+                                    <item AppInfo="Chiltepec Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133484-001">csa</item>
+                                    <item AppInfo="Kashubian" ConceptLink="http://cdb.iso.org/lg/CDB-00133483-001">csb</item>
+                                    <item AppInfo="Catalan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133482-001">csc</item>
+                                    <item AppInfo="Chiangmai Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133481-001">csd</item>
+                                    <item AppInfo="Czech Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133480-001">cse</item>
+                                    <item AppInfo="Cuba Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133542-001">csf</item>
+                                    <item AppInfo="Chilean Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133592-001">csg</item>
+                                    <item AppInfo="Asho Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133512-001">csh</item>
+                                    <item AppInfo="Coast Miwok" ConceptLink="http://cdb.iso.org/lg/CDB-00138236-001">csi</item>
+                                    <item AppInfo="Jola-Kasa" ConceptLink="http://cdb.iso.org/lg/CDB-00133574-001">csk</item>
+                                    <item AppInfo="Chinese Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133573-001">csl</item>
+                                    <item AppInfo="Central Sierra Miwok" ConceptLink="http://cdb.iso.org/lg/CDB-00133572-001">csm</item>
+                                    <item AppInfo="Colombian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133571-001">csn</item>
+                                    <item AppInfo="Sochiapam Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133570-001">cso</item>
+                                    <item AppInfo="Croatia Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133561-001">csq</item>
+                                    <item AppInfo="Costa Rican Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133568-001">csr</item>
+                                    <item AppInfo="Southern Ohlone" ConceptLink="http://cdb.iso.org/lg/CDB-00138233-001">css</item>
+                                    <item AppInfo="Northern Ohlone" ConceptLink="http://cdb.iso.org/lg/CDB-00138227-001">cst</item>
+                                    <item AppInfo="Swampy Cree" ConceptLink="http://cdb.iso.org/lg/CDB-00133576-001">csw</item>
+                                    <item AppInfo="Siyin Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133566-001">csy</item>
+                                    <item AppInfo="Coos" ConceptLink="http://cdb.iso.org/lg/CDB-00133565-001">csz</item>
+                                    <item AppInfo="Tataltepec Chatino" ConceptLink="http://cdb.iso.org/lg/CDB-00133564-001">cta</item>
+                                    <item AppInfo="Chetco" ConceptLink="http://cdb.iso.org/lg/CDB-00133563-001">ctc</item>
+                                    <item AppInfo="Tedim Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133562-001">ctd</item>
+                                    <item AppInfo="Tepinapa Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133584-001">cte</item>
+                                    <item AppInfo="Chittagonian" ConceptLink="http://cdb.iso.org/lg/CDB-00133586-001">ctg</item>
+                                    <item AppInfo="Tlacoatzintepec Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133569-001">ctl</item>
+                                    <item AppInfo="Chitimacha" ConceptLink="http://cdb.iso.org/lg/CDB-00138222-001">ctm</item>
+                                    <item AppInfo="Chhintange" ConceptLink="http://cdb.iso.org/lg/CDB-00133591-001">ctn</item>
+                                    <item AppInfo="EmberÃ¡-CatÃ­o" ConceptLink="http://cdb.iso.org/lg/CDB-00133590-001">cto</item>
+                                    <item AppInfo="Western Highland Chatino" ConceptLink="http://cdb.iso.org/lg/CDB-00133589-001">ctp</item>
+                                    <item AppInfo="Northern Catanduanes Bicolano" ConceptLink="http://cdb.iso.org/lg/CDB-00133588-001">cts</item>
+                                    <item AppInfo="Wayanad Chetti" ConceptLink="http://cdb.iso.org/lg/CDB-00133587-001">ctt</item>
+                                    <item AppInfo="Chol" ConceptLink="http://cdb.iso.org/lg/CDB-00133577-001">ctu</item>
+                                    <item AppInfo="Zacatepec Chatino" ConceptLink="http://cdb.iso.org/lg/CDB-00133585-001">ctz</item>
+                                    <item AppInfo="Cua" ConceptLink="http://cdb.iso.org/lg/CDB-00133593-001">cua</item>
+                                    <item AppInfo="Cubeo" ConceptLink="http://cdb.iso.org/lg/CDB-00133583-001">cub</item>
+                                    <item AppInfo="Usila Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133582-001">cuc</item>
+                                    <item AppInfo="Cung" ConceptLink="http://cdb.iso.org/lg/CDB-00133581-001">cug</item>
+                                    <item AppInfo="Chuka" ConceptLink="http://cdb.iso.org/lg/CDB-00133580-001">cuh</item>
+                                    <item AppInfo="Cuiba" ConceptLink="http://cdb.iso.org/lg/CDB-00133579-001">cui</item>
+                                    <item AppInfo="Mashco Piro" ConceptLink="http://cdb.iso.org/lg/CDB-00133578-001">cuj</item>
+                                    <item AppInfo="San Blas Kuna" ConceptLink="http://cdb.iso.org/lg/CDB-00133559-001">cuk</item>
+                                    <item AppInfo="Culina" ConceptLink="http://cdb.iso.org/lg/CDB-00133534-001">cul</item>
+                                    <item AppInfo="Cumeral" ConceptLink="http://cdb.iso.org/lg/CDB-00138152-001">cum</item>
+                                    <item AppInfo="Cumanagoto" ConceptLink="http://cdb.iso.org/lg/CDB-00138148-001">cuo</item>
+                                    <item AppInfo="CupeÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00138147-001">cup</item>
+                                    <item AppInfo="Cun" ConceptLink="http://cdb.iso.org/lg/CDB-00133567-001">cuq</item>
+                                    <item AppInfo="Chhulung" ConceptLink="http://cdb.iso.org/lg/CDB-00133541-001">cur</item>
+                                    <item AppInfo="Teutila Cuicatec" ConceptLink="http://cdb.iso.org/lg/CDB-00133540-001">cut</item>
+                                    <item AppInfo="Tai Ya" ConceptLink="http://cdb.iso.org/lg/CDB-00133539-001">cuu</item>
+                                    <item AppInfo="Cuvok" ConceptLink="http://cdb.iso.org/lg/CDB-00133538-001">cuv</item>
+                                    <item AppInfo="Chukwa" ConceptLink="http://cdb.iso.org/lg/CDB-00133537-001">cuw</item>
+                                    <item AppInfo="Tepeuxila Cuicatec" ConceptLink="http://cdb.iso.org/lg/CDB-00133528-001">cux</item>
+                                    <item AppInfo="Chug" ConceptLink="http://cdb.iso.org/lg/CDB-00133535-001">cvg</item>
+                                    <item AppInfo="Valle Nacional Chinantec" ConceptLink="http://cdb.iso.org/lg/CDB-00133543-001">cvn</item>
+                                    <item AppInfo="Kabwa" ConceptLink="http://cdb.iso.org/lg/CDB-00133533-001">cwa</item>
+                                    <item AppInfo="Maindo" ConceptLink="http://cdb.iso.org/lg/CDB-00133532-001">cwb</item>
+                                    <item AppInfo="Woods Cree" ConceptLink="http://cdb.iso.org/lg/CDB-00133531-001">cwd</item>
+                                    <item AppInfo="Kwere" ConceptLink="http://cdb.iso.org/lg/CDB-00133530-001">cwe</item>
+                                    <item AppInfo="Chewong" ConceptLink="http://cdb.iso.org/lg/CDB-00133529-001">cwg</item>
+                                    <item AppInfo="Kuwaataay" ConceptLink="http://cdb.iso.org/lg/CDB-00133551-001">cwt</item>
+                                    <item AppInfo="Nopala Chatino" ConceptLink="http://cdb.iso.org/lg/CDB-00133553-001">cya</item>
+                                    <item AppInfo="Cayubaba" ConceptLink="http://cdb.iso.org/lg/CDB-00138127-001">cyb</item>
+                                    <item AppInfo="Welsh" ConceptLink="http://cdb.iso.org/lg/CDB-00138495-001">cym</item>
+                                    <item AppInfo="Cuyonon" ConceptLink="http://cdb.iso.org/lg/CDB-00133536-001">cyo</item>
+                                    <item AppInfo="Huizhou Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00133558-001">czh</item>
+                                    <item AppInfo="Knaanic" ConceptLink="http://cdb.iso.org/lg/CDB-00138141-001">czk</item>
+                                    <item AppInfo="Zenzontepec Chatino" ConceptLink="http://cdb.iso.org/lg/CDB-00133557-001">czn</item>
+                                    <item AppInfo="Min Zhong Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00133556-001">czo</item>
+                                    <item AppInfo="Zotung Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133555-001">czt</item>
+                                    <item AppInfo="DangalÃ©at" ConceptLink="http://cdb.iso.org/lg/CDB-00133554-001">daa</item>
+                                    <item AppInfo="Dambi" ConceptLink="http://cdb.iso.org/lg/CDB-00133544-001">dac</item>
+                                    <item AppInfo="Marik" ConceptLink="http://cdb.iso.org/lg/CDB-00133552-001">dad</item>
+                                    <item AppInfo="Duupa" ConceptLink="http://cdb.iso.org/lg/CDB-00133560-001">dae</item>
+                                    <item AppInfo="Dan" ConceptLink="http://cdb.iso.org/lg/CDB-00133550-001">daf</item>
+                                    <item AppInfo="Dagbani" ConceptLink="http://cdb.iso.org/lg/CDB-00133549-001">dag</item>
+                                    <item AppInfo="Gwahatike" ConceptLink="http://cdb.iso.org/lg/CDB-00133548-001">dah</item>
+                                    <item AppInfo="Day" ConceptLink="http://cdb.iso.org/lg/CDB-00133547-001">dai</item>
+                                    <item AppInfo="Dar Fur Daju" ConceptLink="http://cdb.iso.org/lg/CDB-00133546-001">daj</item>
+                                    <item AppInfo="Dakota" ConceptLink="http://cdb.iso.org/lg/CDB-00133447-001">dak</item>
+                                    <item AppInfo="Dahalo" ConceptLink="http://cdb.iso.org/lg/CDB-00133575-001">dal</item>
+                                    <item AppInfo="Damakawa" ConceptLink="http://cdb.iso.org/lg/CDB-00133464-001">dam</item>
+                                    <item AppInfo="Danish" ConceptLink="http://cdb.iso.org/lg/CDB-00138496-001">dan</item>
+                                    <item AppInfo="Daai Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00133379-001">dao</item>
+                                    <item AppInfo="Nisi" ConceptLink="http://cdb.iso.org/lg/CDB-00133378-001">dap</item>
+                                    <item AppInfo="Dandami Maria" ConceptLink="http://cdb.iso.org/lg/CDB-00133377-001">daq</item>
+                                    <item AppInfo="Dargwa" ConceptLink="http://cdb.iso.org/lg/CDB-00133376-001">dar</item>
+                                    <item AppInfo="Daho-Doo" ConceptLink="http://cdb.iso.org/lg/CDB-00133375-001">das</item>
+                                    <item AppInfo="Dar Sila Daju" ConceptLink="http://cdb.iso.org/lg/CDB-00133374-001">dau</item>
+                                    <item AppInfo="Taita" ConceptLink="http://cdb.iso.org/lg/CDB-00133365-001">dav</item>
+                                    <item AppInfo="Davawenyo" ConceptLink="http://cdb.iso.org/lg/CDB-00133372-001">daw</item>
+                                    <item AppInfo="Dayi" ConceptLink="http://cdb.iso.org/lg/CDB-00133380-001">dax</item>
+                                    <item AppInfo="Dao" ConceptLink="http://cdb.iso.org/lg/CDB-00133370-001">daz</item>
+                                    <item AppInfo="Bangi Me" ConceptLink="http://cdb.iso.org/lg/CDB-00133369-001">dba</item>
+                                    <item AppInfo="Deno" ConceptLink="http://cdb.iso.org/lg/CDB-00133368-001">dbb</item>
+                                    <item AppInfo="Dadiya" ConceptLink="http://cdb.iso.org/lg/CDB-00133367-001">dbd</item>
+                                    <item AppInfo="Dabe" ConceptLink="http://cdb.iso.org/lg/CDB-00133366-001">dbe</item>
+                                    <item AppInfo="Edopi" ConceptLink="http://cdb.iso.org/lg/CDB-00133388-001">dbf</item>
+                                    <item AppInfo="Dogul Dom Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00133390-001">dbg</item>
+                                    <item AppInfo="Doka" ConceptLink="http://cdb.iso.org/lg/CDB-00133373-001">dbi</item>
+                                    <item AppInfo="Ida'an" ConceptLink="http://cdb.iso.org/lg/CDB-00133395-001">dbj</item>
+                                    <item AppInfo="Dyirbal" ConceptLink="http://cdb.iso.org/lg/CDB-00133394-001">dbl</item>
+                                    <item AppInfo="Duguri" ConceptLink="http://cdb.iso.org/lg/CDB-00133393-001">dbm</item>
+                                    <item AppInfo="Duriankere" ConceptLink="http://cdb.iso.org/lg/CDB-00133392-001">dbn</item>
+                                    <item AppInfo="Dulbu" ConceptLink="http://cdb.iso.org/lg/CDB-00133391-001">dbo</item>
+                                    <item AppInfo="Duwai" ConceptLink="http://cdb.iso.org/lg/CDB-00133381-001">dbp</item>
+                                    <item AppInfo="Daba" ConceptLink="http://cdb.iso.org/lg/CDB-00133389-001">dbq</item>
+                                    <item AppInfo="Dabarre" ConceptLink="http://cdb.iso.org/lg/CDB-00133397-001">dbr</item>
+                                    <item AppInfo="Bondum Dom Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00133387-001">dbu</item>
+                                    <item AppInfo="Dungu" ConceptLink="http://cdb.iso.org/lg/CDB-00133386-001">dbv</item>
+                                    <item AppInfo="Dibiyaso" ConceptLink="http://cdb.iso.org/lg/CDB-00133385-001">dby</item>
+                                    <item AppInfo="Deccan" ConceptLink="http://cdb.iso.org/lg/CDB-00133384-001">dcc</item>
+                                    <item AppInfo="Negerhollands" ConceptLink="http://cdb.iso.org/lg/CDB-00138135-001">dcr</item>
+                                    <item AppInfo="Dongotono" ConceptLink="http://cdb.iso.org/lg/CDB-00133383-001">ddd</item>
+                                    <item AppInfo="Doondo" ConceptLink="http://cdb.iso.org/lg/CDB-00133357-001">dde</item>
+                                    <item AppInfo="Fataluku" ConceptLink="http://cdb.iso.org/lg/CDB-00133396-001">ddg</item>
+                                    <item AppInfo="Diodio" ConceptLink="http://cdb.iso.org/lg/CDB-00133371-001">ddi</item>
+                                    <item AppInfo="Jaru" ConceptLink="http://cdb.iso.org/lg/CDB-00133347-001">ddj</item>
+                                    <item AppInfo="Dendi" ConceptLink="http://cdb.iso.org/lg/CDB-00133346-001">ddn</item>
+                                    <item AppInfo="Dido" ConceptLink="http://cdb.iso.org/lg/CDB-00133345-001">ddo</item>
+                                    <item AppInfo="Donno So Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00133344-001">dds</item>
+                                    <item AppInfo="Dawera-Daweloor" ConceptLink="http://cdb.iso.org/lg/CDB-00133343-001">ddw</item>
+                                    <item AppInfo="Dagik" ConceptLink="http://cdb.iso.org/lg/CDB-00133342-001">dec</item>
+                                    <item AppInfo="Dedua" ConceptLink="http://cdb.iso.org/lg/CDB-00133333-001">ded</item>
+                                    <item AppInfo="Dewoin" ConceptLink="http://cdb.iso.org/lg/CDB-00133340-001">dee</item>
+                                    <item AppInfo="Dezfuli" ConceptLink="http://cdb.iso.org/lg/CDB-00133348-001">def</item>
+                                    <item AppInfo="Degema" ConceptLink="http://cdb.iso.org/lg/CDB-00133338-001">deg</item>
+                                    <item AppInfo="Dehwari" ConceptLink="http://cdb.iso.org/lg/CDB-00133337-001">deh</item>
+                                    <item AppInfo="Demisa" ConceptLink="http://cdb.iso.org/lg/CDB-00133336-001">dei</item>
+                                    <item AppInfo="Dek" ConceptLink="http://cdb.iso.org/lg/CDB-00133335-001">dek</item>
+                                    <item AppInfo="Delaware" ConceptLink="http://cdb.iso.org/lg/CDB-00130980-001">del</item>
+                                    <item AppInfo="Dem" ConceptLink="http://cdb.iso.org/lg/CDB-00133355-001">dem</item>
+                                    <item AppInfo="Slave (Athapascan)" ConceptLink="http://cdb.iso.org/lg/CDB-00130996-001">den</item>
+                                    <item AppInfo="Pidgin Delaware" ConceptLink="http://cdb.iso.org/lg/CDB-00138128-001">dep</item>
+                                    <item AppInfo="Dendi" ConceptLink="http://cdb.iso.org/lg/CDB-00133339-001">deq</item>
+                                    <item AppInfo="Deori" ConceptLink="http://cdb.iso.org/lg/CDB-00133341-001">der</item>
+                                    <item AppInfo="Desano" ConceptLink="http://cdb.iso.org/lg/CDB-00133363-001">des</item>
+                                    <item AppInfo="German" ConceptLink="http://cdb.iso.org/lg/CDB-00138497-001">deu</item>
+                                    <item AppInfo="Domung" ConceptLink="http://cdb.iso.org/lg/CDB-00133362-001">dev</item>
+                                    <item AppInfo="Dengese" ConceptLink="http://cdb.iso.org/lg/CDB-00133361-001">dez</item>
+                                    <item AppInfo="Southern Dagaare" ConceptLink="http://cdb.iso.org/lg/CDB-00133360-001">dga</item>
+                                    <item AppInfo="Bunoge Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00133359-001">dgb</item>
+                                    <item AppInfo="Casiguran Dumagat Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00133358-001">dgc</item>
+                                    <item AppInfo="Dagaari Dioula" ConceptLink="http://cdb.iso.org/lg/CDB-00133349-001">dgd</item>
+                                    <item AppInfo="Degenan" ConceptLink="http://cdb.iso.org/lg/CDB-00133356-001">dge</item>
+                                    <item AppInfo="Doga" ConceptLink="http://cdb.iso.org/lg/CDB-00133364-001">dgg</item>
+                                    <item AppInfo="Dghwede" ConceptLink="http://cdb.iso.org/lg/CDB-00133354-001">dgh</item>
+                                    <item AppInfo="Northern Dagara" ConceptLink="http://cdb.iso.org/lg/CDB-00133353-001">dgi</item>
+                                    <item AppInfo="Dagba" ConceptLink="http://cdb.iso.org/lg/CDB-00133352-001">dgk</item>
+                                    <item AppInfo="Dagoman" ConceptLink="http://cdb.iso.org/lg/CDB-00138142-001">dgn</item>
+                                    <item AppInfo="Dogri" ConceptLink="http://cdb.iso.org/lg/CDB-00133351-001">dgo</item>
+                                    <item AppInfo="Dogrib" ConceptLink="http://cdb.iso.org/lg/CDB-00133399-001">dgr</item>
+                                    <item AppInfo="Dogoso" ConceptLink="http://cdb.iso.org/lg/CDB-00133334-001">dgs</item>
+                                    <item AppInfo="Degaru" ConceptLink="http://cdb.iso.org/lg/CDB-00133382-001">dgu</item>
+                                    <item AppInfo="Doghoro" ConceptLink="http://cdb.iso.org/lg/CDB-00133444-001">dgx</item>
+                                    <item AppInfo="Daga" ConceptLink="http://cdb.iso.org/lg/CDB-00133443-001">dgz</item>
+                                    <item AppInfo="Dhanwar" ConceptLink="http://cdb.iso.org/lg/CDB-00133442-001">dha</item>
+                                    <item AppInfo="Dhundari" ConceptLink="http://cdb.iso.org/lg/CDB-00133441-001">dhd</item>
+                                    <item AppInfo="Dhangu" ConceptLink="http://cdb.iso.org/lg/CDB-00133440-001">dhg</item>
+                                    <item AppInfo="Dhimal" ConceptLink="http://cdb.iso.org/lg/CDB-00133439-001">dhi</item>
+                                    <item AppInfo="Dhalandji" ConceptLink="http://cdb.iso.org/lg/CDB-00133430-001">dhl</item>
+                                    <item AppInfo="Zemba" ConceptLink="http://cdb.iso.org/lg/CDB-00133437-001">dhm</item>
+                                    <item AppInfo="Dhanki" ConceptLink="http://cdb.iso.org/lg/CDB-00133445-001">dhn</item>
+                                    <item AppInfo="Dhodia" ConceptLink="http://cdb.iso.org/lg/CDB-00133435-001">dho</item>
+                                    <item AppInfo="Dhargari" ConceptLink="http://cdb.iso.org/lg/CDB-00133434-001">dhr</item>
+                                    <item AppInfo="Dhaiso" ConceptLink="http://cdb.iso.org/lg/CDB-00133433-001">dhs</item>
+                                    <item AppInfo="Dhurga" ConceptLink="http://cdb.iso.org/lg/CDB-00138176-001">dhu</item>
+                                    <item AppInfo="Dehu" ConceptLink="http://cdb.iso.org/lg/CDB-00133432-001">dhv</item>
+                                    <item AppInfo="Dhanwar" ConceptLink="http://cdb.iso.org/lg/CDB-00133431-001">dhw</item>
+                                    <item AppInfo="Dia" ConceptLink="http://cdb.iso.org/lg/CDB-00133453-001">dia</item>
+                                    <item AppInfo="South Central Dinka" ConceptLink="http://cdb.iso.org/lg/CDB-00133455-001">dib</item>
+                                    <item AppInfo="Lakota Dida" ConceptLink="http://cdb.iso.org/lg/CDB-00133438-001">dic</item>
+                                    <item AppInfo="Didinga" ConceptLink="http://cdb.iso.org/lg/CDB-00133460-001">did</item>
+                                    <item AppInfo="Dieri" ConceptLink="http://cdb.iso.org/lg/CDB-00138185-001">dif</item>
+                                    <item AppInfo="Digo" ConceptLink="http://cdb.iso.org/lg/CDB-00133459-001">dig</item>
+                                    <item AppInfo="Kumiai" ConceptLink="http://cdb.iso.org/lg/CDB-00133458-001">dih</item>
+                                    <item AppInfo="Dimbong" ConceptLink="http://cdb.iso.org/lg/CDB-00133457-001">dii</item>
+                                    <item AppInfo="Dai" ConceptLink="http://cdb.iso.org/lg/CDB-00133456-001">dij</item>
+                                    <item AppInfo="Southwestern Dinka" ConceptLink="http://cdb.iso.org/lg/CDB-00133446-001">dik</item>
+                                    <item AppInfo="Dilling" ConceptLink="http://cdb.iso.org/lg/CDB-00133454-001">dil</item>
+                                    <item AppInfo="Dime" ConceptLink="http://cdb.iso.org/lg/CDB-00133462-001">dim</item>
+                                    <item AppInfo="Dinka" ConceptLink="http://cdb.iso.org/lg/CDB-00130992-001">din</item>
+                                    <item AppInfo="Dibo" ConceptLink="http://cdb.iso.org/lg/CDB-00133452-001">dio</item>
+                                    <item AppInfo="Northeastern Dinka" ConceptLink="http://cdb.iso.org/lg/CDB-00133451-001">dip</item>
+                                    <item AppInfo="Dimli" ConceptLink="http://cdb.iso.org/lg/CDB-00133450-001">diq</item>
+                                    <item AppInfo="Dirim" ConceptLink="http://cdb.iso.org/lg/CDB-00133449-001">dir</item>
+                                    <item AppInfo="Dimasa" ConceptLink="http://cdb.iso.org/lg/CDB-00133448-001">dis</item>
+                                    <item AppInfo="Dirari" ConceptLink="http://cdb.iso.org/lg/CDB-00133422-001">dit</item>
+                                    <item AppInfo="Diriku" ConceptLink="http://cdb.iso.org/lg/CDB-00133461-001">diu</item>
+                                    <item AppInfo="Divehi; Dhivehi; Maldivian" ConceptLink="http://cdb.iso.org/lg/CDB-00138498-001">div</item>
+                                    <item AppInfo="Northwestern Dinka" ConceptLink="http://cdb.iso.org/lg/CDB-00133436-001">diw</item>
+                                    <item AppInfo="Dixon Reef" ConceptLink="http://cdb.iso.org/lg/CDB-00133412-001">dix</item>
+                                    <item AppInfo="Diuwe" ConceptLink="http://cdb.iso.org/lg/CDB-00133411-001">diy</item>
+                                    <item AppInfo="Ding" ConceptLink="http://cdb.iso.org/lg/CDB-00133410-001">diz</item>
+                                    <item AppInfo="Djinba" ConceptLink="http://cdb.iso.org/lg/CDB-00133409-001">djb</item>
+                                    <item AppInfo="Dar Daju Daju" ConceptLink="http://cdb.iso.org/lg/CDB-00133408-001">djc</item>
+                                    <item AppInfo="Djamindjung" ConceptLink="http://cdb.iso.org/lg/CDB-00133407-001">djd</item>
+                                    <item AppInfo="Zarma" ConceptLink="http://cdb.iso.org/lg/CDB-00133398-001">dje</item>
+                                    <item AppInfo="Djangun" ConceptLink="http://cdb.iso.org/lg/CDB-00133405-001">djf</item>
+                                    <item AppInfo="Djinang" ConceptLink="http://cdb.iso.org/lg/CDB-00133413-001">dji</item>
+                                    <item AppInfo="Djeebbana" ConceptLink="http://cdb.iso.org/lg/CDB-00133403-001">djj</item>
+                                    <item AppInfo="Aukan" ConceptLink="http://cdb.iso.org/lg/CDB-00133402-001">djk</item>
+                                    <item AppInfo="Djiwarli" ConceptLink="http://cdb.iso.org/lg/CDB-00133401-001">djl</item>
+                                    <item AppInfo="Jamsay Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00133400-001">djm</item>
+                                    <item AppInfo="Djauan" ConceptLink="http://cdb.iso.org/lg/CDB-00133420-001">djn</item>
+                                    <item AppInfo="Jangkang" ConceptLink="http://cdb.iso.org/lg/CDB-00133404-001">djo</item>
+                                    <item AppInfo="Djambarrpuyngu" ConceptLink="http://cdb.iso.org/lg/CDB-00133406-001">djr</item>
+                                    <item AppInfo="Kapriman" ConceptLink="http://cdb.iso.org/lg/CDB-00133428-001">dju</item>
+                                    <item AppInfo="Djawi" ConceptLink="http://cdb.iso.org/lg/CDB-00133427-001">djw</item>
+                                    <item AppInfo="Dakpakha" ConceptLink="http://cdb.iso.org/lg/CDB-00133426-001">dka</item>
+                                    <item AppInfo="Dakka" ConceptLink="http://cdb.iso.org/lg/CDB-00133425-001">dkk</item>
+                                    <item AppInfo="Kolum So Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00133424-001">dkl</item>
+                                    <item AppInfo="Kuijau" ConceptLink="http://cdb.iso.org/lg/CDB-00133423-001">dkr</item>
+                                    <item AppInfo="Southeastern Dinka" ConceptLink="http://cdb.iso.org/lg/CDB-00133414-001">dks</item>
+                                    <item AppInfo="Mazagway" ConceptLink="http://cdb.iso.org/lg/CDB-00133421-001">dkx</item>
+                                    <item AppInfo="Dolgan" ConceptLink="http://cdb.iso.org/lg/CDB-00133429-001">dlg</item>
+                                    <item AppInfo="Dalmatian" ConceptLink="http://cdb.iso.org/lg/CDB-00138302-001">dlm</item>
+                                    <item AppInfo="Darlong" ConceptLink="http://cdb.iso.org/lg/CDB-00133419-001">dln</item>
+                                    <item AppInfo="Duma" ConceptLink="http://cdb.iso.org/lg/CDB-00133418-001">dma</item>
+                                    <item AppInfo="Dimir" ConceptLink="http://cdb.iso.org/lg/CDB-00133417-001">dmc</item>
+                                    <item AppInfo="Dugwor" ConceptLink="http://cdb.iso.org/lg/CDB-00133416-001">dme</item>
+                                    <item AppInfo="Upper Kinabatangan" ConceptLink="http://cdb.iso.org/lg/CDB-00134162-001">dmg</item>
+                                    <item AppInfo="Domaaki" ConceptLink="http://cdb.iso.org/lg/CDB-00133119-001">dmk</item>
+                                    <item AppInfo="Dameli" ConceptLink="http://cdb.iso.org/lg/CDB-00133937-001">dml</item>
+                                    <item AppInfo="Dama" ConceptLink="http://cdb.iso.org/lg/CDB-00134813-001">dmm</item>
+                                    <item AppInfo="Kemezung" ConceptLink="http://cdb.iso.org/lg/CDB-00134812-001">dmo</item>
+                                    <item AppInfo="East Damar" ConceptLink="http://cdb.iso.org/lg/CDB-00134811-001">dmr</item>
+                                    <item AppInfo="Dampelas" ConceptLink="http://cdb.iso.org/lg/CDB-00134810-001">dms</item>
+                                    <item AppInfo="Dubu" ConceptLink="http://cdb.iso.org/lg/CDB-00134809-001">dmu</item>
+                                    <item AppInfo="Dumpas" ConceptLink="http://cdb.iso.org/lg/CDB-00134808-001">dmv</item>
+                                    <item AppInfo="Dema" ConceptLink="http://cdb.iso.org/lg/CDB-00134799-001">dmx</item>
+                                    <item AppInfo="Demta" ConceptLink="http://cdb.iso.org/lg/CDB-00134806-001">dmy</item>
+                                    <item AppInfo="Upper Grand Valley Dani" ConceptLink="http://cdb.iso.org/lg/CDB-00134814-001">dna</item>
+                                    <item AppInfo="Daonda" ConceptLink="http://cdb.iso.org/lg/CDB-00134804-001">dnd</item>
+                                    <item AppInfo="Ndendeule" ConceptLink="http://cdb.iso.org/lg/CDB-00134803-001">dne</item>
+                                    <item AppInfo="Dungan" ConceptLink="http://cdb.iso.org/lg/CDB-00134802-001">dng</item>
+                                    <item AppInfo="Lower Grand Valley Dani" ConceptLink="http://cdb.iso.org/lg/CDB-00134365-001">dni</item>
+                                    <item AppInfo="Dengka" ConceptLink="http://cdb.iso.org/lg/CDB-00134364-001">dnk</item>
+                                    <item AppInfo="DzÃ¹Ã¹ngoo" ConceptLink="http://cdb.iso.org/lg/CDB-00134363-001">dnn</item>
+                                    <item AppInfo="Danaru" ConceptLink="http://cdb.iso.org/lg/CDB-00134362-001">dnr</item>
+                                    <item AppInfo="Mid Grand Valley Dani" ConceptLink="http://cdb.iso.org/lg/CDB-00134361-001">dnt</item>
+                                    <item AppInfo="Danau" ConceptLink="http://cdb.iso.org/lg/CDB-00134335-001">dnu</item>
+                                    <item AppInfo="Western Dani" ConceptLink="http://cdb.iso.org/lg/CDB-00134374-001">dnw</item>
+                                    <item AppInfo="DenÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134349-001">dny</item>
+                                    <item AppInfo="Dom" ConceptLink="http://cdb.iso.org/lg/CDB-00134325-001">doa</item>
+                                    <item AppInfo="Dobu" ConceptLink="http://cdb.iso.org/lg/CDB-00134324-001">dob</item>
+                                    <item AppInfo="Northern Dong" ConceptLink="http://cdb.iso.org/lg/CDB-00134323-001">doc</item>
+                                    <item AppInfo="Doe" ConceptLink="http://cdb.iso.org/lg/CDB-00134322-001">doe</item>
+                                    <item AppInfo="Domu" ConceptLink="http://cdb.iso.org/lg/CDB-00134321-001">dof</item>
+                                    <item AppInfo="Dong" ConceptLink="http://cdb.iso.org/lg/CDB-00134320-001">doh</item>
+                                    <item AppInfo="Dogri" ConceptLink="http://cdb.iso.org/lg/CDB-00130993-001">doi</item>
+                                    <item AppInfo="Dondo" ConceptLink="http://cdb.iso.org/lg/CDB-00134311-001">dok</item>
+                                    <item AppInfo="Doso" ConceptLink="http://cdb.iso.org/lg/CDB-00134318-001">dol</item>
+                                    <item AppInfo="Toura" ConceptLink="http://cdb.iso.org/lg/CDB-00134326-001">don</item>
+                                    <item AppInfo="Dongo" ConceptLink="http://cdb.iso.org/lg/CDB-00134316-001">doo</item>
+                                    <item AppInfo="Lukpa" ConceptLink="http://cdb.iso.org/lg/CDB-00134315-001">dop</item>
+                                    <item AppInfo="Dominican Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134314-001">doq</item>
+                                    <item AppInfo="Dori'o" ConceptLink="http://cdb.iso.org/lg/CDB-00134313-001">dor</item>
+                                    <item AppInfo="DogosÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134333-001">dos</item>
+                                    <item AppInfo="Dass" ConceptLink="http://cdb.iso.org/lg/CDB-00134317-001">dot</item>
+                                    <item AppInfo="Dombe" ConceptLink="http://cdb.iso.org/lg/CDB-00134319-001">dov</item>
+                                    <item AppInfo="Doyayo" ConceptLink="http://cdb.iso.org/lg/CDB-00134341-001">dow</item>
+                                    <item AppInfo="Bussa" ConceptLink="http://cdb.iso.org/lg/CDB-00134340-001">dox</item>
+                                    <item AppInfo="Dompo" ConceptLink="http://cdb.iso.org/lg/CDB-00134339-001">doy</item>
+                                    <item AppInfo="Dorze" ConceptLink="http://cdb.iso.org/lg/CDB-00134338-001">doz</item>
+                                    <item AppInfo="Papar" ConceptLink="http://cdb.iso.org/lg/CDB-00134337-001">dpp</item>
+                                    <item AppInfo="Dair" ConceptLink="http://cdb.iso.org/lg/CDB-00134336-001">drb</item>
+                                    <item AppInfo="Darmiya" ConceptLink="http://cdb.iso.org/lg/CDB-00134327-001">drd</item>
+                                    <item AppInfo="Dolpo" ConceptLink="http://cdb.iso.org/lg/CDB-00134334-001">dre</item>
+                                    <item AppInfo="Rungus" ConceptLink="http://cdb.iso.org/lg/CDB-00134342-001">drg</item>
+                                    <item AppInfo="Darkhat" ConceptLink="http://cdb.iso.org/lg/CDB-00134332-001">drh</item>
+                                    <item AppInfo="C'lela" ConceptLink="http://cdb.iso.org/lg/CDB-00134331-001">dri</item>
+                                    <item AppInfo="Darling" ConceptLink="http://cdb.iso.org/lg/CDB-00134330-001">drl</item>
+                                    <item AppInfo="West Damar" ConceptLink="http://cdb.iso.org/lg/CDB-00134329-001">drn</item>
+                                    <item AppInfo="Daro-Matu Melanau" ConceptLink="http://cdb.iso.org/lg/CDB-00134328-001">dro</item>
+                                    <item AppInfo="Dura" ConceptLink="http://cdb.iso.org/lg/CDB-00138133-001">drq</item>
+                                    <item AppInfo="Dororo" ConceptLink="http://cdb.iso.org/lg/CDB-00138132-001">drr</item>
+                                    <item AppInfo="Gedeo" ConceptLink="http://cdb.iso.org/lg/CDB-00134230-001">drs</item>
+                                    <item AppInfo="Drents" ConceptLink="http://cdb.iso.org/lg/CDB-00134133-001">drt</item>
+                                    <item AppInfo="Rukai" ConceptLink="http://cdb.iso.org/lg/CDB-00134263-001">dru</item>
+                                    <item AppInfo="Darwazi" ConceptLink="http://cdb.iso.org/lg/CDB-00134161-001">drw</item>
+                                    <item AppInfo="Darai" ConceptLink="http://cdb.iso.org/lg/CDB-00134160-001">dry</item>
+                                    <item AppInfo="Lower Sorbian" ConceptLink="http://cdb.iso.org/lg/CDB-00134159-001">dsb</item>
+                                    <item AppInfo="Dutch Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134158-001">dse</item>
+                                    <item AppInfo="Daasanach" ConceptLink="http://cdb.iso.org/lg/CDB-00134157-001">dsh</item>
+                                    <item AppInfo="Disa" ConceptLink="http://cdb.iso.org/lg/CDB-00134148-001">dsi</item>
+                                    <item AppInfo="Danish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134155-001">dsl</item>
+                                    <item AppInfo="Dusner" ConceptLink="http://cdb.iso.org/lg/CDB-00134163-001">dsn</item>
+                                    <item AppInfo="Desiya" ConceptLink="http://cdb.iso.org/lg/CDB-00134153-001">dso</item>
+                                    <item AppInfo="Tadaksahak" ConceptLink="http://cdb.iso.org/lg/CDB-00134152-001">dsq</item>
+                                    <item AppInfo="Daur" ConceptLink="http://cdb.iso.org/lg/CDB-00134151-001">dta</item>
+                                    <item AppInfo="Labuk-Kinabatangan Kadazan" ConceptLink="http://cdb.iso.org/lg/CDB-00134150-001">dtb</item>
+                                    <item AppInfo="Ana Tinga Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134149-001">dti</item>
+                                    <item AppInfo="Tene Kan Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134171-001">dtk</item>
+                                    <item AppInfo="Tomo Kan Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134173-001">dtm</item>
+                                    <item AppInfo="Central Dusun" ConceptLink="http://cdb.iso.org/lg/CDB-00134156-001">dtp</item>
+                                    <item AppInfo="Lotud" ConceptLink="http://cdb.iso.org/lg/CDB-00134178-001">dtr</item>
+                                    <item AppInfo="Toro So Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134177-001">dts</item>
+                                    <item AppInfo="Toro Tegu Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134176-001">dtt</item>
+                                    <item AppInfo="Tebul Ure Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134175-001">dtu</item>
+                                    <item AppInfo="Duala" ConceptLink="http://cdb.iso.org/lg/CDB-00134174-001">dua</item>
+                                    <item AppInfo="Dubli" ConceptLink="http://cdb.iso.org/lg/CDB-00134164-001">dub</item>
+                                    <item AppInfo="Duna" ConceptLink="http://cdb.iso.org/lg/CDB-00134172-001">duc</item>
+                                    <item AppInfo="Hun-Saare" ConceptLink="http://cdb.iso.org/lg/CDB-00134180-001">dud</item>
+                                    <item AppInfo="Umiray Dumaget Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00134170-001">due</item>
+                                    <item AppInfo="Dumbea" ConceptLink="http://cdb.iso.org/lg/CDB-00134169-001">duf</item>
+                                    <item AppInfo="Duruma" ConceptLink="http://cdb.iso.org/lg/CDB-00134168-001">dug</item>
+                                    <item AppInfo="Dungra Bhil" ConceptLink="http://cdb.iso.org/lg/CDB-00134167-001">duh</item>
+                                    <item AppInfo="Dumun" ConceptLink="http://cdb.iso.org/lg/CDB-00134166-001">dui</item>
+                                    <item AppInfo="Dhuwal" ConceptLink="http://cdb.iso.org/lg/CDB-00134140-001">duj</item>
+                                    <item AppInfo="Duduela" ConceptLink="http://cdb.iso.org/lg/CDB-00134179-001">duk</item>
+                                    <item AppInfo="Alabat Island Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00134154-001">dul</item>
+                                    <item AppInfo="Middle Dutch" ConceptLink="http://cdb.iso.org/lg/CDB-00137903-001">dum</item>
+                                    <item AppInfo="Dusun Deyah" ConceptLink="http://cdb.iso.org/lg/CDB-00134130-001">dun</item>
+                                    <item AppInfo="Dupaninan Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00134129-001">duo</item>
+                                    <item AppInfo="Duano" ConceptLink="http://cdb.iso.org/lg/CDB-00134128-001">dup</item>
+                                    <item AppInfo="Dusun Malang" ConceptLink="http://cdb.iso.org/lg/CDB-00134127-001">duq</item>
+                                    <item AppInfo="Dii" ConceptLink="http://cdb.iso.org/lg/CDB-00134126-001">dur</item>
+                                    <item AppInfo="Dumi" ConceptLink="http://cdb.iso.org/lg/CDB-00134125-001">dus</item>
+                                    <item AppInfo="Drung" ConceptLink="http://cdb.iso.org/lg/CDB-00134116-001">duu</item>
+                                    <item AppInfo="Duvle" ConceptLink="http://cdb.iso.org/lg/CDB-00134123-001">duv</item>
+                                    <item AppInfo="Dusun Witu" ConceptLink="http://cdb.iso.org/lg/CDB-00134131-001">duw</item>
+                                    <item AppInfo="Duungooma" ConceptLink="http://cdb.iso.org/lg/CDB-00134121-001">dux</item>
+                                    <item AppInfo="Dicamay Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00138310-001">duy</item>
+                                    <item AppInfo="Duli" ConceptLink="http://cdb.iso.org/lg/CDB-00138309-001">duz</item>
+                                    <item AppInfo="Duau" ConceptLink="http://cdb.iso.org/lg/CDB-00134120-001">dva</item>
+                                    <item AppInfo="Diri" ConceptLink="http://cdb.iso.org/lg/CDB-00134119-001">dwa</item>
+                                    <item AppInfo="Walo Kumbe Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134118-001">dwl</item>
+                                    <item AppInfo="Dawro" ConceptLink="http://cdb.iso.org/lg/CDB-00134138-001">dwr</item>
+                                    <item AppInfo="Dutton World Speedwords" ConceptLink="http://cdb.iso.org/lg/CDB-00138351-001">dws</item>
+                                    <item AppInfo="Dawawa" ConceptLink="http://cdb.iso.org/lg/CDB-00134122-001">dww</item>
+                                    <item AppInfo="Dyan" ConceptLink="http://cdb.iso.org/lg/CDB-00134124-001">dya</item>
+                                    <item AppInfo="Dyaberdyaber" ConceptLink="http://cdb.iso.org/lg/CDB-00134146-001">dyb</item>
+                                    <item AppInfo="Dyugun" ConceptLink="http://cdb.iso.org/lg/CDB-00134145-001">dyd</item>
+                                    <item AppInfo="Villa Viciosa Agta" ConceptLink="http://cdb.iso.org/lg/CDB-00138340-001">dyg</item>
+                                    <item AppInfo="Djimini Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00134144-001">dyi</item>
+                                    <item AppInfo="Yanda Dom Dogon" ConceptLink="http://cdb.iso.org/lg/CDB-00134143-001">dym</item>
+                                    <item AppInfo="Dyangadi" ConceptLink="http://cdb.iso.org/lg/CDB-00134142-001">dyn</item>
+                                    <item AppInfo="Jola-Fonyi" ConceptLink="http://cdb.iso.org/lg/CDB-00134141-001">dyo</item>
+                                    <item AppInfo="Dyula" ConceptLink="http://cdb.iso.org/lg/CDB-00134132-001">dyu</item>
+                                    <item AppInfo="Dyaabugay" ConceptLink="http://cdb.iso.org/lg/CDB-00134139-001">dyy</item>
+                                    <item AppInfo="Tunzu" ConceptLink="http://cdb.iso.org/lg/CDB-00134147-001">dza</item>
+                                    <item AppInfo="Daza" ConceptLink="http://cdb.iso.org/lg/CDB-00134137-001">dzd</item>
+                                    <item AppInfo="Dazaga" ConceptLink="http://cdb.iso.org/lg/CDB-00134136-001">dzg</item>
+                                    <item AppInfo="Dzalakha" ConceptLink="http://cdb.iso.org/lg/CDB-00134135-001">dzl</item>
+                                    <item AppInfo="Dzando" ConceptLink="http://cdb.iso.org/lg/CDB-00134134-001">dzn</item>
+                                    <item AppInfo="Dzongkha; Bhutani; Butanese" ConceptLink="http://cdb.iso.org/lg/CDB-00138499-001">dzo</item>
+                                    <item AppInfo="Ebughu" ConceptLink="http://cdb.iso.org/lg/CDB-00134182-001">ebg</item>
+                                    <item AppInfo="Teke-Ebo" ConceptLink="http://cdb.iso.org/lg/CDB-00134117-001">ebo</item>
+                                    <item AppInfo="EbriÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134165-001">ebr</item>
+                                    <item AppInfo="Embu" ConceptLink="http://cdb.iso.org/lg/CDB-00134227-001">ebu</item>
+                                    <item AppInfo="Eteocretan" ConceptLink="http://cdb.iso.org/lg/CDB-00138418-001">ecr</item>
+                                    <item AppInfo="Ecuadorian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134226-001">ecs</item>
+                                    <item AppInfo="Eteocypriot" ConceptLink="http://cdb.iso.org/lg/CDB-00138415-001">ecy</item>
+                                    <item AppInfo="E" ConceptLink="http://cdb.iso.org/lg/CDB-00134225-001">eee</item>
+                                    <item AppInfo="Efai" ConceptLink="http://cdb.iso.org/lg/CDB-00134224-001">efa</item>
+                                    <item AppInfo="Efe" ConceptLink="http://cdb.iso.org/lg/CDB-00134223-001">efe</item>
+                                    <item AppInfo="Efik" ConceptLink="http://cdb.iso.org/lg/CDB-00134222-001">efi</item>
+                                    <item AppInfo="Ega" ConceptLink="http://cdb.iso.org/lg/CDB-00134213-001">ega</item>
+                                    <item AppInfo="Emilian" ConceptLink="http://cdb.iso.org/lg/CDB-00134220-001">egl</item>
+                                    <item AppInfo="Eggon" ConceptLink="http://cdb.iso.org/lg/CDB-00134228-001">ego</item>
+                                    <item AppInfo="Egyptian (Ancient)" ConceptLink="http://cdb.iso.org/lg/CDB-00138408-001">egy</item>
+                                    <item AppInfo="Ehueun" ConceptLink="http://cdb.iso.org/lg/CDB-00134218-001">ehu</item>
+                                    <item AppInfo="Eipomek" ConceptLink="http://cdb.iso.org/lg/CDB-00134217-001">eip</item>
+                                    <item AppInfo="Eitiep" ConceptLink="http://cdb.iso.org/lg/CDB-00134216-001">eit</item>
+                                    <item AppInfo="Askopan" ConceptLink="http://cdb.iso.org/lg/CDB-00134215-001">eiv</item>
+                                    <item AppInfo="Ejamat" ConceptLink="http://cdb.iso.org/lg/CDB-00134214-001">eja</item>
+                                    <item AppInfo="Ekajuk" ConceptLink="http://cdb.iso.org/lg/CDB-00134236-001">eka</item>
+                                    <item AppInfo="Ekit" ConceptLink="http://cdb.iso.org/lg/CDB-00134238-001">eke</item>
+                                    <item AppInfo="Ekari" ConceptLink="http://cdb.iso.org/lg/CDB-00134221-001">ekg</item>
+                                    <item AppInfo="Eki" ConceptLink="http://cdb.iso.org/lg/CDB-00134243-001">eki</item>
+                                    <item AppInfo="Standard Estonian" ConceptLink="http://cdb.iso.org/lg/CDB-00134242-001">ekk</item>
+                                    <item AppInfo="Kol" ConceptLink="http://cdb.iso.org/lg/CDB-00134241-001">ekl</item>
+                                    <item AppInfo="Elip" ConceptLink="http://cdb.iso.org/lg/CDB-00134240-001">ekm</item>
+                                    <item AppInfo="Koti" ConceptLink="http://cdb.iso.org/lg/CDB-00134239-001">eko</item>
+                                    <item AppInfo="Ekpeye" ConceptLink="http://cdb.iso.org/lg/CDB-00134229-001">ekp</item>
+                                    <item AppInfo="Yace" ConceptLink="http://cdb.iso.org/lg/CDB-00134237-001">ekr</item>
+                                    <item AppInfo="Eastern Kayah" ConceptLink="http://cdb.iso.org/lg/CDB-00134245-001">eky</item>
+                                    <item AppInfo="Elepi" ConceptLink="http://cdb.iso.org/lg/CDB-00134235-001">ele</item>
+                                    <item AppInfo="El Hugeirat" ConceptLink="http://cdb.iso.org/lg/CDB-00134234-001">elh</item>
+                                    <item AppInfo="Nding" ConceptLink="http://cdb.iso.org/lg/CDB-00134233-001">eli</item>
+                                    <item AppInfo="Elkei" ConceptLink="http://cdb.iso.org/lg/CDB-00134232-001">elk</item>
+                                    <item AppInfo="Modern Greek" ConceptLink="http://cdb.iso.org/lg/CDB-00138501-001">ell</item>
+                                    <item AppInfo="Eleme" ConceptLink="http://cdb.iso.org/lg/CDB-00134231-001">elm</item>
+                                    <item AppInfo="El Molo" ConceptLink="http://cdb.iso.org/lg/CDB-00134205-001">elo</item>
+                                    <item AppInfo="Elpaputih" ConceptLink="http://cdb.iso.org/lg/CDB-00134244-001">elp</item>
+                                    <item AppInfo="Elu" ConceptLink="http://cdb.iso.org/lg/CDB-00134219-001">elu</item>
+                                    <item AppInfo="Elamite" ConceptLink="http://cdb.iso.org/lg/CDB-00138425-001">elx</item>
+                                    <item AppInfo="Emai-Iuleha-Ora" ConceptLink="http://cdb.iso.org/lg/CDB-00134195-001">ema</item>
+                                    <item AppInfo="Embaloh" ConceptLink="http://cdb.iso.org/lg/CDB-00134194-001">emb</item>
+                                    <item AppInfo="Emerillon" ConceptLink="http://cdb.iso.org/lg/CDB-00134193-001">eme</item>
+                                    <item AppInfo="Eastern Meohang" ConceptLink="http://cdb.iso.org/lg/CDB-00134192-001">emg</item>
+                                    <item AppInfo="Mussau-Emira" ConceptLink="http://cdb.iso.org/lg/CDB-00134191-001">emi</item>
+                                    <item AppInfo="Eastern Maninkakan" ConceptLink="http://cdb.iso.org/lg/CDB-00134190-001">emk</item>
+                                    <item AppInfo="Mamulique" ConceptLink="http://cdb.iso.org/lg/CDB-00138276-001">emm</item>
+                                    <item AppInfo="Eman" ConceptLink="http://cdb.iso.org/lg/CDB-00134181-001">emn</item>
+                                    <item AppInfo="Emok" ConceptLink="http://cdb.iso.org/lg/CDB-00138275-001">emo</item>
+                                    <item AppInfo="Northern EmberÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00134188-001">emp</item>
+                                    <item AppInfo="Pacific Gulf Yupik" ConceptLink="http://cdb.iso.org/lg/CDB-00134196-001">ems</item>
+                                    <item AppInfo="Eastern Muria" ConceptLink="http://cdb.iso.org/lg/CDB-00134186-001">emu</item>
+                                    <item AppInfo="Emplawas" ConceptLink="http://cdb.iso.org/lg/CDB-00134185-001">emw</item>
+                                    <item AppInfo="Epigraphic Mayan" ConceptLink="http://cdb.iso.org/lg/CDB-00137979-001">emy</item>
+                                    <item AppInfo="Apali" ConceptLink="http://cdb.iso.org/lg/CDB-00134184-001">ena</item>
+                                    <item AppInfo="Markweeta" ConceptLink="http://cdb.iso.org/lg/CDB-00134183-001">enb</item>
+                                    <item AppInfo="En" ConceptLink="http://cdb.iso.org/lg/CDB-00134203-001">enc</item>
+                                    <item AppInfo="Ende" ConceptLink="http://cdb.iso.org/lg/CDB-00134187-001">end</item>
+                                    <item AppInfo="Forest Enets" ConceptLink="http://cdb.iso.org/lg/CDB-00134189-001">enf</item>
+                                    <item AppInfo="English" ConceptLink="http://cdb.iso.org/lg/CDB-00138502-001">eng</item>
+                                    <item AppInfo="Tundra Enets" ConceptLink="http://cdb.iso.org/lg/CDB-00134211-001">enh</item>
+                                    <item AppInfo="Middle English" ConceptLink="http://cdb.iso.org/lg/CDB-00137907-001">enm</item>
+                                    <item AppInfo="Engenni" ConceptLink="http://cdb.iso.org/lg/CDB-00134210-001">enn</item>
+                                    <item AppInfo="Enggano" ConceptLink="http://cdb.iso.org/lg/CDB-00134209-001">eno</item>
+                                    <item AppInfo="Enga" ConceptLink="http://cdb.iso.org/lg/CDB-00134208-001">enq</item>
+                                    <item AppInfo="Emumu" ConceptLink="http://cdb.iso.org/lg/CDB-00134207-001">enr</item>
+                                    <item AppInfo="Enu" ConceptLink="http://cdb.iso.org/lg/CDB-00134206-001">enu</item>
+                                    <item AppInfo="Enwan" ConceptLink="http://cdb.iso.org/lg/CDB-00134197-001">env</item>
+                                    <item AppInfo="Enwan" ConceptLink="http://cdb.iso.org/lg/CDB-00134204-001">enw</item>
+                                    <item AppInfo="Beti" ConceptLink="http://cdb.iso.org/lg/CDB-00134212-001">eot</item>
+                                    <item AppInfo="Epie" ConceptLink="http://cdb.iso.org/lg/CDB-00134202-001">epi</item>
+                                    <item AppInfo="Esperanto" ConceptLink="http://cdb.iso.org/lg/CDB-00138503-001">epo</item>
+                                    <item AppInfo="Eravallan" ConceptLink="http://cdb.iso.org/lg/CDB-00134201-001">era</item>
+                                    <item AppInfo="Sie" ConceptLink="http://cdb.iso.org/lg/CDB-00134200-001">erg</item>
+                                    <item AppInfo="Eruwa" ConceptLink="http://cdb.iso.org/lg/CDB-00134199-001">erh</item>
+                                    <item AppInfo="Ogea" ConceptLink="http://cdb.iso.org/lg/CDB-00134198-001">eri</item>
+                                    <item AppInfo="South Efate" ConceptLink="http://cdb.iso.org/lg/CDB-00134393-001">erk</item>
+                                    <item AppInfo="Horpa" ConceptLink="http://cdb.iso.org/lg/CDB-00134588-001">ero</item>
+                                    <item AppInfo="Erre" ConceptLink="http://cdb.iso.org/lg/CDB-00134360-001">err</item>
+                                    <item AppInfo="Ersu" ConceptLink="http://cdb.iso.org/lg/CDB-00134551-001">ers</item>
+                                    <item AppInfo="Eritai" ConceptLink="http://cdb.iso.org/lg/CDB-00134550-001">ert</item>
+                                    <item AppInfo="Erokwanas" ConceptLink="http://cdb.iso.org/lg/CDB-00134549-001">erw</item>
+                                    <item AppInfo="Ese Ejja" ConceptLink="http://cdb.iso.org/lg/CDB-00135038-001">ese</item>
+                                    <item AppInfo="Eshtehardi" ConceptLink="http://cdb.iso.org/lg/CDB-00135037-001">esh</item>
+                                    <item AppInfo="North Alaskan Inupiatun" ConceptLink="http://cdb.iso.org/lg/CDB-00135028-001">esi</item>
+                                    <item AppInfo="Northwest Alaska Inupiatun" ConceptLink="http://cdb.iso.org/lg/CDB-00135035-001">esk</item>
+                                    <item AppInfo="Egypt Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135043-001">esl</item>
+                                    <item AppInfo="Esuma" ConceptLink="http://cdb.iso.org/lg/CDB-00137936-001">esm</item>
+                                    <item AppInfo="Salvadoran Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135033-001">esn</item>
+                                    <item AppInfo="Estonian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135032-001">eso</item>
+                                    <item AppInfo="Esselen" ConceptLink="http://cdb.iso.org/lg/CDB-00137939-001">esq</item>
+                                    <item AppInfo="Central Siberian Yupik" ConceptLink="http://cdb.iso.org/lg/CDB-00135031-001">ess</item>
+                                    <item AppInfo="Estonian" ConceptLink="http://cdb.iso.org/lg/CDB-00138505-001">est</item>
+                                    <item AppInfo="Central Yupik" ConceptLink="http://cdb.iso.org/lg/CDB-00135030-001">esu</item>
+                                    <item AppInfo="Etebi" ConceptLink="http://cdb.iso.org/lg/CDB-00135050-001">etb</item>
+                                    <item AppInfo="Etchemin" ConceptLink="http://cdb.iso.org/lg/CDB-00137928-001">etc</item>
+                                    <item AppInfo="Ethiopian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135034-001">eth</item>
+                                    <item AppInfo="Eton" ConceptLink="http://cdb.iso.org/lg/CDB-00135036-001">etn</item>
+                                    <item AppInfo="Eton" ConceptLink="http://cdb.iso.org/lg/CDB-00135058-001">eto</item>
+                                    <item AppInfo="Edolo" ConceptLink="http://cdb.iso.org/lg/CDB-00135057-001">etr</item>
+                                    <item AppInfo="Yekhee" ConceptLink="http://cdb.iso.org/lg/CDB-00135056-001">ets</item>
+                                    <item AppInfo="Etruscan" ConceptLink="http://cdb.iso.org/lg/CDB-00138404-001">ett</item>
+                                    <item AppInfo="Ejagham" ConceptLink="http://cdb.iso.org/lg/CDB-00135055-001">etu</item>
+                                    <item AppInfo="Eten" ConceptLink="http://cdb.iso.org/lg/CDB-00135054-001">etx</item>
+                                    <item AppInfo="Semimi" ConceptLink="http://cdb.iso.org/lg/CDB-00135053-001">etz</item>
+                                    <item AppInfo="Basque" ConceptLink="http://cdb.iso.org/lg/CDB-00138506-001">eus</item>
+                                    <item AppInfo="Even" ConceptLink="http://cdb.iso.org/lg/CDB-00135044-001">eve</item>
+                                    <item AppInfo="Uvbie" ConceptLink="http://cdb.iso.org/lg/CDB-00135051-001">evh</item>
+                                    <item AppInfo="Evenki" ConceptLink="http://cdb.iso.org/lg/CDB-00135059-001">evn</item>
+                                    <item AppInfo="Ewe" ConceptLink="http://cdb.iso.org/lg/CDB-00138500-001">ewe</item>
+                                    <item AppInfo="Ewondo" ConceptLink="http://cdb.iso.org/lg/CDB-00135049-001">ewo</item>
+                                    <item AppInfo="Extremaduran" ConceptLink="http://cdb.iso.org/lg/CDB-00135048-001">ext</item>
+                                    <item AppInfo="Eyak" ConceptLink="http://cdb.iso.org/lg/CDB-00137918-001">eya</item>
+                                    <item AppInfo="Keiyo" ConceptLink="http://cdb.iso.org/lg/CDB-00135047-001">eyo</item>
+                                    <item AppInfo="Uzekwe" ConceptLink="http://cdb.iso.org/lg/CDB-00135046-001">eze</item>
+                                    <item AppInfo="Fasu" ConceptLink="http://cdb.iso.org/lg/CDB-00135045-001">faa</item>
+                                    <item AppInfo="Fa D'ambu" ConceptLink="http://cdb.iso.org/lg/CDB-00135107-001">fab</item>
+                                    <item AppInfo="Wagi" ConceptLink="http://cdb.iso.org/lg/CDB-00135157-001">fad</item>
+                                    <item AppInfo="Fagani" ConceptLink="http://cdb.iso.org/lg/CDB-00135077-001">faf</item>
+                                    <item AppInfo="Finongan" ConceptLink="http://cdb.iso.org/lg/CDB-00135139-001">fag</item>
+                                    <item AppInfo="Baissa Fali" ConceptLink="http://cdb.iso.org/lg/CDB-00135138-001">fah</item>
+                                    <item AppInfo="Faiwol" ConceptLink="http://cdb.iso.org/lg/CDB-00135137-001">fai</item>
+                                    <item AppInfo="Faita" ConceptLink="http://cdb.iso.org/lg/CDB-00135136-001">faj</item>
+                                    <item AppInfo="Fang" ConceptLink="http://cdb.iso.org/lg/CDB-00135135-001">fak</item>
+                                    <item AppInfo="South Fali" ConceptLink="http://cdb.iso.org/lg/CDB-00135126-001">fal</item>
+                                    <item AppInfo="Fam" ConceptLink="http://cdb.iso.org/lg/CDB-00135133-001">fam</item>
+                                    <item AppInfo="Fang" ConceptLink="http://cdb.iso.org/lg/CDB-00135141-001">fan</item>
+                                    <item AppInfo="Faroese; Faeroese" ConceptLink="http://cdb.iso.org/lg/CDB-00138511-001">fao</item>
+                                    <item AppInfo="Palor" ConceptLink="http://cdb.iso.org/lg/CDB-00135131-001">fap</item>
+                                    <item AppInfo="Fataleka" ConceptLink="http://cdb.iso.org/lg/CDB-00135130-001">far</item>
+                                    <item AppInfo="Farsi; Persian" ConceptLink="http://cdb.iso.org/lg/CDB-00138507-001">fas</item>
+                                    <item AppInfo="Fanti" ConceptLink="http://cdb.iso.org/lg/CDB-00135129-001">fat</item>
+                                    <item AppInfo="Fayu" ConceptLink="http://cdb.iso.org/lg/CDB-00135128-001">fau</item>
+                                    <item AppInfo="Fala" ConceptLink="http://cdb.iso.org/lg/CDB-00135127-001">fax</item>
+                                    <item AppInfo="Southwestern Fars" ConceptLink="http://cdb.iso.org/lg/CDB-00135149-001">fay</item>
+                                    <item AppInfo="Northwestern Fars" ConceptLink="http://cdb.iso.org/lg/CDB-00135151-001">faz</item>
+                                    <item AppInfo="Quebec Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135134-001">fcs</item>
+                                    <item AppInfo="Feroge" ConceptLink="http://cdb.iso.org/lg/CDB-00135156-001">fer</item>
+                                    <item AppInfo="Foia Foia" ConceptLink="http://cdb.iso.org/lg/CDB-00135155-001">ffi</item>
+                                    <item AppInfo="Maasina Fulfulde" ConceptLink="http://cdb.iso.org/lg/CDB-00135154-001">ffm</item>
+                                    <item AppInfo="Fongoro" ConceptLink="http://cdb.iso.org/lg/CDB-00135153-001">fgr</item>
+                                    <item AppInfo="Nobiin" ConceptLink="http://cdb.iso.org/lg/CDB-00135152-001">fia</item>
+                                    <item AppInfo="Fyer" ConceptLink="http://cdb.iso.org/lg/CDB-00135142-001">fie</item>
+                                    <item AppInfo="Fijian" ConceptLink="http://cdb.iso.org/lg/CDB-00138510-001">fij</item>
+                                    <item AppInfo="Filipino; Pilipino" ConceptLink="http://cdb.iso.org/lg/CDB-00135150-001">fil</item>
+                                    <item AppInfo="Finnish" ConceptLink="http://cdb.iso.org/lg/CDB-00138509-001">fin</item>
+                                    <item AppInfo="Fipa" ConceptLink="http://cdb.iso.org/lg/CDB-00135158-001">fip</item>
+                                    <item AppInfo="Firan" ConceptLink="http://cdb.iso.org/lg/CDB-00135148-001">fir</item>
+                                    <item AppInfo="Tornedalen Finnish" ConceptLink="http://cdb.iso.org/lg/CDB-00135147-001">fit</item>
+                                    <item AppInfo="Fiwaga" ConceptLink="http://cdb.iso.org/lg/CDB-00135146-001">fiw</item>
+                                    <item AppInfo="Kven Finnish" ConceptLink="http://cdb.iso.org/lg/CDB-00135145-001">fkv</item>
+                                    <item AppInfo="Kalispel-Pend d'Oreille" ConceptLink="http://cdb.iso.org/lg/CDB-00135144-001">fla</item>
+                                    <item AppInfo="Foau" ConceptLink="http://cdb.iso.org/lg/CDB-00135143-001">flh</item>
+                                    <item AppInfo="Fali" ConceptLink="http://cdb.iso.org/lg/CDB-00135124-001">fli</item>
+                                    <item AppInfo="North Fali" ConceptLink="http://cdb.iso.org/lg/CDB-00135099-001">fll</item>
+                                    <item AppInfo="Flinders Island" ConceptLink="http://cdb.iso.org/lg/CDB-00135132-001">fln</item>
+                                    <item AppInfo="Fuliiru" ConceptLink="http://cdb.iso.org/lg/CDB-00135106-001">flr</item>
+                                    <item AppInfo="Tsotsitaal" ConceptLink="http://cdb.iso.org/lg/CDB-00135105-001">fly</item>
+                                    <item AppInfo="Fe'fe'" ConceptLink="http://cdb.iso.org/lg/CDB-00135104-001">fmp</item>
+                                    <item AppInfo="Far Western Muria" ConceptLink="http://cdb.iso.org/lg/CDB-00135103-001">fmu</item>
+                                    <item AppInfo="Fanagalo" ConceptLink="http://cdb.iso.org/lg/CDB-00135102-001">fng</item>
+                                    <item AppInfo="Fania" ConceptLink="http://cdb.iso.org/lg/CDB-00135093-001">fni</item>
+                                    <item AppInfo="Foodo" ConceptLink="http://cdb.iso.org/lg/CDB-00135100-001">fod</item>
+                                    <item AppInfo="Foi" ConceptLink="http://cdb.iso.org/lg/CDB-00135108-001">foi</item>
+                                    <item AppInfo="Foma" ConceptLink="http://cdb.iso.org/lg/CDB-00135098-001">fom</item>
+                                    <item AppInfo="Fon" ConceptLink="http://cdb.iso.org/lg/CDB-00135097-001">fon</item>
+                                    <item AppInfo="Fore" ConceptLink="http://cdb.iso.org/lg/CDB-00135096-001">for</item>
+                                    <item AppInfo="Siraya" ConceptLink="http://cdb.iso.org/lg/CDB-00137958-001">fos</item>
+                                    <item AppInfo="Fernando Po Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00135095-001">fpe</item>
+                                    <item AppInfo="Fas" ConceptLink="http://cdb.iso.org/lg/CDB-00135094-001">fqs</item>
+                                    <item AppInfo="French" ConceptLink="http://cdb.iso.org/lg/CDB-00138512-001">fra</item>
+                                    <item AppInfo="Cajun French" ConceptLink="http://cdb.iso.org/lg/CDB-00135116-001">frc</item>
+                                    <item AppInfo="Fordata" ConceptLink="http://cdb.iso.org/lg/CDB-00135118-001">frd</item>
+                                    <item AppInfo="Frankish" ConceptLink="http://cdb.iso.org/lg/CDB-00137963-001">frk</item>
+                                    <item AppInfo="Middle French" ConceptLink="http://cdb.iso.org/lg/CDB-00137862-001">frm</item>
+                                    <item AppInfo="Old French" ConceptLink="http://cdb.iso.org/lg/CDB-00137860-001">fro</item>
+                                    <item AppInfo="Franco-ProvenÃ§al" ConceptLink="http://cdb.iso.org/lg/CDB-00135101-001">frp</item>
+                                    <item AppInfo="Forak" ConceptLink="http://cdb.iso.org/lg/CDB-00135123-001">frq</item>
+                                    <item AppInfo="Northern Frisian" ConceptLink="http://cdb.iso.org/lg/CDB-00135122-001">frr</item>
+                                    <item AppInfo="Eastern Frisian" ConceptLink="http://cdb.iso.org/lg/CDB-00135121-001">frs</item>
+                                    <item AppInfo="Fortsenal" ConceptLink="http://cdb.iso.org/lg/CDB-00135120-001">frt</item>
+                                    <item AppInfo="Western Frisian" ConceptLink="http://cdb.iso.org/lg/CDB-00138513-001">fry</item>
+                                    <item AppInfo="Finnish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135119-001">fse</item>
+                                    <item AppInfo="French Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135109-001">fsl</item>
+                                    <item AppInfo="Finland-Swedish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135117-001">fss</item>
+                                    <item AppInfo="Adamawa Fulfulde" ConceptLink="http://cdb.iso.org/lg/CDB-00135125-001">fub</item>
+                                    <item AppInfo="Pulaar" ConceptLink="http://cdb.iso.org/lg/CDB-00135115-001">fuc</item>
+                                    <item AppInfo="East Futuna" ConceptLink="http://cdb.iso.org/lg/CDB-00135114-001">fud</item>
+                                    <item AppInfo="Borgu Fulfulde" ConceptLink="http://cdb.iso.org/lg/CDB-00135113-001">fue</item>
+                                    <item AppInfo="Pular" ConceptLink="http://cdb.iso.org/lg/CDB-00135112-001">fuf</item>
+                                    <item AppInfo="Western Niger Fulfulde" ConceptLink="http://cdb.iso.org/lg/CDB-00135111-001">fuh</item>
+                                    <item AppInfo="Bagirmi Fulfulde" ConceptLink="http://cdb.iso.org/lg/CDB-00135012-001">fui</item>
+                                    <item AppInfo="Ko" ConceptLink="http://cdb.iso.org/lg/CDB-00135140-001">fuj</item>
+                                    <item AppInfo="Fulah; Fula; Fulani; Fulfulde; Peul" ConceptLink="http://cdb.iso.org/lg/CDB-00138508-001">ful</item>
+                                    <item AppInfo="Fum" ConceptLink="http://cdb.iso.org/lg/CDB-00135029-001">fum</item>
+                                    <item AppInfo="FulniÃŽ" ConceptLink="http://cdb.iso.org/lg/CDB-00134944-001">fun</item>
+                                    <item AppInfo="Central-Eastern Niger Fulfulde" ConceptLink="http://cdb.iso.org/lg/CDB-00134943-001">fuq</item>
+                                    <item AppInfo="Friulian" ConceptLink="http://cdb.iso.org/lg/CDB-00134942-001">fur</item>
+                                    <item AppInfo="Futuna-Aniwa" ConceptLink="http://cdb.iso.org/lg/CDB-00134941-001">fut</item>
+                                    <item AppInfo="Furu" ConceptLink="http://cdb.iso.org/lg/CDB-00134940-001">fuu</item>
+                                    <item AppInfo="Nigerian Fulfulde" ConceptLink="http://cdb.iso.org/lg/CDB-00134939-001">fuv</item>
+                                    <item AppInfo="Fuyug" ConceptLink="http://cdb.iso.org/lg/CDB-00134930-001">fuy</item>
+                                    <item AppInfo="Fur" ConceptLink="http://cdb.iso.org/lg/CDB-00134937-001">fvr</item>
+                                    <item AppInfo="FwÃ¢i" ConceptLink="http://cdb.iso.org/lg/CDB-00134945-001">fwa</item>
+                                    <item AppInfo="Fwe" ConceptLink="http://cdb.iso.org/lg/CDB-00134935-001">fwe</item>
+                                    <item AppInfo="Ga" ConceptLink="http://cdb.iso.org/lg/CDB-00134934-001">gaa</item>
+                                    <item AppInfo="Gabri" ConceptLink="http://cdb.iso.org/lg/CDB-00134933-001">gab</item>
+                                    <item AppInfo="Gaddang" ConceptLink="http://cdb.iso.org/lg/CDB-00134932-001">gad</item>
+                                    <item AppInfo="Guarequena" ConceptLink="http://cdb.iso.org/lg/CDB-00134931-001">gae</item>
+                                    <item AppInfo="Gende" ConceptLink="http://cdb.iso.org/lg/CDB-00134953-001">gaf</item>
+                                    <item AppInfo="Gagauz" ConceptLink="http://cdb.iso.org/lg/CDB-00134955-001">gag</item>
+                                    <item AppInfo="Alekano" ConceptLink="http://cdb.iso.org/lg/CDB-00134938-001">gah</item>
+                                    <item AppInfo="Borei" ConceptLink="http://cdb.iso.org/lg/CDB-00134960-001">gai</item>
+                                    <item AppInfo="Gadsup" ConceptLink="http://cdb.iso.org/lg/CDB-00134959-001">gaj</item>
+                                    <item AppInfo="Gamkonora" ConceptLink="http://cdb.iso.org/lg/CDB-00134958-001">gak</item>
+                                    <item AppInfo="Galoli" ConceptLink="http://cdb.iso.org/lg/CDB-00134957-001">gal</item>
+                                    <item AppInfo="Kandawo" ConceptLink="http://cdb.iso.org/lg/CDB-00134956-001">gam</item>
+                                    <item AppInfo="Gan Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00134946-001">gan</item>
+                                    <item AppInfo="Gants" ConceptLink="http://cdb.iso.org/lg/CDB-00134954-001">gao</item>
+                                    <item AppInfo="Gal" ConceptLink="http://cdb.iso.org/lg/CDB-00134962-001">gap</item>
+                                    <item AppInfo="Gata'" ConceptLink="http://cdb.iso.org/lg/CDB-00134952-001">gaq</item>
+                                    <item AppInfo="Galeya" ConceptLink="http://cdb.iso.org/lg/CDB-00134951-001">gar</item>
+                                    <item AppInfo="Adiwasi Garasia" ConceptLink="http://cdb.iso.org/lg/CDB-00134950-001">gas</item>
+                                    <item AppInfo="Kenati" ConceptLink="http://cdb.iso.org/lg/CDB-00134949-001">gat</item>
+                                    <item AppInfo="Mudhili Gadaba" ConceptLink="http://cdb.iso.org/lg/CDB-00134948-001">gau</item>
+                                    <item AppInfo="Gabutamon" ConceptLink="http://cdb.iso.org/lg/CDB-00134922-001">gav</item>
+                                    <item AppInfo="Nobonob" ConceptLink="http://cdb.iso.org/lg/CDB-00134961-001">gaw</item>
+                                    <item AppInfo="Borana-Arsi-Guji Oromo" ConceptLink="http://cdb.iso.org/lg/CDB-00134936-001">gax</item>
+                                    <item AppInfo="Gayo" ConceptLink="http://cdb.iso.org/lg/CDB-00134912-001">gay</item>
+                                    <item AppInfo="West Central Oromo" ConceptLink="http://cdb.iso.org/lg/CDB-00134911-001">gaz</item>
+                                    <item AppInfo="Gbaya" ConceptLink="http://cdb.iso.org/lg/CDB-00130985-001">gba</item>
+                                    <item AppInfo="Kaytetye" ConceptLink="http://cdb.iso.org/lg/CDB-00134910-001">gbb</item>
+                                    <item AppInfo="Garawa" ConceptLink="http://cdb.iso.org/lg/CDB-00134909-001">gbc</item>
+                                    <item AppInfo="Karadjeri" ConceptLink="http://cdb.iso.org/lg/CDB-00134908-001">gbd</item>
+                                    <item AppInfo="Niksek" ConceptLink="http://cdb.iso.org/lg/CDB-00134907-001">gbe</item>
+                                    <item AppInfo="Gaikundi" ConceptLink="http://cdb.iso.org/lg/CDB-00134898-001">gbf</item>
+                                    <item AppInfo="Gbanziri" ConceptLink="http://cdb.iso.org/lg/CDB-00134905-001">gbg</item>
+                                    <item AppInfo="Defi Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00134913-001">gbh</item>
+                                    <item AppInfo="Galela" ConceptLink="http://cdb.iso.org/lg/CDB-00134903-001">gbi</item>
+                                    <item AppInfo="Bodo Gadaba" ConceptLink="http://cdb.iso.org/lg/CDB-00134902-001">gbj</item>
+                                    <item AppInfo="Gaddi" ConceptLink="http://cdb.iso.org/lg/CDB-00134901-001">gbk</item>
+                                    <item AppInfo="Gamit" ConceptLink="http://cdb.iso.org/lg/CDB-00134900-001">gbl</item>
+                                    <item AppInfo="Garhwali" ConceptLink="http://cdb.iso.org/lg/CDB-00134920-001">gbm</item>
+                                    <item AppInfo="Mo'da" ConceptLink="http://cdb.iso.org/lg/CDB-00134904-001">gbn</item>
+                                    <item AppInfo="Northern Grebo" ConceptLink="http://cdb.iso.org/lg/CDB-00134906-001">gbo</item>
+                                    <item AppInfo="Gbaya-Bossangoa" ConceptLink="http://cdb.iso.org/lg/CDB-00134928-001">gbp</item>
+                                    <item AppInfo="Gbaya-Bozoum" ConceptLink="http://cdb.iso.org/lg/CDB-00134927-001">gbq</item>
+                                    <item AppInfo="Gbagyi" ConceptLink="http://cdb.iso.org/lg/CDB-00134926-001">gbr</item>
+                                    <item AppInfo="Gbesi Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00134925-001">gbs</item>
+                                    <item AppInfo="Gagadu" ConceptLink="http://cdb.iso.org/lg/CDB-00134924-001">gbu</item>
+                                    <item AppInfo="Gbanu" ConceptLink="http://cdb.iso.org/lg/CDB-00134923-001">gbv</item>
+                                    <item AppInfo="Eastern Xwla Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00134914-001">gbx</item>
+                                    <item AppInfo="Gbari" ConceptLink="http://cdb.iso.org/lg/CDB-00134921-001">gby</item>
+                                    <item AppInfo="Zoroastrian Dari" ConceptLink="http://cdb.iso.org/lg/CDB-00134929-001">gbz</item>
+                                    <item AppInfo="Mali" ConceptLink="http://cdb.iso.org/lg/CDB-00134919-001">gcc</item>
+                                    <item AppInfo="Ganggalida" ConceptLink="http://cdb.iso.org/lg/CDB-00134918-001">gcd</item>
+                                    <item AppInfo="Galice" ConceptLink="http://cdb.iso.org/lg/CDB-00138267-001">gce</item>
+                                    <item AppInfo="Guadeloupean Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00134917-001">gcf</item>
+                                    <item AppInfo="Grenadian Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00134916-001">gcl</item>
+                                    <item AppInfo="Gaina" ConceptLink="http://cdb.iso.org/lg/CDB-00134964-001">gcn</item>
+                                    <item AppInfo="Guianese Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00134899-001">gcr</item>
+                                    <item AppInfo="Colonia Tovar German" ConceptLink="http://cdb.iso.org/lg/CDB-00134947-001">gct</item>
+                                    <item AppInfo="Gade Lohar" ConceptLink="http://cdb.iso.org/lg/CDB-00135009-001">gda</item>
+                                    <item AppInfo="Pottangi Ollar Gadaba" ConceptLink="http://cdb.iso.org/lg/CDB-00135008-001">gdb</item>
+                                    <item AppInfo="Gugu Badhun" ConceptLink="http://cdb.iso.org/lg/CDB-00135007-001">gdc</item>
+                                    <item AppInfo="Gedaged" ConceptLink="http://cdb.iso.org/lg/CDB-00135006-001">gdd</item>
+                                    <item AppInfo="Gude" ConceptLink="http://cdb.iso.org/lg/CDB-00135005-001">gde</item>
+                                    <item AppInfo="Guduf-Gava" ConceptLink="http://cdb.iso.org/lg/CDB-00135004-001">gdf</item>
+                                    <item AppInfo="Ga'dang" ConceptLink="http://cdb.iso.org/lg/CDB-00134995-001">gdg</item>
+                                    <item AppInfo="Gadjerawang" ConceptLink="http://cdb.iso.org/lg/CDB-00135002-001">gdh</item>
+                                    <item AppInfo="Gundi" ConceptLink="http://cdb.iso.org/lg/CDB-00135010-001">gdi</item>
+                                    <item AppInfo="Gurdjar" ConceptLink="http://cdb.iso.org/lg/CDB-00135000-001">gdj</item>
+                                    <item AppInfo="Gadang" ConceptLink="http://cdb.iso.org/lg/CDB-00134999-001">gdk</item>
+                                    <item AppInfo="Dirasha" ConceptLink="http://cdb.iso.org/lg/CDB-00134548-001">gdl</item>
+                                    <item AppInfo="Laal" ConceptLink="http://cdb.iso.org/lg/CDB-00134547-001">gdm</item>
+                                    <item AppInfo="Umanakaina" ConceptLink="http://cdb.iso.org/lg/CDB-00134538-001">gdn</item>
+                                    <item AppInfo="Ghodoberi" ConceptLink="http://cdb.iso.org/lg/CDB-00134545-001">gdo</item>
+                                    <item AppInfo="Mehri" ConceptLink="http://cdb.iso.org/lg/CDB-00134553-001">gdq</item>
+                                    <item AppInfo="Wipi" ConceptLink="http://cdb.iso.org/lg/CDB-00134543-001">gdr</item>
+                                    <item AppInfo="Gudu" ConceptLink="http://cdb.iso.org/lg/CDB-00134542-001">gdu</item>
+                                    <item AppInfo="Godwari" ConceptLink="http://cdb.iso.org/lg/CDB-00134541-001">gdx</item>
+                                    <item AppInfo="Geruma" ConceptLink="http://cdb.iso.org/lg/CDB-00134540-001">gea</item>
+                                    <item AppInfo="Kire" ConceptLink="http://cdb.iso.org/lg/CDB-00134539-001">geb</item>
+                                    <item AppInfo="Gboloo Grebo" ConceptLink="http://cdb.iso.org/lg/CDB-00134561-001">gec</item>
+                                    <item AppInfo="Gade" ConceptLink="http://cdb.iso.org/lg/CDB-00134563-001">ged</item>
+                                    <item AppInfo="Gengle" ConceptLink="http://cdb.iso.org/lg/CDB-00134546-001">geg</item>
+                                    <item AppInfo="Hutterite German" ConceptLink="http://cdb.iso.org/lg/CDB-00134568-001">geh</item>
+                                    <item AppInfo="Gebe" ConceptLink="http://cdb.iso.org/lg/CDB-00134567-001">gei</item>
+                                    <item AppInfo="Gen" ConceptLink="http://cdb.iso.org/lg/CDB-00134566-001">gej</item>
+                                    <item AppInfo="Yiwom" ConceptLink="http://cdb.iso.org/lg/CDB-00134565-001">gek</item>
+                                    <item AppInfo="Kag-Fer-Jiir-Koor-Ror-Us-Zuksun" ConceptLink="http://cdb.iso.org/lg/CDB-00134564-001">gel</item>
+                                    <item AppInfo="Geme" ConceptLink="http://cdb.iso.org/lg/CDB-00134554-001">geq</item>
+                                    <item AppInfo="Geser-Gorom" ConceptLink="http://cdb.iso.org/lg/CDB-00134562-001">ges</item>
+                                    <item AppInfo="Gera" ConceptLink="http://cdb.iso.org/lg/CDB-00134570-001">gew</item>
+                                    <item AppInfo="Garre" ConceptLink="http://cdb.iso.org/lg/CDB-00134560-001">gex</item>
+                                    <item AppInfo="Enya" ConceptLink="http://cdb.iso.org/lg/CDB-00134559-001">gey</item>
+                                    <item AppInfo="Geez" ConceptLink="http://cdb.iso.org/lg/CDB-00138422-001">gez</item>
+                                    <item AppInfo="Patpatar" ConceptLink="http://cdb.iso.org/lg/CDB-00134558-001">gfk</item>
+                                    <item AppInfo="Gafat" ConceptLink="http://cdb.iso.org/lg/CDB-00138010-001">gft</item>
+                                    <item AppInfo="Gao" ConceptLink="http://cdb.iso.org/lg/CDB-00134557-001">gga</item>
+                                    <item AppInfo="Gbii" ConceptLink="http://cdb.iso.org/lg/CDB-00134556-001">ggb</item>
+                                    <item AppInfo="Gugadj" ConceptLink="http://cdb.iso.org/lg/CDB-00134530-001">ggd</item>
+                                    <item AppInfo="Guragone" ConceptLink="http://cdb.iso.org/lg/CDB-00134569-001">gge</item>
+                                    <item AppInfo="Gurgula" ConceptLink="http://cdb.iso.org/lg/CDB-00134544-001">ggg</item>
+                                    <item AppInfo="Kungarakany" ConceptLink="http://cdb.iso.org/lg/CDB-00137925-001">ggk</item>
+                                    <item AppInfo="Ganglau" ConceptLink="http://cdb.iso.org/lg/CDB-00134520-001">ggl</item>
+                                    <item AppInfo="Eastern Gurung" ConceptLink="http://cdb.iso.org/lg/CDB-00134519-001">ggn</item>
+                                    <item AppInfo="Southern Gondi" ConceptLink="http://cdb.iso.org/lg/CDB-00134518-001">ggo</item>
+                                    <item AppInfo="Aghu Tharnggalu" ConceptLink="http://cdb.iso.org/lg/CDB-00137923-001">ggr</item>
+                                    <item AppInfo="Gitua" ConceptLink="http://cdb.iso.org/lg/CDB-00134517-001">ggt</item>
+                                    <item AppInfo="Gagu" ConceptLink="http://cdb.iso.org/lg/CDB-00134516-001">ggu</item>
+                                    <item AppInfo="Gogodala" ConceptLink="http://cdb.iso.org/lg/CDB-00134515-001">ggw</item>
+                                    <item AppInfo="GhadamÃšs" ConceptLink="http://cdb.iso.org/lg/CDB-00134506-001">gha</item>
+                                    <item AppInfo="Hiberno-Scottish Gaelic" ConceptLink="http://cdb.iso.org/lg/CDB-00137954-001">ghc</item>
+                                    <item AppInfo="Southern Ghale" ConceptLink="http://cdb.iso.org/lg/CDB-00134513-001">ghe</item>
+                                    <item AppInfo="Northern Ghale" ConceptLink="http://cdb.iso.org/lg/CDB-00134521-001">ghh</item>
+                                    <item AppInfo="Geko Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00134511-001">ghk</item>
+                                    <item AppInfo="Ghulfan" ConceptLink="http://cdb.iso.org/lg/CDB-00134510-001">ghl</item>
+                                    <item AppInfo="Ghanongga" ConceptLink="http://cdb.iso.org/lg/CDB-00134509-001">ghn</item>
+                                    <item AppInfo="Ghomara" ConceptLink="http://cdb.iso.org/lg/CDB-00137945-001">gho</item>
+                                    <item AppInfo="Ghera" ConceptLink="http://cdb.iso.org/lg/CDB-00134508-001">ghr</item>
+                                    <item AppInfo="Guhu-Samane" ConceptLink="http://cdb.iso.org/lg/CDB-00134528-001">ghs</item>
+                                    <item AppInfo="Kutang Ghale" ConceptLink="http://cdb.iso.org/lg/CDB-00134512-001">ght</item>
+                                    <item AppInfo="Kitja" ConceptLink="http://cdb.iso.org/lg/CDB-00134514-001">gia</item>
+                                    <item AppInfo="Gibanawa" ConceptLink="http://cdb.iso.org/lg/CDB-00134536-001">gib</item>
+                                    <item AppInfo="Gail" ConceptLink="http://cdb.iso.org/lg/CDB-00134535-001">gic</item>
+                                    <item AppInfo="Gidar" ConceptLink="http://cdb.iso.org/lg/CDB-00134534-001">gid</item>
+                                    <item AppInfo="Goaria" ConceptLink="http://cdb.iso.org/lg/CDB-00134533-001">gig</item>
+                                    <item AppInfo="Gilbertese" ConceptLink="http://cdb.iso.org/lg/CDB-00134532-001">gil</item>
+                                    <item AppInfo="Gimi" ConceptLink="http://cdb.iso.org/lg/CDB-00134531-001">gim</item>
+                                    <item AppInfo="Hinukh" ConceptLink="http://cdb.iso.org/lg/CDB-00134522-001">gin</item>
+                                    <item AppInfo="Gelao" ConceptLink="http://cdb.iso.org/lg/CDB-00134529-001">gio</item>
+                                    <item AppInfo="Gimi" ConceptLink="http://cdb.iso.org/lg/CDB-00134537-001">gip</item>
+                                    <item AppInfo="Green Gelao" ConceptLink="http://cdb.iso.org/lg/CDB-00134527-001">giq</item>
+                                    <item AppInfo="Red Gelao" ConceptLink="http://cdb.iso.org/lg/CDB-00134526-001">gir</item>
+                                    <item AppInfo="North Giziga" ConceptLink="http://cdb.iso.org/lg/CDB-00134525-001">gis</item>
+                                    <item AppInfo="Gitxsan" ConceptLink="http://cdb.iso.org/lg/CDB-00134524-001">git</item>
+                                    <item AppInfo="White Gelao" ConceptLink="http://cdb.iso.org/lg/CDB-00134523-001">giw</item>
+                                    <item AppInfo="Gilima" ConceptLink="http://cdb.iso.org/lg/CDB-00134585-001">gix</item>
+                                    <item AppInfo="Giyug" ConceptLink="http://cdb.iso.org/lg/CDB-00134635-001">giy</item>
+                                    <item AppInfo="South Giziga" ConceptLink="http://cdb.iso.org/lg/CDB-00134555-001">giz</item>
+                                    <item AppInfo="Geji" ConceptLink="http://cdb.iso.org/lg/CDB-00134617-001">gji</item>
+                                    <item AppInfo="Kachi Koli" ConceptLink="http://cdb.iso.org/lg/CDB-00134616-001">gjk</item>
+                                    <item AppInfo="Gonja" ConceptLink="http://cdb.iso.org/lg/CDB-00134615-001">gjn</item>
+                                    <item AppInfo="Gujari" ConceptLink="http://cdb.iso.org/lg/CDB-00134614-001">gju</item>
+                                    <item AppInfo="Guya" ConceptLink="http://cdb.iso.org/lg/CDB-00134613-001">gka</item>
+                                    <item AppInfo="Ndai" ConceptLink="http://cdb.iso.org/lg/CDB-00134604-001">gke</item>
+                                    <item AppInfo="Gokana" ConceptLink="http://cdb.iso.org/lg/CDB-00134611-001">gkn</item>
+                                    <item AppInfo="Guinea Kpelle" ConceptLink="http://cdb.iso.org/lg/CDB-00134619-001">gkp</item>
+                                    <item AppInfo="Gaelic; Scottish Gaelic" ConceptLink="http://cdb.iso.org/lg/CDB-00138515-001">gla</item>
+                                    <item AppInfo="Bon Gula" ConceptLink="http://cdb.iso.org/lg/CDB-00134609-001">glc</item>
+                                    <item AppInfo="Nanai" ConceptLink="http://cdb.iso.org/lg/CDB-00134608-001">gld</item>
+                                    <item AppInfo="Irish" ConceptLink="http://cdb.iso.org/lg/CDB-00138514-001">gle</item>
+                                    <item AppInfo="Galician" ConceptLink="http://cdb.iso.org/lg/CDB-00138516-001">glg</item>
+                                    <item AppInfo="Northwest Pashayi" ConceptLink="http://cdb.iso.org/lg/CDB-00134607-001">glh</item>
+                                    <item AppInfo="Guliguli" ConceptLink="http://cdb.iso.org/lg/CDB-00138080-001">gli</item>
+                                    <item AppInfo="Gula Iro" ConceptLink="http://cdb.iso.org/lg/CDB-00134606-001">glj</item>
+                                    <item AppInfo="Gilaki" ConceptLink="http://cdb.iso.org/lg/CDB-00134605-001">glk</item>
+                                    <item AppInfo="Galambu" ConceptLink="http://cdb.iso.org/lg/CDB-00134627-001">glo</item>
+                                    <item AppInfo="Glaro-Twabo" ConceptLink="http://cdb.iso.org/lg/CDB-00134629-001">glr</item>
+                                    <item AppInfo="Gula" ConceptLink="http://cdb.iso.org/lg/CDB-00134612-001">glu</item>
+                                    <item AppInfo="Manx" ConceptLink="http://cdb.iso.org/lg/CDB-00138519-001">glv</item>
+                                    <item AppInfo="Glavda" ConceptLink="http://cdb.iso.org/lg/CDB-00134634-001">glw</item>
+                                    <item AppInfo="Gule" ConceptLink="http://cdb.iso.org/lg/CDB-00138073-001">gly</item>
+                                    <item AppInfo="Gambera" ConceptLink="http://cdb.iso.org/lg/CDB-00134633-001">gma</item>
+                                    <item AppInfo="Gula'alaa" ConceptLink="http://cdb.iso.org/lg/CDB-00134632-001">gmb</item>
+                                    <item AppInfo="MÃ¡ghdÄ" ConceptLink="http://cdb.iso.org/lg/CDB-00134631-001">gmd</item>
+                                    <item AppInfo="Middle High German" ConceptLink="http://cdb.iso.org/lg/CDB-00137898-001">gmh</item>
+                                    <item AppInfo="Middle Low German" ConceptLink="http://cdb.iso.org/lg/CDB-00137895-001">gml</item>
+                                    <item AppInfo="Gbaya-Mbodomo" ConceptLink="http://cdb.iso.org/lg/CDB-00134630-001">gmm</item>
+                                    <item AppInfo="Gimnime" ConceptLink="http://cdb.iso.org/lg/CDB-00134620-001">gmn</item>
+                                    <item AppInfo="Gumalu" ConceptLink="http://cdb.iso.org/lg/CDB-00134628-001">gmu</item>
+                                    <item AppInfo="Gamo" ConceptLink="http://cdb.iso.org/lg/CDB-00134636-001">gmv</item>
+                                    <item AppInfo="Magoma" ConceptLink="http://cdb.iso.org/lg/CDB-00134626-001">gmx</item>
+                                    <item AppInfo="Mycenaean Greek" ConceptLink="http://cdb.iso.org/lg/CDB-00138441-001">gmy</item>
+                                    <item AppInfo="Kaansa" ConceptLink="http://cdb.iso.org/lg/CDB-00134625-001">gna</item>
+                                    <item AppInfo="Gangte" ConceptLink="http://cdb.iso.org/lg/CDB-00134624-001">gnb</item>
+                                    <item AppInfo="Guanche" ConceptLink="http://cdb.iso.org/lg/CDB-00138126-001">gnc</item>
+                                    <item AppInfo="Zulgo-Gemzek" ConceptLink="http://cdb.iso.org/lg/CDB-00134623-001">gnd</item>
+                                    <item AppInfo="Ganang" ConceptLink="http://cdb.iso.org/lg/CDB-00134622-001">gne</item>
+                                    <item AppInfo="Ngangam" ConceptLink="http://cdb.iso.org/lg/CDB-00134621-001">gng</item>
+                                    <item AppInfo="Lere" ConceptLink="http://cdb.iso.org/lg/CDB-00134602-001">gnh</item>
+                                    <item AppInfo="Gooniyandi" ConceptLink="http://cdb.iso.org/lg/CDB-00134577-001">gni</item>
+                                    <item AppInfo="//Gana" ConceptLink="http://cdb.iso.org/lg/CDB-00134610-001">gnk</item>
+                                    <item AppInfo="Gangulu" ConceptLink="http://cdb.iso.org/lg/CDB-00138070-001">gnl</item>
+                                    <item AppInfo="Ginuman" ConceptLink="http://cdb.iso.org/lg/CDB-00134584-001">gnm</item>
+                                    <item AppInfo="Gumatj" ConceptLink="http://cdb.iso.org/lg/CDB-00134583-001">gnn</item>
+                                    <item AppInfo="Northern Gondi" ConceptLink="http://cdb.iso.org/lg/CDB-00134582-001">gno</item>
+                                    <item AppInfo="Gana" ConceptLink="http://cdb.iso.org/lg/CDB-00134581-001">gnq</item>
+                                    <item AppInfo="Gureng Gureng" ConceptLink="http://cdb.iso.org/lg/CDB-00138034-001">gnr</item>
+                                    <item AppInfo="Guntai" ConceptLink="http://cdb.iso.org/lg/CDB-00134580-001">gnt</item>
+                                    <item AppInfo="Gnau" ConceptLink="http://cdb.iso.org/lg/CDB-00134571-001">gnu</item>
+                                    <item AppInfo="Western Bolivian GuaranÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134578-001">gnw</item>
+                                    <item AppInfo="Ganzi" ConceptLink="http://cdb.iso.org/lg/CDB-00134586-001">gnz</item>
+                                    <item AppInfo="Guro" ConceptLink="http://cdb.iso.org/lg/CDB-00134576-001">goa</item>
+                                    <item AppInfo="Playero" ConceptLink="http://cdb.iso.org/lg/CDB-00134575-001">gob</item>
+                                    <item AppInfo="Gorakor" ConceptLink="http://cdb.iso.org/lg/CDB-00134574-001">goc</item>
+                                    <item AppInfo="GodiÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134573-001">god</item>
+                                    <item AppInfo="Gongduk" ConceptLink="http://cdb.iso.org/lg/CDB-00134572-001">goe</item>
+                                    <item AppInfo="Gofa" ConceptLink="http://cdb.iso.org/lg/CDB-00134594-001">gof</item>
+                                    <item AppInfo="Gogo" ConceptLink="http://cdb.iso.org/lg/CDB-00134596-001">gog</item>
+                                    <item AppInfo="Old High German" ConceptLink="http://cdb.iso.org/lg/CDB-00137899-001">goh</item>
+                                    <item AppInfo="Gobasi" ConceptLink="http://cdb.iso.org/lg/CDB-00134579-001">goi</item>
+                                    <item AppInfo="Gowlan" ConceptLink="http://cdb.iso.org/lg/CDB-00134601-001">goj</item>
+                                    <item AppInfo="Gowli" ConceptLink="http://cdb.iso.org/lg/CDB-00134600-001">gok</item>
+                                    <item AppInfo="Gola" ConceptLink="http://cdb.iso.org/lg/CDB-00134599-001">gol</item>
+                                    <item AppInfo="Goan Konkani" ConceptLink="http://cdb.iso.org/lg/CDB-00134598-001">gom</item>
+                                    <item AppInfo="Gondi" ConceptLink="http://cdb.iso.org/lg/CDB-00130999-001">gon</item>
+                                    <item AppInfo="Gone Dau" ConceptLink="http://cdb.iso.org/lg/CDB-00134597-001">goo</item>
+                                    <item AppInfo="Yeretuar" ConceptLink="http://cdb.iso.org/lg/CDB-00134587-001">gop</item>
+                                    <item AppInfo="Gorap" ConceptLink="http://cdb.iso.org/lg/CDB-00134595-001">goq</item>
+                                    <item AppInfo="Gorontalo" ConceptLink="http://cdb.iso.org/lg/CDB-00134603-001">gor</item>
+                                    <item AppInfo="Gronings" ConceptLink="http://cdb.iso.org/lg/CDB-00134593-001">gos</item>
+                                    <item AppInfo="Gothic" ConceptLink="http://cdb.iso.org/lg/CDB-00138438-001">got</item>
+                                    <item AppInfo="Gavar" ConceptLink="http://cdb.iso.org/lg/CDB-00134592-001">gou</item>
+                                    <item AppInfo="Gorowa" ConceptLink="http://cdb.iso.org/lg/CDB-00134591-001">gow</item>
+                                    <item AppInfo="Gobu" ConceptLink="http://cdb.iso.org/lg/CDB-00134590-001">gox</item>
+                                    <item AppInfo="Goundo" ConceptLink="http://cdb.iso.org/lg/CDB-00134589-001">goy</item>
+                                    <item AppInfo="Gozarkhani" ConceptLink="http://cdb.iso.org/lg/CDB-00134490-001">goz</item>
+                                    <item AppInfo="Gupa-Abawa" ConceptLink="http://cdb.iso.org/lg/CDB-00134618-001">gpa</item>
+                                    <item AppInfo="Taiap" ConceptLink="http://cdb.iso.org/lg/CDB-00134507-001">gpn</item>
+                                    <item AppInfo="Ga'anda" ConceptLink="http://cdb.iso.org/lg/CDB-00134422-001">gqa</item>
+                                    <item AppInfo="Guiqiong" ConceptLink="http://cdb.iso.org/lg/CDB-00134421-001">gqi</item>
+                                    <item AppInfo="Guana" ConceptLink="http://cdb.iso.org/lg/CDB-00138061-001">gqn</item>
+                                    <item AppInfo="Gor" ConceptLink="http://cdb.iso.org/lg/CDB-00134420-001">gqr</item>
+                                    <item AppInfo="Rajput Garasia" ConceptLink="http://cdb.iso.org/lg/CDB-00134419-001">gra</item>
+                                    <item AppInfo="Grebo" ConceptLink="http://cdb.iso.org/lg/CDB-00130977-001">grb</item>
+                                    <item AppInfo="Ancient Greek" ConceptLink="http://cdb.iso.org/lg/CDB-00137891-001">grc</item>
+                                    <item AppInfo="Guruntum-Mbaaru" ConceptLink="http://cdb.iso.org/lg/CDB-00134418-001">grd</item>
+                                    <item AppInfo="Madi" ConceptLink="http://cdb.iso.org/lg/CDB-00134417-001">grg</item>
+                                    <item AppInfo="Gbiri-Niragu" ConceptLink="http://cdb.iso.org/lg/CDB-00134408-001">grh</item>
+                                    <item AppInfo="Ghari" ConceptLink="http://cdb.iso.org/lg/CDB-00134415-001">gri</item>
+                                    <item AppInfo="Southern Grebo" ConceptLink="http://cdb.iso.org/lg/CDB-00134423-001">grj</item>
+                                    <item AppInfo="Kota Marudu Talantang" ConceptLink="http://cdb.iso.org/lg/CDB-00134413-001">grm</item>
+                                    <item AppInfo="Guarani" ConceptLink="http://cdb.iso.org/lg/CDB-00138517-001">grn</item>
+                                    <item AppInfo="Groma" ConceptLink="http://cdb.iso.org/lg/CDB-00134412-001">gro</item>
+                                    <item AppInfo="Gorovu" ConceptLink="http://cdb.iso.org/lg/CDB-00134411-001">grq</item>
+                                    <item AppInfo="Taznatit" ConceptLink="http://cdb.iso.org/lg/CDB-00134410-001">grr</item>
+                                    <item AppInfo="Gresi" ConceptLink="http://cdb.iso.org/lg/CDB-00134409-001">grs</item>
+                                    <item AppInfo="Garo" ConceptLink="http://cdb.iso.org/lg/CDB-00134431-001">grt</item>
+                                    <item AppInfo="Kistane" ConceptLink="http://cdb.iso.org/lg/CDB-00134433-001">gru</item>
+                                    <item AppInfo="Central Grebo" ConceptLink="http://cdb.iso.org/lg/CDB-00134416-001">grv</item>
+                                    <item AppInfo="Gweda" ConceptLink="http://cdb.iso.org/lg/CDB-00134438-001">grw</item>
+                                    <item AppInfo="Guriaso" ConceptLink="http://cdb.iso.org/lg/CDB-00134437-001">grx</item>
+                                    <item AppInfo="Barclayville Grebo" ConceptLink="http://cdb.iso.org/lg/CDB-00134436-001">gry</item>
+                                    <item AppInfo="Guramalum" ConceptLink="http://cdb.iso.org/lg/CDB-00134435-001">grz</item>
+                                    <item AppInfo="Ghanaian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134434-001">gse</item>
+                                    <item AppInfo="German Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134424-001">gsg</item>
+                                    <item AppInfo="Gusilay" ConceptLink="http://cdb.iso.org/lg/CDB-00134432-001">gsl</item>
+                                    <item AppInfo="Guatemalan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134440-001">gsm</item>
+                                    <item AppInfo="Gusan" ConceptLink="http://cdb.iso.org/lg/CDB-00134430-001">gsn</item>
+                                    <item AppInfo="Southwest Gbaya" ConceptLink="http://cdb.iso.org/lg/CDB-00134429-001">gso</item>
+                                    <item AppInfo="Wasembo" ConceptLink="http://cdb.iso.org/lg/CDB-00134428-001">gsp</item>
+                                    <item AppInfo="Greek Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134427-001">gss</item>
+                                    <item AppInfo="Swiss German; Alemannic; Alsatian" ConceptLink="http://cdb.iso.org/lg/CDB-00134426-001">gsw</item>
+                                    <item AppInfo="GuatÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00134400-001">gta</item>
+                                    <item AppInfo="Gbati-ri" ConceptLink="http://cdb.iso.org/lg/CDB-00134439-001">gti</item>
+                                    <item AppInfo="Shiki" ConceptLink="http://cdb.iso.org/lg/CDB-00134414-001">gua</item>
+                                    <item AppInfo="GuajajÃ¡ra" ConceptLink="http://cdb.iso.org/lg/CDB-00134390-001">gub</item>
+                                    <item AppInfo="Wayuu" ConceptLink="http://cdb.iso.org/lg/CDB-00134389-001">guc</item>
+                                    <item AppInfo="YocobouÃ© Dida" ConceptLink="http://cdb.iso.org/lg/CDB-00134388-001">gud</item>
+                                    <item AppInfo="Gurinji" ConceptLink="http://cdb.iso.org/lg/CDB-00134387-001">gue</item>
+                                    <item AppInfo="Gupapuyngu" ConceptLink="http://cdb.iso.org/lg/CDB-00134386-001">guf</item>
+                                    <item AppInfo="Paraguayan GuaranÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134385-001">gug</item>
+                                    <item AppInfo="Guahibo" ConceptLink="http://cdb.iso.org/lg/CDB-00134376-001">guh</item>
+                                    <item AppInfo="Eastern Bolivian GuaranÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134383-001">gui</item>
+                                    <item AppInfo="Gujarati" ConceptLink="http://cdb.iso.org/lg/CDB-00138518-001">guj</item>
+                                    <item AppInfo="Gumuz" ConceptLink="http://cdb.iso.org/lg/CDB-00134391-001">guk</item>
+                                    <item AppInfo="Sea Island Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00134381-001">gul</item>
+                                    <item AppInfo="Guambiano" ConceptLink="http://cdb.iso.org/lg/CDB-00134380-001">gum</item>
+                                    <item AppInfo="MbyÃ¡ GuaranÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00134379-001">gun</item>
+                                    <item AppInfo="Guayabero" ConceptLink="http://cdb.iso.org/lg/CDB-00134378-001">guo</item>
+                                    <item AppInfo="Gunwinggu" ConceptLink="http://cdb.iso.org/lg/CDB-00134398-001">gup</item>
+                                    <item AppInfo="AchÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00134382-001">guq</item>
+                                    <item AppInfo="Farefare" ConceptLink="http://cdb.iso.org/lg/CDB-00134384-001">gur</item>
+                                    <item AppInfo="Guinean Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134406-001">gus</item>
+                                    <item AppInfo="MalÃ©ku JaÃ­ka" ConceptLink="http://cdb.iso.org/lg/CDB-00134405-001">gut</item>
+                                    <item AppInfo="YanomamÃ¶" ConceptLink="http://cdb.iso.org/lg/CDB-00134404-001">guu</item>
+                                    <item AppInfo="Gey" ConceptLink="http://cdb.iso.org/lg/CDB-00138018-001">guv</item>
+                                    <item AppInfo="Gun" ConceptLink="http://cdb.iso.org/lg/CDB-00134403-001">guw</item>
+                                    <item AppInfo="GourmanchÃ©ma" ConceptLink="http://cdb.iso.org/lg/CDB-00134402-001">gux</item>
+                                    <item AppInfo="Gusii" ConceptLink="http://cdb.iso.org/lg/CDB-00134401-001">guz</item>
+                                    <item AppInfo="Guana" ConceptLink="http://cdb.iso.org/lg/CDB-00134392-001">gva</item>
+                                    <item AppInfo="Guanano" ConceptLink="http://cdb.iso.org/lg/CDB-00134399-001">gvc</item>
+                                    <item AppInfo="Duwet" ConceptLink="http://cdb.iso.org/lg/CDB-00134407-001">gve</item>
+                                    <item AppInfo="Golin" ConceptLink="http://cdb.iso.org/lg/CDB-00134397-001">gvf</item>
+                                    <item AppInfo="GuajÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00134396-001">gvj</item>
+                                    <item AppInfo="Gulay" ConceptLink="http://cdb.iso.org/lg/CDB-00134395-001">gvl</item>
+                                    <item AppInfo="Gurmana" ConceptLink="http://cdb.iso.org/lg/CDB-00134394-001">gvm</item>
+                                    <item AppInfo="Kuku-Yalanji" ConceptLink="http://cdb.iso.org/lg/CDB-00134442-001">gvn</item>
+                                    <item AppInfo="GaviÃ£o Do JiparanÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00134377-001">gvo</item>
+                                    <item AppInfo="ParÃ¡ GaviÃ£o" ConceptLink="http://cdb.iso.org/lg/CDB-00134425-001">gvp</item>
+                                    <item AppInfo="Western Gurung" ConceptLink="http://cdb.iso.org/lg/CDB-00134487-001">gvr</item>
+                                    <item AppInfo="Gumawana" ConceptLink="http://cdb.iso.org/lg/CDB-00134486-001">gvs</item>
+                                    <item AppInfo="Guyani" ConceptLink="http://cdb.iso.org/lg/CDB-00138106-001">gvy</item>
+                                    <item AppInfo="Mbato" ConceptLink="http://cdb.iso.org/lg/CDB-00134485-001">gwa</item>
+                                    <item AppInfo="Gwa" ConceptLink="http://cdb.iso.org/lg/CDB-00134484-001">gwb</item>
+                                    <item AppInfo="Kalami" ConceptLink="http://cdb.iso.org/lg/CDB-00134483-001">gwc</item>
+                                    <item AppInfo="Gawwada" ConceptLink="http://cdb.iso.org/lg/CDB-00134482-001">gwd</item>
+                                    <item AppInfo="Gweno" ConceptLink="http://cdb.iso.org/lg/CDB-00134473-001">gwe</item>
+                                    <item AppInfo="Gowro" ConceptLink="http://cdb.iso.org/lg/CDB-00134480-001">gwf</item>
+                                    <item AppInfo="Moo" ConceptLink="http://cdb.iso.org/lg/CDB-00134488-001">gwg</item>
+                                    <item AppInfo="Gwich'in" ConceptLink="http://cdb.iso.org/lg/CDB-00134478-001">gwi</item>
+                                    <item AppInfo="/Gwi" ConceptLink="http://cdb.iso.org/lg/CDB-00134477-001">gwj</item>
+                                    <item AppInfo="Gwandara" ConceptLink="http://cdb.iso.org/lg/CDB-00134476-001">gwn</item>
+                                    <item AppInfo="Gwere" ConceptLink="http://cdb.iso.org/lg/CDB-00134475-001">gwr</item>
+                                    <item AppInfo="Gawar-Bati" ConceptLink="http://cdb.iso.org/lg/CDB-00134474-001">gwt</item>
+                                    <item AppInfo="Guwamu" ConceptLink="http://cdb.iso.org/lg/CDB-00134496-001">gwu</item>
+                                    <item AppInfo="Kwini" ConceptLink="http://cdb.iso.org/lg/CDB-00134498-001">gww</item>
+                                    <item AppInfo="Gua" ConceptLink="http://cdb.iso.org/lg/CDB-00134481-001">gwx</item>
+                                    <item AppInfo="WÃš Southern" ConceptLink="http://cdb.iso.org/lg/CDB-00134503-001">gxx</item>
+                                    <item AppInfo="Northwest Gbaya" ConceptLink="http://cdb.iso.org/lg/CDB-00134502-001">gya</item>
+                                    <item AppInfo="Garus" ConceptLink="http://cdb.iso.org/lg/CDB-00134501-001">gyb</item>
+                                    <item AppInfo="Kayardild" ConceptLink="http://cdb.iso.org/lg/CDB-00134500-001">gyd</item>
+                                    <item AppInfo="Gyem" ConceptLink="http://cdb.iso.org/lg/CDB-00134499-001">gye</item>
+                                    <item AppInfo="Gungabula" ConceptLink="http://cdb.iso.org/lg/CDB-00134489-001">gyf</item>
+                                    <item AppInfo="Gbayi" ConceptLink="http://cdb.iso.org/lg/CDB-00134497-001">gyg</item>
+                                    <item AppInfo="Gyele" ConceptLink="http://cdb.iso.org/lg/CDB-00134505-001">gyi</item>
+                                    <item AppInfo="Gayil" ConceptLink="http://cdb.iso.org/lg/CDB-00134495-001">gyl</item>
+                                    <item AppInfo="NgÃ€bere" ConceptLink="http://cdb.iso.org/lg/CDB-00134494-001">gym</item>
+                                    <item AppInfo="Guyanese Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00134493-001">gyn</item>
+                                    <item AppInfo="Guarayu" ConceptLink="http://cdb.iso.org/lg/CDB-00134492-001">gyr</item>
+                                    <item AppInfo="Gunya" ConceptLink="http://cdb.iso.org/lg/CDB-00134491-001">gyy</item>
+                                    <item AppInfo="Ganza" ConceptLink="http://cdb.iso.org/lg/CDB-00134465-001">gza</item>
+                                    <item AppInfo="Gazi" ConceptLink="http://cdb.iso.org/lg/CDB-00134504-001">gzi</item>
+                                    <item AppInfo="Gane" ConceptLink="http://cdb.iso.org/lg/CDB-00134479-001">gzn</item>
+                                    <item AppInfo="Han" ConceptLink="http://cdb.iso.org/lg/CDB-00134455-001">haa</item>
+                                    <item AppInfo="Hanoi Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134454-001">hab</item>
+                                    <item AppInfo="Gurani" ConceptLink="http://cdb.iso.org/lg/CDB-00134453-001">hac</item>
+                                    <item AppInfo="Hatam" ConceptLink="http://cdb.iso.org/lg/CDB-00134452-001">had</item>
+                                    <item AppInfo="Eastern Oromo" ConceptLink="http://cdb.iso.org/lg/CDB-00134451-001">hae</item>
+                                    <item AppInfo="Haiphong Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134450-001">haf</item>
+                                    <item AppInfo="Hanga" ConceptLink="http://cdb.iso.org/lg/CDB-00134441-001">hag</item>
+                                    <item AppInfo="Hahon" ConceptLink="http://cdb.iso.org/lg/CDB-00134448-001">hah</item>
+                                    <item AppInfo="Haida" ConceptLink="http://cdb.iso.org/lg/CDB-00130976-001">hai</item>
+                                    <item AppInfo="Hajong" ConceptLink="http://cdb.iso.org/lg/CDB-00134456-001">haj</item>
+                                    <item AppInfo="Hakka Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00134446-001">hak</item>
+                                    <item AppInfo="Halang" ConceptLink="http://cdb.iso.org/lg/CDB-00134445-001">hal</item>
+                                    <item AppInfo="Hewa" ConceptLink="http://cdb.iso.org/lg/CDB-00134444-001">ham</item>
+                                    <item AppInfo="Hangaza" ConceptLink="http://cdb.iso.org/lg/CDB-00134443-001">han</item>
+                                    <item AppInfo="HakÃ¶" ConceptLink="http://cdb.iso.org/lg/CDB-00134463-001">hao</item>
+                                    <item AppInfo="Hupla" ConceptLink="http://cdb.iso.org/lg/CDB-00134447-001">hap</item>
+                                    <item AppInfo="Ha" ConceptLink="http://cdb.iso.org/lg/CDB-00134449-001">haq</item>
+                                    <item AppInfo="Harari" ConceptLink="http://cdb.iso.org/lg/CDB-00134471-001">har</item>
+                                    <item AppInfo="Haisla" ConceptLink="http://cdb.iso.org/lg/CDB-00134470-001">has</item>
+                                    <item AppInfo="Haitian; Haitian Creole" ConceptLink="http://cdb.iso.org/lg/CDB-00138525-001">hat</item>
+                                    <item AppInfo="Hausa" ConceptLink="http://cdb.iso.org/lg/CDB-00138520-001">hau</item>
+                                    <item AppInfo="Havu" ConceptLink="http://cdb.iso.org/lg/CDB-00134469-001">hav</item>
+                                    <item AppInfo="Hawaiian" ConceptLink="http://cdb.iso.org/lg/CDB-00134468-001">haw</item>
+                                    <item AppInfo="Southern Haida" ConceptLink="http://cdb.iso.org/lg/CDB-00134467-001">hax</item>
+                                    <item AppInfo="Haya" ConceptLink="http://cdb.iso.org/lg/CDB-00132720-001">hay</item>
+                                    <item AppInfo="Hazaragi" ConceptLink="http://cdb.iso.org/lg/CDB-00134457-001">haz</item>
+                                    <item AppInfo="Hamba" ConceptLink="http://cdb.iso.org/lg/CDB-00133415-001">hba</item>
+                                    <item AppInfo="Huba" ConceptLink="http://cdb.iso.org/lg/CDB-00134472-001">hbb</item>
+                                    <item AppInfo="Heiban" ConceptLink="http://cdb.iso.org/lg/CDB-00134462-001">hbn</item>
+                                    <item AppInfo="Ancient Hebrew" ConceptLink="http://cdb.iso.org/lg/CDB-00137889-001">hbo</item>
+                                    <item AppInfo="Serbo-Croatian" ConceptLink="http://cdb.iso.org/lg/CDB-00138607-001">hbs</item>
+                                    <item AppInfo="Habu" ConceptLink="http://cdb.iso.org/lg/CDB-00134461-001">hbu</item>
+                                    <item AppInfo="Andaman Creole Hindi" ConceptLink="http://cdb.iso.org/lg/CDB-00134460-001">hca</item>
+                                    <item AppInfo="Huichol" ConceptLink="http://cdb.iso.org/lg/CDB-00134459-001">hch</item>
+                                    <item AppInfo="Northern Haida" ConceptLink="http://cdb.iso.org/lg/CDB-00134458-001">hdn</item>
+                                    <item AppInfo="Honduras Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00134980-001">hds</item>
+                                    <item AppInfo="Hadiyya" ConceptLink="http://cdb.iso.org/lg/CDB-00132722-001">hdy</item>
+                                    <item AppInfo="Northern Qiandong Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00131682-001">hea</item>
+                                    <item AppInfo="Hebrew" ConceptLink="http://cdb.iso.org/lg/CDB-00138521-001">heb</item>
+                                    <item AppInfo="HerdÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131681-001">hed</item>
+                                    <item AppInfo="Helong" ConceptLink="http://cdb.iso.org/lg/CDB-00131680-001">heg</item>
+                                    <item AppInfo="Hehe" ConceptLink="http://cdb.iso.org/lg/CDB-00131679-001">heh</item>
+                                    <item AppInfo="Heiltsuk" ConceptLink="http://cdb.iso.org/lg/CDB-00131678-001">hei</item>
+                                    <item AppInfo="Hemba" ConceptLink="http://cdb.iso.org/lg/CDB-00131677-001">hem</item>
+                                    <item AppInfo="Herero" ConceptLink="http://cdb.iso.org/lg/CDB-00138528-001">her</item>
+                                    <item AppInfo="Hai//om" ConceptLink="http://cdb.iso.org/lg/CDB-00131668-001">hgm</item>
+                                    <item AppInfo="Haigwai" ConceptLink="http://cdb.iso.org/lg/CDB-00131675-001">hgw</item>
+                                    <item AppInfo="Hoia Hoia" ConceptLink="http://cdb.iso.org/lg/CDB-00131683-001">hhi</item>
+                                    <item AppInfo="Kerak" ConceptLink="http://cdb.iso.org/lg/CDB-00131673-001">hhr</item>
+                                    <item AppInfo="Hoyahoya" ConceptLink="http://cdb.iso.org/lg/CDB-00131672-001">hhy</item>
+                                    <item AppInfo="Lamang" ConceptLink="http://cdb.iso.org/lg/CDB-00131671-001">hia</item>
+                                    <item AppInfo="Hibito" ConceptLink="http://cdb.iso.org/lg/CDB-00138260-001">hib</item>
+                                    <item AppInfo="Hidatsa" ConceptLink="http://cdb.iso.org/lg/CDB-00131670-001">hid</item>
+                                    <item AppInfo="Fiji Hindi" ConceptLink="http://cdb.iso.org/lg/CDB-00131669-001">hif</item>
+                                    <item AppInfo="Kamwe" ConceptLink="http://cdb.iso.org/lg/CDB-00131691-001">hig</item>
+                                    <item AppInfo="Pamosu" ConceptLink="http://cdb.iso.org/lg/CDB-00131693-001">hih</item>
+                                    <item AppInfo="Hinduri" ConceptLink="http://cdb.iso.org/lg/CDB-00131676-001">hii</item>
+                                    <item AppInfo="Hijuk" ConceptLink="http://cdb.iso.org/lg/CDB-00131698-001">hij</item>
+                                    <item AppInfo="Seit-Kaitetu" ConceptLink="http://cdb.iso.org/lg/CDB-00131697-001">hik</item>
+                                    <item AppInfo="Hiligaynon" ConceptLink="http://cdb.iso.org/lg/CDB-00131718-001">hil</item>
+                                    <item AppInfo="Hindi" ConceptLink="http://cdb.iso.org/lg/CDB-00138522-001">hin</item>
+                                    <item AppInfo="Tsoa" ConceptLink="http://cdb.iso.org/lg/CDB-00131943-001">hio</item>
+                                    <item AppInfo="HimarimÃ£" ConceptLink="http://cdb.iso.org/lg/CDB-00131942-001">hir</item>
+                                    <item AppInfo="Hittite" ConceptLink="http://cdb.iso.org/lg/CDB-00138433-001">hit</item>
+                                    <item AppInfo="Hiw" ConceptLink="http://cdb.iso.org/lg/CDB-00131941-001">hiw</item>
+                                    <item AppInfo="HixkaryÃ¡na" ConceptLink="http://cdb.iso.org/lg/CDB-00131940-001">hix</item>
+                                    <item AppInfo="Haji" ConceptLink="http://cdb.iso.org/lg/CDB-00131939-001">hji</item>
+                                    <item AppInfo="Kahe" ConceptLink="http://cdb.iso.org/lg/CDB-00131930-001">hka</item>
+                                    <item AppInfo="Hunde" ConceptLink="http://cdb.iso.org/lg/CDB-00131937-001">hke</item>
+                                    <item AppInfo="Hunjara-Kaina Ke" ConceptLink="http://cdb.iso.org/lg/CDB-00131945-001">hkk</item>
+                                    <item AppInfo="Hong Kong Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131935-001">hks</item>
+                                    <item AppInfo="Halia" ConceptLink="http://cdb.iso.org/lg/CDB-00131934-001">hla</item>
+                                    <item AppInfo="Halbi" ConceptLink="http://cdb.iso.org/lg/CDB-00131933-001">hlb</item>
+                                    <item AppInfo="Halang Doan" ConceptLink="http://cdb.iso.org/lg/CDB-00131932-001">hld</item>
+                                    <item AppInfo="Hlersu" ConceptLink="http://cdb.iso.org/lg/CDB-00131931-001">hle</item>
+                                    <item AppInfo="Nga La" ConceptLink="http://cdb.iso.org/lg/CDB-00131953-001">hlt</item>
+                                    <item AppInfo="Hieroglyphic Luwian" ConceptLink="http://cdb.iso.org/lg/CDB-00138426-001">hlu</item>
+                                    <item AppInfo="Southern Mashan Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131955-001">hma</item>
+                                    <item AppInfo="Humburi Senni Songhay" ConceptLink="http://cdb.iso.org/lg/CDB-00131938-001">hmb</item>
+                                    <item AppInfo="Central Huishui Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131960-001">hmc</item>
+                                    <item AppInfo="Large Flowery Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00131959-001">hmd</item>
+                                    <item AppInfo="Eastern Huishui Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131958-001">hme</item>
+                                    <item AppInfo="Hmong Don" ConceptLink="http://cdb.iso.org/lg/CDB-00131957-001">hmf</item>
+                                    <item AppInfo="Southwestern Guiyang Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131956-001">hmg</item>
+                                    <item AppInfo="Southwestern Huishui Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131946-001">hmh</item>
+                                    <item AppInfo="Northern Huishui Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131954-001">hmi</item>
+                                    <item AppInfo="Ge" ConceptLink="http://cdb.iso.org/lg/CDB-00131962-001">hmj</item>
+                                    <item AppInfo="Maek" ConceptLink="http://cdb.iso.org/lg/CDB-00138253-001">hmk</item>
+                                    <item AppInfo="Luopohe Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131952-001">hml</item>
+                                    <item AppInfo="Central Mashan Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131951-001">hmm</item>
+                                    <item AppInfo="Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131001-001">hmn</item>
+                                    <item AppInfo="Hiri Motu" ConceptLink="http://cdb.iso.org/lg/CDB-00138523-001">hmo</item>
+                                    <item AppInfo="Northern Mashan Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131950-001">hmp</item>
+                                    <item AppInfo="Eastern Qiandong Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00131949-001">hmq</item>
+                                    <item AppInfo="Hmar" ConceptLink="http://cdb.iso.org/lg/CDB-00131948-001">hmr</item>
+                                    <item AppInfo="Southern Qiandong Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00131922-001">hms</item>
+                                    <item AppInfo="Hamtai" ConceptLink="http://cdb.iso.org/lg/CDB-00131961-001">hmt</item>
+                                    <item AppInfo="Hamap" ConceptLink="http://cdb.iso.org/lg/CDB-00131936-001">hmu</item>
+                                    <item AppInfo="Hmong DÃŽ" ConceptLink="http://cdb.iso.org/lg/CDB-00131912-001">hmv</item>
+                                    <item AppInfo="Western Mashan Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131911-001">hmw</item>
+                                    <item AppInfo="Southern Guiyang Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00131910-001">hmy</item>
+                                    <item AppInfo="Hmong Shua" ConceptLink="http://cdb.iso.org/lg/CDB-00131909-001">hmz</item>
+                                    <item AppInfo="Mina" ConceptLink="http://cdb.iso.org/lg/CDB-00131908-001">hna</item>
+                                    <item AppInfo="Southern Hindko" ConceptLink="http://cdb.iso.org/lg/CDB-00131907-001">hnd</item>
+                                    <item AppInfo="Chhattisgarhi" ConceptLink="http://cdb.iso.org/lg/CDB-00131898-001">hne</item>
+                                    <item AppInfo="//Ani" ConceptLink="http://cdb.iso.org/lg/CDB-00131905-001">hnh</item>
+                                    <item AppInfo="Hani" ConceptLink="http://cdb.iso.org/lg/CDB-00131913-001">hni</item>
+                                    <item AppInfo="Hmong Njua" ConceptLink="http://cdb.iso.org/lg/CDB-00131903-001">hnj</item>
+                                    <item AppInfo="Hanunoo" ConceptLink="http://cdb.iso.org/lg/CDB-00131902-001">hnn</item>
+                                    <item AppInfo="Northern Hindko" ConceptLink="http://cdb.iso.org/lg/CDB-00131901-001">hno</item>
+                                    <item AppInfo="Caribbean Hindustani" ConceptLink="http://cdb.iso.org/lg/CDB-00131900-001">hns</item>
+                                    <item AppInfo="Hung" ConceptLink="http://cdb.iso.org/lg/CDB-00131920-001">hnu</item>
+                                    <item AppInfo="Hoava" ConceptLink="http://cdb.iso.org/lg/CDB-00131904-001">hoa</item>
+                                    <item AppInfo="Mari" ConceptLink="http://cdb.iso.org/lg/CDB-00131906-001">hob</item>
+                                    <item AppInfo="Ho" ConceptLink="http://cdb.iso.org/lg/CDB-00131928-001">hoc</item>
+                                    <item AppInfo="Holma" ConceptLink="http://cdb.iso.org/lg/CDB-00138331-001">hod</item>
+                                    <item AppInfo="Horom" ConceptLink="http://cdb.iso.org/lg/CDB-00131927-001">hoe</item>
+                                    <item AppInfo="HobyÃ³t" ConceptLink="http://cdb.iso.org/lg/CDB-00131926-001">hoh</item>
+                                    <item AppInfo="Holikachuk" ConceptLink="http://cdb.iso.org/lg/CDB-00131925-001">hoi</item>
+                                    <item AppInfo="Hadothi" ConceptLink="http://cdb.iso.org/lg/CDB-00131924-001">hoj</item>
+                                    <item AppInfo="Holu" ConceptLink="http://cdb.iso.org/lg/CDB-00131923-001">hol</item>
+                                    <item AppInfo="Homa" ConceptLink="http://cdb.iso.org/lg/CDB-00138308-001">hom</item>
+                                    <item AppInfo="Holoholo" ConceptLink="http://cdb.iso.org/lg/CDB-00131914-001">hoo</item>
+                                    <item AppInfo="Hopi" ConceptLink="http://cdb.iso.org/lg/CDB-00131921-001">hop</item>
+                                    <item AppInfo="Horo" ConceptLink="http://cdb.iso.org/lg/CDB-00138329-001">hor</item>
+                                    <item AppInfo="Ho Chi Minh City Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131929-001">hos</item>
+                                    <item AppInfo="Hote" ConceptLink="http://cdb.iso.org/lg/CDB-00131919-001">hot</item>
+                                    <item AppInfo="Hovongan" ConceptLink="http://cdb.iso.org/lg/CDB-00131918-001">hov</item>
+                                    <item AppInfo="Honi" ConceptLink="http://cdb.iso.org/lg/CDB-00131917-001">how</item>
+                                    <item AppInfo="Holiya" ConceptLink="http://cdb.iso.org/lg/CDB-00131916-001">hoy</item>
+                                    <item AppInfo="Hozo" ConceptLink="http://cdb.iso.org/lg/CDB-00131915-001">hoz</item>
+                                    <item AppInfo="Hpon" ConceptLink="http://cdb.iso.org/lg/CDB-00131977-001">hpo</item>
+                                    <item AppInfo="Hawai'i Pidgin Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132027-001">hps</item>
+                                    <item AppInfo="Hrangkhol" ConceptLink="http://cdb.iso.org/lg/CDB-00131947-001">hra</item>
+                                    <item AppInfo="Hre" ConceptLink="http://cdb.iso.org/lg/CDB-00132009-001">hre</item>
+                                    <item AppInfo="Haruku" ConceptLink="http://cdb.iso.org/lg/CDB-00132008-001">hrk</item>
+                                    <item AppInfo="Horned Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00132007-001">hrm</item>
+                                    <item AppInfo="Haroi" ConceptLink="http://cdb.iso.org/lg/CDB-00132006-001">hro</item>
+                                    <item AppInfo="Horuru" ConceptLink="http://cdb.iso.org/lg/CDB-00132005-001">hrr</item>
+                                    <item AppInfo="HÃ©rtevin" ConceptLink="http://cdb.iso.org/lg/CDB-00131996-001">hrt</item>
+                                    <item AppInfo="Hruso" ConceptLink="http://cdb.iso.org/lg/CDB-00132003-001">hru</item>
+                                    <item AppInfo="Croatian" ConceptLink="http://cdb.iso.org/lg/CDB-00138524-001">hrv</item>
+                                    <item AppInfo="Hunsrik" ConceptLink="http://cdb.iso.org/lg/CDB-00132011-001">hrx</item>
+                                    <item AppInfo="Harzani" ConceptLink="http://cdb.iso.org/lg/CDB-00132001-001">hrz</item>
+                                    <item AppInfo="Upper Sorbian" ConceptLink="http://cdb.iso.org/lg/CDB-00132000-001">hsb</item>
+                                    <item AppInfo="Hungarian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131999-001">hsh</item>
+                                    <item AppInfo="Hausa Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131998-001">hsl</item>
+                                    <item AppInfo="Xiang Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00131997-001">hsn</item>
+                                    <item AppInfo="Harsusi" ConceptLink="http://cdb.iso.org/lg/CDB-00132019-001">hss</item>
+                                    <item AppInfo="Hoti" ConceptLink="http://cdb.iso.org/lg/CDB-00132021-001">hti</item>
+                                    <item AppInfo="Minica Huitoto" ConceptLink="http://cdb.iso.org/lg/CDB-00132004-001">hto</item>
+                                    <item AppInfo="Hadza" ConceptLink="http://cdb.iso.org/lg/CDB-00132026-001">hts</item>
+                                    <item AppInfo="Hitu" ConceptLink="http://cdb.iso.org/lg/CDB-00132025-001">htu</item>
+                                    <item AppInfo="Middle Hittite" ConceptLink="http://cdb.iso.org/lg/CDB-00138454-001">htx</item>
+                                    <item AppInfo="Huambisa" ConceptLink="http://cdb.iso.org/lg/CDB-00132024-001">hub</item>
+                                    <item AppInfo="=/Hua" ConceptLink="http://cdb.iso.org/lg/CDB-00132023-001">huc</item>
+                                    <item AppInfo="Huaulu" ConceptLink="http://cdb.iso.org/lg/CDB-00132022-001">hud</item>
+                                    <item AppInfo="San Francisco Del Mar Huave" ConceptLink="http://cdb.iso.org/lg/CDB-00132012-001">hue</item>
+                                    <item AppInfo="Humene" ConceptLink="http://cdb.iso.org/lg/CDB-00132020-001">huf</item>
+                                    <item AppInfo="Huachipaeri" ConceptLink="http://cdb.iso.org/lg/CDB-00132028-001">hug</item>
+                                    <item AppInfo="Huilliche" ConceptLink="http://cdb.iso.org/lg/CDB-00132018-001">huh</item>
+                                    <item AppInfo="Huli" ConceptLink="http://cdb.iso.org/lg/CDB-00132017-001">hui</item>
+                                    <item AppInfo="Northern Guiyang Hmong" ConceptLink="http://cdb.iso.org/lg/CDB-00132016-001">huj</item>
+                                    <item AppInfo="Hulung" ConceptLink="http://cdb.iso.org/lg/CDB-00132015-001">huk</item>
+                                    <item AppInfo="Hula" ConceptLink="http://cdb.iso.org/lg/CDB-00132014-001">hul</item>
+                                    <item AppInfo="Hungana" ConceptLink="http://cdb.iso.org/lg/CDB-00132013-001">hum</item>
+                                    <item AppInfo="Hungarian" ConceptLink="http://cdb.iso.org/lg/CDB-00138526-001">hun</item>
+                                    <item AppInfo="Hu" ConceptLink="http://cdb.iso.org/lg/CDB-00131994-001">huo</item>
+                                    <item AppInfo="Hupa" ConceptLink="http://cdb.iso.org/lg/CDB-00131969-001">hup</item>
+                                    <item AppInfo="Tsat" ConceptLink="http://cdb.iso.org/lg/CDB-00132002-001">huq</item>
+                                    <item AppInfo="Halkomelem" ConceptLink="http://cdb.iso.org/lg/CDB-00131976-001">hur</item>
+                                    <item AppInfo="Huastec" ConceptLink="http://cdb.iso.org/lg/CDB-00131975-001">hus</item>
+                                    <item AppInfo="Humla" ConceptLink="http://cdb.iso.org/lg/CDB-00131974-001">hut</item>
+                                    <item AppInfo="Murui Huitoto" ConceptLink="http://cdb.iso.org/lg/CDB-00131973-001">huu</item>
+                                    <item AppInfo="San Mateo Del Mar Huave" ConceptLink="http://cdb.iso.org/lg/CDB-00131972-001">huv</item>
+                                    <item AppInfo="Hukumina" ConceptLink="http://cdb.iso.org/lg/CDB-00131963-001">huw</item>
+                                    <item AppInfo="NÃŒpode Huitoto" ConceptLink="http://cdb.iso.org/lg/CDB-00131970-001">hux</item>
+                                    <item AppInfo="HulaulÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00131978-001">huy</item>
+                                    <item AppInfo="Hunzib" ConceptLink="http://cdb.iso.org/lg/CDB-00131968-001">huz</item>
+                                    <item AppInfo="Haitian Vodoun Culture Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131967-001">hvc</item>
+                                    <item AppInfo="San Dionisio Del Mar Huave" ConceptLink="http://cdb.iso.org/lg/CDB-00131966-001">hve</item>
+                                    <item AppInfo="Haveke" ConceptLink="http://cdb.iso.org/lg/CDB-00131965-001">hvk</item>
+                                    <item AppInfo="Sabu" ConceptLink="http://cdb.iso.org/lg/CDB-00131964-001">hvn</item>
+                                    <item AppInfo="Santa MarÃ­a Del Mar Huave" ConceptLink="http://cdb.iso.org/lg/CDB-00131986-001">hvv</item>
+                                    <item AppInfo="WanÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131988-001">hwa</item>
+                                    <item AppInfo="Hawai'i Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00131971-001">hwc</item>
+                                    <item AppInfo="Hwana" ConceptLink="http://cdb.iso.org/lg/CDB-00131993-001">hwo</item>
+                                    <item AppInfo="Hya" ConceptLink="http://cdb.iso.org/lg/CDB-00131992-001">hya</item>
+                                    <item AppInfo="Armenian" ConceptLink="http://cdb.iso.org/lg/CDB-00138527-001">hye</item>
+                                    <item AppInfo="Iaai" ConceptLink="http://cdb.iso.org/lg/CDB-00131991-001">iai</item>
+                                    <item AppInfo="Iatmul" ConceptLink="http://cdb.iso.org/lg/CDB-00131990-001">ian</item>
+                                    <item AppInfo="Iapama" ConceptLink="http://cdb.iso.org/lg/CDB-00131989-001">iap</item>
+                                    <item AppInfo="Purari" ConceptLink="http://cdb.iso.org/lg/CDB-00131979-001">iar</item>
+                                    <item AppInfo="Iban" ConceptLink="http://cdb.iso.org/lg/CDB-00131987-001">iba</item>
+                                    <item AppInfo="Ibibio" ConceptLink="http://cdb.iso.org/lg/CDB-00131995-001">ibb</item>
+                                    <item AppInfo="Iwaidja" ConceptLink="http://cdb.iso.org/lg/CDB-00131985-001">ibd</item>
+                                    <item AppInfo="Akpes" ConceptLink="http://cdb.iso.org/lg/CDB-00131984-001">ibe</item>
+                                    <item AppInfo="Ibanag" ConceptLink="http://cdb.iso.org/lg/CDB-00131983-001">ibg</item>
+                                    <item AppInfo="Ibilo" ConceptLink="http://cdb.iso.org/lg/CDB-00131982-001">ibi</item>
+                                    <item AppInfo="Ibaloi" ConceptLink="http://cdb.iso.org/lg/CDB-00131981-001">ibl</item>
+                                    <item AppInfo="Agoi" ConceptLink="http://cdb.iso.org/lg/CDB-00131980-001">ibm</item>
+                                    <item AppInfo="Ibino" ConceptLink="http://cdb.iso.org/lg/CDB-00131879-001">ibn</item>
+                                    <item AppInfo="Igbo" ConceptLink="http://cdb.iso.org/lg/CDB-00138532-001">ibo</item>
+                                    <item AppInfo="Ibuoro" ConceptLink="http://cdb.iso.org/lg/CDB-00131768-001">ibr</item>
+                                    <item AppInfo="Ibu" ConceptLink="http://cdb.iso.org/lg/CDB-00131899-001">ibu</item>
+                                    <item AppInfo="Ibani" ConceptLink="http://cdb.iso.org/lg/CDB-00131812-001">iby</item>
+                                    <item AppInfo="Ede Ica" ConceptLink="http://cdb.iso.org/lg/CDB-00131811-001">ica</item>
+                                    <item AppInfo="Etkywan" ConceptLink="http://cdb.iso.org/lg/CDB-00131810-001">ich</item>
+                                    <item AppInfo="Icelandic Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131809-001">icl</item>
+                                    <item AppInfo="Islander Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00131808-001">icr</item>
+                                    <item AppInfo="Idakho-Isukha-Tiriki" ConceptLink="http://cdb.iso.org/lg/CDB-00131799-001">ida</item>
+                                    <item AppInfo="Indo-Portuguese" ConceptLink="http://cdb.iso.org/lg/CDB-00131806-001">idb</item>
+                                    <item AppInfo="Idon" ConceptLink="http://cdb.iso.org/lg/CDB-00131814-001">idc</item>
+                                    <item AppInfo="Ede Idaca" ConceptLink="http://cdb.iso.org/lg/CDB-00131804-001">idd</item>
+                                    <item AppInfo="Idere" ConceptLink="http://cdb.iso.org/lg/CDB-00131803-001">ide</item>
+                                    <item AppInfo="Idi" ConceptLink="http://cdb.iso.org/lg/CDB-00131802-001">idi</item>
+                                    <item AppInfo="Ido" ConceptLink="http://cdb.iso.org/lg/CDB-00138535-001">ido</item>
+                                    <item AppInfo="Indri" ConceptLink="http://cdb.iso.org/lg/CDB-00131801-001">idr</item>
+                                    <item AppInfo="Idesa" ConceptLink="http://cdb.iso.org/lg/CDB-00131800-001">ids</item>
+                                    <item AppInfo="IdatÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131822-001">idt</item>
+                                    <item AppInfo="Idoma" ConceptLink="http://cdb.iso.org/lg/CDB-00131824-001">idu</item>
+                                    <item AppInfo="Amganad Ifugao" ConceptLink="http://cdb.iso.org/lg/CDB-00131807-001">ifa</item>
+                                    <item AppInfo="Batad Ifugao" ConceptLink="http://cdb.iso.org/lg/CDB-00131829-001">ifb</item>
+                                    <item AppInfo="IfÃš" ConceptLink="http://cdb.iso.org/lg/CDB-00131828-001">ife</item>
+                                    <item AppInfo="Ifo" ConceptLink="http://cdb.iso.org/lg/CDB-00138269-001">iff</item>
+                                    <item AppInfo="Tuwali Ifugao" ConceptLink="http://cdb.iso.org/lg/CDB-00131827-001">ifk</item>
+                                    <item AppInfo="Teke-Fuumu" ConceptLink="http://cdb.iso.org/lg/CDB-00131826-001">ifm</item>
+                                    <item AppInfo="Mayoyao Ifugao" ConceptLink="http://cdb.iso.org/lg/CDB-00131825-001">ifu</item>
+                                    <item AppInfo="Keley-I Kallahan" ConceptLink="http://cdb.iso.org/lg/CDB-00131815-001">ify</item>
+                                    <item AppInfo="Ebira" ConceptLink="http://cdb.iso.org/lg/CDB-00131823-001">igb</item>
+                                    <item AppInfo="Igede" ConceptLink="http://cdb.iso.org/lg/CDB-00131831-001">ige</item>
+                                    <item AppInfo="Igana" ConceptLink="http://cdb.iso.org/lg/CDB-00131821-001">igg</item>
+                                    <item AppInfo="Igala" ConceptLink="http://cdb.iso.org/lg/CDB-00131820-001">igl</item>
+                                    <item AppInfo="Kanggape" ConceptLink="http://cdb.iso.org/lg/CDB-00131819-001">igm</item>
+                                    <item AppInfo="Ignaciano" ConceptLink="http://cdb.iso.org/lg/CDB-00131818-001">ign</item>
+                                    <item AppInfo="Isebe" ConceptLink="http://cdb.iso.org/lg/CDB-00131817-001">igo</item>
+                                    <item AppInfo="Interglossa" ConceptLink="http://cdb.iso.org/lg/CDB-00138353-001">igs</item>
+                                    <item AppInfo="Igwe" ConceptLink="http://cdb.iso.org/lg/CDB-00131791-001">igw</item>
+                                    <item AppInfo="Iha Based Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00131830-001">ihb</item>
+                                    <item AppInfo="Ihievbe" ConceptLink="http://cdb.iso.org/lg/CDB-00131805-001">ihi</item>
+                                    <item AppInfo="Iha" ConceptLink="http://cdb.iso.org/lg/CDB-00131781-001">ihp</item>
+                                    <item AppInfo="Sichuan Yi; Nuosu" ConceptLink="http://cdb.iso.org/lg/CDB-00138533-001">iii</item>
+                                    <item AppInfo="Izon" ConceptLink="http://cdb.iso.org/lg/CDB-00131780-001">ijc</item>
+                                    <item AppInfo="Biseni" ConceptLink="http://cdb.iso.org/lg/CDB-00131779-001">ije</item>
+                                    <item AppInfo="Ede Ije" ConceptLink="http://cdb.iso.org/lg/CDB-00131778-001">ijj</item>
+                                    <item AppInfo="Kalabari" ConceptLink="http://cdb.iso.org/lg/CDB-00131777-001">ijn</item>
+                                    <item AppInfo="Southeast Ijo" ConceptLink="http://cdb.iso.org/lg/CDB-00131776-001">ijs</item>
+                                    <item AppInfo="Eastern Canadian Inuktitut" ConceptLink="http://cdb.iso.org/lg/CDB-00131767-001">ike</item>
+                                    <item AppInfo="Iko" ConceptLink="http://cdb.iso.org/lg/CDB-00131774-001">iki</item>
+                                    <item AppInfo="Ika" ConceptLink="http://cdb.iso.org/lg/CDB-00131782-001">ikk</item>
+                                    <item AppInfo="Ikulu" ConceptLink="http://cdb.iso.org/lg/CDB-00131772-001">ikl</item>
+                                    <item AppInfo="Olulumo-Ikom" ConceptLink="http://cdb.iso.org/lg/CDB-00131771-001">iko</item>
+                                    <item AppInfo="Ikpeshi" ConceptLink="http://cdb.iso.org/lg/CDB-00131770-001">ikp</item>
+                                    <item AppInfo="Western Canadian Inuktitut" ConceptLink="http://cdb.iso.org/lg/CDB-00131769-001">ikt</item>
+                                    <item AppInfo="Inuktitut" ConceptLink="http://cdb.iso.org/lg/CDB-00138538-001">iku</item>
+                                    <item AppInfo="Iku-Gora-Ankwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131789-001">ikv</item>
+                                    <item AppInfo="Ikwere" ConceptLink="http://cdb.iso.org/lg/CDB-00131773-001">ikw</item>
+                                    <item AppInfo="Ik" ConceptLink="http://cdb.iso.org/lg/CDB-00131775-001">ikx</item>
+                                    <item AppInfo="Ikizu" ConceptLink="http://cdb.iso.org/lg/CDB-00131797-001">ikz</item>
+                                    <item AppInfo="Ile Ape" ConceptLink="http://cdb.iso.org/lg/CDB-00131796-001">ila</item>
+                                    <item AppInfo="Ila" ConceptLink="http://cdb.iso.org/lg/CDB-00131795-001">ilb</item>
+                                    <item AppInfo="Interlingue" ConceptLink="http://cdb.iso.org/lg/CDB-00138531-001">ile</item>
+                                    <item AppInfo="Garig-Ilgar" ConceptLink="http://cdb.iso.org/lg/CDB-00131794-001">ilg</item>
+                                    <item AppInfo="Ili Turki" ConceptLink="http://cdb.iso.org/lg/CDB-00131793-001">ili</item>
+                                    <item AppInfo="Ilongot" ConceptLink="http://cdb.iso.org/lg/CDB-00131792-001">ilk</item>
+                                    <item AppInfo="Iranun" ConceptLink="http://cdb.iso.org/lg/CDB-00131783-001">ill</item>
+                                    <item AppInfo="Iloko" ConceptLink="http://cdb.iso.org/lg/CDB-00131790-001">ilo</item>
+                                    <item AppInfo="International Sign" ConceptLink="http://cdb.iso.org/lg/CDB-00131798-001">ils</item>
+                                    <item AppInfo="Ili'uun" ConceptLink="http://cdb.iso.org/lg/CDB-00131788-001">ilu</item>
+                                    <item AppInfo="Ilue" ConceptLink="http://cdb.iso.org/lg/CDB-00131787-001">ilv</item>
+                                    <item AppInfo="Talur" ConceptLink="http://cdb.iso.org/lg/CDB-00131786-001">ilw</item>
+                                    <item AppInfo="Mala Malasar" ConceptLink="http://cdb.iso.org/lg/CDB-00131785-001">ima</item>
+                                    <item AppInfo="Imeraguen" ConceptLink="http://cdb.iso.org/lg/CDB-00131784-001">ime</item>
+                                    <item AppInfo="Anamgura" ConceptLink="http://cdb.iso.org/lg/CDB-00131846-001">imi</item>
+                                    <item AppInfo="Miluk" ConceptLink="http://cdb.iso.org/lg/CDB-00137971-001">iml</item>
+                                    <item AppInfo="Imonda" ConceptLink="http://cdb.iso.org/lg/CDB-00131896-001">imn</item>
+                                    <item AppInfo="Imbongu" ConceptLink="http://cdb.iso.org/lg/CDB-00131816-001">imo</item>
+                                    <item AppInfo="Imroing" ConceptLink="http://cdb.iso.org/lg/CDB-00131878-001">imr</item>
+                                    <item AppInfo="Marsian" ConceptLink="http://cdb.iso.org/lg/CDB-00138384-001">ims</item>
+                                    <item AppInfo="Milyan" ConceptLink="http://cdb.iso.org/lg/CDB-00138386-001">imy</item>
+                                    <item AppInfo="Interlingua" ConceptLink="http://cdb.iso.org/lg/CDB-00138529-001">ina</item>
+                                    <item AppInfo="Inga" ConceptLink="http://cdb.iso.org/lg/CDB-00131877-001">inb</item>
+                                    <item AppInfo="Indonesian" ConceptLink="http://cdb.iso.org/lg/CDB-00138530-001">ind</item>
+                                    <item AppInfo="Degexit'an" ConceptLink="http://cdb.iso.org/lg/CDB-00131876-001">ing</item>
+                                    <item AppInfo="Ingush" ConceptLink="http://cdb.iso.org/lg/CDB-00131875-001">inh</item>
+                                    <item AppInfo="Jungle Inga" ConceptLink="http://cdb.iso.org/lg/CDB-00131874-001">inj</item>
+                                    <item AppInfo="Indonesian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131865-001">inl</item>
+                                    <item AppInfo="Minaean" ConceptLink="http://cdb.iso.org/lg/CDB-00138378-001">inm</item>
+                                    <item AppInfo="Isinai" ConceptLink="http://cdb.iso.org/lg/CDB-00131872-001">inn</item>
+                                    <item AppInfo="Inoke-Yate" ConceptLink="http://cdb.iso.org/lg/CDB-00131880-001">ino</item>
+                                    <item AppInfo="IÅapari" ConceptLink="http://cdb.iso.org/lg/CDB-00131870-001">inp</item>
+                                    <item AppInfo="Indian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131869-001">ins</item>
+                                    <item AppInfo="Intha" ConceptLink="http://cdb.iso.org/lg/CDB-00131868-001">int</item>
+                                    <item AppInfo="IneseÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00137995-001">inz</item>
+                                    <item AppInfo="Inor" ConceptLink="http://cdb.iso.org/lg/CDB-00131867-001">ior</item>
+                                    <item AppInfo="Tuma-Irumu" ConceptLink="http://cdb.iso.org/lg/CDB-00131866-001">iou</item>
+                                    <item AppInfo="Iowa-Oto" ConceptLink="http://cdb.iso.org/lg/CDB-00137993-001">iow</item>
+                                    <item AppInfo="Ipili" ConceptLink="http://cdb.iso.org/lg/CDB-00131888-001">ipi</item>
+                                    <item AppInfo="Inupiaq" ConceptLink="http://cdb.iso.org/lg/CDB-00138534-001">ipk</item>
+                                    <item AppInfo="Ipiko" ConceptLink="http://cdb.iso.org/lg/CDB-00131890-001">ipo</item>
+                                    <item AppInfo="Iquito" ConceptLink="http://cdb.iso.org/lg/CDB-00131873-001">iqu</item>
+                                    <item AppInfo="Iresim" ConceptLink="http://cdb.iso.org/lg/CDB-00131895-001">ire</item>
+                                    <item AppInfo="Irarutu" ConceptLink="http://cdb.iso.org/lg/CDB-00131894-001">irh</item>
+                                    <item AppInfo="Irigwe" ConceptLink="http://cdb.iso.org/lg/CDB-00131893-001">iri</item>
+                                    <item AppInfo="Iraqw" ConceptLink="http://cdb.iso.org/lg/CDB-00131892-001">irk</item>
+                                    <item AppInfo="IrÃ¡ntxe" ConceptLink="http://cdb.iso.org/lg/CDB-00131891-001">irn</item>
+                                    <item AppInfo="Ir" ConceptLink="http://cdb.iso.org/lg/CDB-00131881-001">irr</item>
+                                    <item AppInfo="Irula" ConceptLink="http://cdb.iso.org/lg/CDB-00131889-001">iru</item>
+                                    <item AppInfo="Kamberau" ConceptLink="http://cdb.iso.org/lg/CDB-00131897-001">irx</item>
+                                    <item AppInfo="Iraya" ConceptLink="http://cdb.iso.org/lg/CDB-00131887-001">iry</item>
+                                    <item AppInfo="Isabi" ConceptLink="http://cdb.iso.org/lg/CDB-00131886-001">isa</item>
+                                    <item AppInfo="Isconahua" ConceptLink="http://cdb.iso.org/lg/CDB-00131885-001">isc</item>
+                                    <item AppInfo="Isnag" ConceptLink="http://cdb.iso.org/lg/CDB-00131884-001">isd</item>
+                                    <item AppInfo="Italian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131883-001">ise</item>
+                                    <item AppInfo="Irish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131882-001">isg</item>
+                                    <item AppInfo="Esan" ConceptLink="http://cdb.iso.org/lg/CDB-00131863-001">ish</item>
+                                    <item AppInfo="Nkem-Nkum" ConceptLink="http://cdb.iso.org/lg/CDB-00131838-001">isi</item>
+                                    <item AppInfo="Icelandic" ConceptLink="http://cdb.iso.org/lg/CDB-00138536-001">isl</item>
+                                    <item AppInfo="Masimasi" ConceptLink="http://cdb.iso.org/lg/CDB-00131871-001">ism</item>
+                                    <item AppInfo="Isanzu" ConceptLink="http://cdb.iso.org/lg/CDB-00131845-001">isn</item>
+                                    <item AppInfo="Isoko" ConceptLink="http://cdb.iso.org/lg/CDB-00131844-001">iso</item>
+                                    <item AppInfo="Israeli Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131843-001">isr</item>
+                                    <item AppInfo="Istriot" ConceptLink="http://cdb.iso.org/lg/CDB-00131842-001">ist</item>
+                                    <item AppInfo="Isu" ConceptLink="http://cdb.iso.org/lg/CDB-00131841-001">isu</item>
+                                    <item AppInfo="Italian" ConceptLink="http://cdb.iso.org/lg/CDB-00138537-001">ita</item>
+                                    <item AppInfo="Binongan Itneg" ConceptLink="http://cdb.iso.org/lg/CDB-00131832-001">itb</item>
+                                    <item AppInfo="Itene" ConceptLink="http://cdb.iso.org/lg/CDB-00137932-001">ite</item>
+                                    <item AppInfo="Inlaod Itneg" ConceptLink="http://cdb.iso.org/lg/CDB-00131839-001">iti</item>
+                                    <item AppInfo="Judeo-Italian" ConceptLink="http://cdb.iso.org/lg/CDB-00131847-001">itk</item>
+                                    <item AppInfo="Itelmen" ConceptLink="http://cdb.iso.org/lg/CDB-00131837-001">itl</item>
+                                    <item AppInfo="Itu Mbon Uzo" ConceptLink="http://cdb.iso.org/lg/CDB-00131836-001">itm</item>
+                                    <item AppInfo="Itonama" ConceptLink="http://cdb.iso.org/lg/CDB-00131835-001">ito</item>
+                                    <item AppInfo="Iteri" ConceptLink="http://cdb.iso.org/lg/CDB-00131834-001">itr</item>
+                                    <item AppInfo="Isekiri" ConceptLink="http://cdb.iso.org/lg/CDB-00131833-001">its</item>
+                                    <item AppInfo="Maeng Itneg" ConceptLink="http://cdb.iso.org/lg/CDB-00131855-001">itt</item>
+                                    <item AppInfo="Itawit" ConceptLink="http://cdb.iso.org/lg/CDB-00131857-001">itv</item>
+                                    <item AppInfo="Ito" ConceptLink="http://cdb.iso.org/lg/CDB-00131840-001">itw</item>
+                                    <item AppInfo="Itik" ConceptLink="http://cdb.iso.org/lg/CDB-00131862-001">itx</item>
+                                    <item AppInfo="Moyadan Itneg" ConceptLink="http://cdb.iso.org/lg/CDB-00131861-001">ity</item>
+                                    <item AppInfo="ItzÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00131860-001">itz</item>
+                                    <item AppInfo="Iu Mien" ConceptLink="http://cdb.iso.org/lg/CDB-00131859-001">ium</item>
+                                    <item AppInfo="Ibatan" ConceptLink="http://cdb.iso.org/lg/CDB-00131858-001">ivb</item>
+                                    <item AppInfo="Ivatan" ConceptLink="http://cdb.iso.org/lg/CDB-00131848-001">ivv</item>
+                                    <item AppInfo="I-Wak" ConceptLink="http://cdb.iso.org/lg/CDB-00131856-001">iwk</item>
+                                    <item AppInfo="Iwam" ConceptLink="http://cdb.iso.org/lg/CDB-00131414-001">iwm</item>
+                                    <item AppInfo="Iwur" ConceptLink="http://cdb.iso.org/lg/CDB-00131854-001">iwo</item>
+                                    <item AppInfo="Sepik Iwam" ConceptLink="http://cdb.iso.org/lg/CDB-00131523-001">iws</item>
+                                    <item AppInfo="Ixcatec" ConceptLink="http://cdb.iso.org/lg/CDB-00131852-001">ixc</item>
+                                    <item AppInfo="Ixil" ConceptLink="http://cdb.iso.org/lg/CDB-00131851-001">ixl</item>
+                                    <item AppInfo="Iyayu" ConceptLink="http://cdb.iso.org/lg/CDB-00131850-001">iya</item>
+                                    <item AppInfo="Mesaka" ConceptLink="http://cdb.iso.org/lg/CDB-00131849-001">iyo</item>
+                                    <item AppInfo="Yaka" ConceptLink="http://cdb.iso.org/lg/CDB-00131944-001">iyx</item>
+                                    <item AppInfo="Ingrian" ConceptLink="http://cdb.iso.org/lg/CDB-00131416-001">izh</item>
+                                    <item AppInfo="Izi-Ezaa-Ikwo-Mgbo" ConceptLink="http://cdb.iso.org/lg/CDB-00131167-001">izi</item>
+                                    <item AppInfo="Izere" ConceptLink="http://cdb.iso.org/lg/CDB-00131166-001">izr</item>
+                                    <item AppInfo="JamamadÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00131165-001">jaa</item>
+                                    <item AppInfo="Hyam" ConceptLink="http://cdb.iso.org/lg/CDB-00131164-001">jab</item>
+                                    <item AppInfo="Popti'" ConceptLink="http://cdb.iso.org/lg/CDB-00131163-001">jac</item>
+                                    <item AppInfo="Jahanka" ConceptLink="http://cdb.iso.org/lg/CDB-00131162-001">jad</item>
+                                    <item AppInfo="Yabem" ConceptLink="http://cdb.iso.org/lg/CDB-00131153-001">jae</item>
+                                    <item AppInfo="Jara" ConceptLink="http://cdb.iso.org/lg/CDB-00131160-001">jaf</item>
+                                    <item AppInfo="Jah Hut" ConceptLink="http://cdb.iso.org/lg/CDB-00131168-001">jah</item>
+                                    <item AppInfo="Zazao" ConceptLink="http://cdb.iso.org/lg/CDB-00131158-001">jaj</item>
+                                    <item AppInfo="Jakun" ConceptLink="http://cdb.iso.org/lg/CDB-00131157-001">jak</item>
+                                    <item AppInfo="Yalahatan" ConceptLink="http://cdb.iso.org/lg/CDB-00131156-001">jal</item>
+                                    <item AppInfo="Jamaican Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00131155-001">jam</item>
+                                    <item AppInfo="Yanyuwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131175-001">jao</item>
+                                    <item AppInfo="Yaqay" ConceptLink="http://cdb.iso.org/lg/CDB-00131159-001">jaq</item>
+                                    <item AppInfo="Jarawa" ConceptLink="http://cdb.iso.org/lg/CDB-00131161-001">jar</item>
+                                    <item AppInfo="New Caledonian Javanese" ConceptLink="http://cdb.iso.org/lg/CDB-00131183-001">jas</item>
+                                    <item AppInfo="Jakati" ConceptLink="http://cdb.iso.org/lg/CDB-00131182-001">jat</item>
+                                    <item AppInfo="Yaur" ConceptLink="http://cdb.iso.org/lg/CDB-00131181-001">jau</item>
+                                    <item AppInfo="Javanese" ConceptLink="http://cdb.iso.org/lg/CDB-00138540-001">jav</item>
+                                    <item AppInfo="Jambi Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00131180-001">jax</item>
+                                    <item AppInfo="Yan-nhangu" ConceptLink="http://cdb.iso.org/lg/CDB-00131179-001">jay</item>
+                                    <item AppInfo="Jawe" ConceptLink="http://cdb.iso.org/lg/CDB-00131178-001">jaz</item>
+                                    <item AppInfo="Judeo-Berber" ConceptLink="http://cdb.iso.org/lg/CDB-00131169-001">jbe</item>
+                                    <item AppInfo="Arandai" ConceptLink="http://cdb.iso.org/lg/CDB-00131176-001">jbj</item>
+                                    <item AppInfo="Nafusi" ConceptLink="http://cdb.iso.org/lg/CDB-00131184-001">jbn</item>
+                                    <item AppInfo="Lojban" ConceptLink="http://cdb.iso.org/lg/CDB-00138357-001">jbo</item>
+                                    <item AppInfo="Jofotek-Bromnya" ConceptLink="http://cdb.iso.org/lg/CDB-00131174-001">jbr</item>
+                                    <item AppInfo="JabutÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00131173-001">jbt</item>
+                                    <item AppInfo="Jukun Takum" ConceptLink="http://cdb.iso.org/lg/CDB-00131172-001">jbu</item>
+                                    <item AppInfo="Jamaican Country Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131171-001">jcs</item>
+                                    <item AppInfo="Krymchak" ConceptLink="http://cdb.iso.org/lg/CDB-00131170-001">jct</item>
+                                    <item AppInfo="Jad" ConceptLink="http://cdb.iso.org/lg/CDB-00131145-001">jda</item>
+                                    <item AppInfo="Jadgali" ConceptLink="http://cdb.iso.org/lg/CDB-00131122-001">jdg</item>
+                                    <item AppInfo="Judeo-Tat" ConceptLink="http://cdb.iso.org/lg/CDB-00131154-001">jdt</item>
+                                    <item AppInfo="Jebero" ConceptLink="http://cdb.iso.org/lg/CDB-00131134-001">jeb</item>
+                                    <item AppInfo="Jerung" ConceptLink="http://cdb.iso.org/lg/CDB-00131133-001">jee</item>
+                                    <item AppInfo="Jeng" ConceptLink="http://cdb.iso.org/lg/CDB-00131132-001">jeg</item>
+                                    <item AppInfo="Jeh" ConceptLink="http://cdb.iso.org/lg/CDB-00131131-001">jeh</item>
+                                    <item AppInfo="Yei" ConceptLink="http://cdb.iso.org/lg/CDB-00131130-001">jei</item>
+                                    <item AppInfo="Jeri Kuo" ConceptLink="http://cdb.iso.org/lg/CDB-00131121-001">jek</item>
+                                    <item AppInfo="Yelmek" ConceptLink="http://cdb.iso.org/lg/CDB-00131128-001">jel</item>
+                                    <item AppInfo="Dza" ConceptLink="http://cdb.iso.org/lg/CDB-00131136-001">jen</item>
+                                    <item AppInfo="Jere" ConceptLink="http://cdb.iso.org/lg/CDB-00131126-001">jer</item>
+                                    <item AppInfo="Manem" ConceptLink="http://cdb.iso.org/lg/CDB-00131125-001">jet</item>
+                                    <item AppInfo="Jonkor Bourmataguil" ConceptLink="http://cdb.iso.org/lg/CDB-00131124-001">jeu</item>
+                                    <item AppInfo="Ngbee" ConceptLink="http://cdb.iso.org/lg/CDB-00138017-001">jgb</item>
+                                    <item AppInfo="Judeo-Georgian" ConceptLink="http://cdb.iso.org/lg/CDB-00131123-001">jge</item>
+                                    <item AppInfo="Ngomba" ConceptLink="http://cdb.iso.org/lg/CDB-00131143-001">jgo</item>
+                                    <item AppInfo="Jehai" ConceptLink="http://cdb.iso.org/lg/CDB-00131127-001">jhi</item>
+                                    <item AppInfo="Jhankot Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131129-001">jhs</item>
+                                    <item AppInfo="Jina" ConceptLink="http://cdb.iso.org/lg/CDB-00131151-001">jia</item>
+                                    <item AppInfo="Jibu" ConceptLink="http://cdb.iso.org/lg/CDB-00131150-001">jib</item>
+                                    <item AppInfo="Tol" ConceptLink="http://cdb.iso.org/lg/CDB-00131149-001">jic</item>
+                                    <item AppInfo="Bu" ConceptLink="http://cdb.iso.org/lg/CDB-00131148-001">jid</item>
+                                    <item AppInfo="Jilbe" ConceptLink="http://cdb.iso.org/lg/CDB-00131147-001">jie</item>
+                                    <item AppInfo="Djingili" ConceptLink="http://cdb.iso.org/lg/CDB-00131146-001">jig</item>
+                                    <item AppInfo="Shangzhai" ConceptLink="http://cdb.iso.org/lg/CDB-00131137-001">jih</item>
+                                    <item AppInfo="Jiiddu" ConceptLink="http://cdb.iso.org/lg/CDB-00131144-001">jii</item>
+                                    <item AppInfo="Jilim" ConceptLink="http://cdb.iso.org/lg/CDB-00131152-001">jil</item>
+                                    <item AppInfo="Jimi" ConceptLink="http://cdb.iso.org/lg/CDB-00131142-001">jim</item>
+                                    <item AppInfo="Jiamao" ConceptLink="http://cdb.iso.org/lg/CDB-00131141-001">jio</item>
+                                    <item AppInfo="Guanyinqiao" ConceptLink="http://cdb.iso.org/lg/CDB-00131140-001">jiq</item>
+                                    <item AppInfo="Jita" ConceptLink="http://cdb.iso.org/lg/CDB-00131139-001">jit</item>
+                                    <item AppInfo="Youle Jinuo" ConceptLink="http://cdb.iso.org/lg/CDB-00131199-001">jiu</item>
+                                    <item AppInfo="Shuar" ConceptLink="http://cdb.iso.org/lg/CDB-00131135-001">jiv</item>
+                                    <item AppInfo="Buyuan Jinuo" ConceptLink="http://cdb.iso.org/lg/CDB-00131177-001">jiy</item>
+                                    <item AppInfo="Kubo" ConceptLink="http://cdb.iso.org/lg/CDB-00131231-001">jko</item>
+                                    <item AppInfo="Labir" ConceptLink="http://cdb.iso.org/lg/CDB-00131230-001">jku</item>
+                                    <item AppInfo="Ngile" ConceptLink="http://cdb.iso.org/lg/CDB-00131229-001">jle</item>
+                                    <item AppInfo="Dima" ConceptLink="http://cdb.iso.org/lg/CDB-00131228-001">jma</item>
+                                    <item AppInfo="Zumbun" ConceptLink="http://cdb.iso.org/lg/CDB-00131227-001">jmb</item>
+                                    <item AppInfo="Machame" ConceptLink="http://cdb.iso.org/lg/CDB-00131226-001">jmc</item>
+                                    <item AppInfo="Yamdena" ConceptLink="http://cdb.iso.org/lg/CDB-00131217-001">jmd</item>
+                                    <item AppInfo="Jimi" ConceptLink="http://cdb.iso.org/lg/CDB-00131224-001">jmi</item>
+                                    <item AppInfo="Jumli" ConceptLink="http://cdb.iso.org/lg/CDB-00131232-001">jml</item>
+                                    <item AppInfo="Makuri Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00131222-001">jmn</item>
+                                    <item AppInfo="Kamara" ConceptLink="http://cdb.iso.org/lg/CDB-00131221-001">jmr</item>
+                                    <item AppInfo="Mashi" ConceptLink="http://cdb.iso.org/lg/CDB-00131220-001">jms</item>
+                                    <item AppInfo="Western Juxtlahuaca Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00131219-001">jmx</item>
+                                    <item AppInfo="Jangshung" ConceptLink="http://cdb.iso.org/lg/CDB-00131239-001">jna</item>
+                                    <item AppInfo="Jandavra" ConceptLink="http://cdb.iso.org/lg/CDB-00131223-001">jnd</item>
+                                    <item AppInfo="Yangman" ConceptLink="http://cdb.iso.org/lg/CDB-00138044-001">jng</item>
+                                    <item AppInfo="Janji" ConceptLink="http://cdb.iso.org/lg/CDB-00131225-001">jni</item>
+                                    <item AppInfo="Yemsa" ConceptLink="http://cdb.iso.org/lg/CDB-00131247-001">jnj</item>
+                                    <item AppInfo="Rawat" ConceptLink="http://cdb.iso.org/lg/CDB-00131246-001">jnl</item>
+                                    <item AppInfo="Jaunsari" ConceptLink="http://cdb.iso.org/lg/CDB-00131245-001">jns</item>
+                                    <item AppInfo="Joba" ConceptLink="http://cdb.iso.org/lg/CDB-00131244-001">job</item>
+                                    <item AppInfo="Wojenaka" ConceptLink="http://cdb.iso.org/lg/CDB-00131243-001">jod</item>
+                                    <item AppInfo="JorÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138068-001">jor</item>
+                                    <item AppInfo="Jordanian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131242-001">jos</item>
+                                    <item AppInfo="Jowulu" ConceptLink="http://cdb.iso.org/lg/CDB-00131233-001">jow</item>
+                                    <item AppInfo="Jewish Palestinian Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00137863-001">jpa</item>
+                                    <item AppInfo="Japanese" ConceptLink="http://cdb.iso.org/lg/CDB-00138539-001">jpn</item>
+                                    <item AppInfo="Judeo-Persian" ConceptLink="http://cdb.iso.org/lg/CDB-00131240-001">jpr</item>
+                                    <item AppInfo="Jaqaru" ConceptLink="http://cdb.iso.org/lg/CDB-00131248-001">jqr</item>
+                                    <item AppInfo="Jarai" ConceptLink="http://cdb.iso.org/lg/CDB-00131238-001">jra</item>
+                                    <item AppInfo="Judeo-Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00130988-001">jrb</item>
+                                    <item AppInfo="Jiru" ConceptLink="http://cdb.iso.org/lg/CDB-00131237-001">jrr</item>
+                                    <item AppInfo="Jorto" ConceptLink="http://cdb.iso.org/lg/CDB-00131236-001">jrt</item>
+                                    <item AppInfo="JaprerÃ­a" ConceptLink="http://cdb.iso.org/lg/CDB-00131235-001">jru</item>
+                                    <item AppInfo="Japanese Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131234-001">jsl</item>
+                                    <item AppInfo="JÃºma" ConceptLink="http://cdb.iso.org/lg/CDB-00131209-001">jua</item>
+                                    <item AppInfo="Wannu" ConceptLink="http://cdb.iso.org/lg/CDB-00131186-001">jub</item>
+                                    <item AppInfo="Jurchen" ConceptLink="http://cdb.iso.org/lg/CDB-00138036-001">juc</item>
+                                    <item AppInfo="Worodougou" ConceptLink="http://cdb.iso.org/lg/CDB-00131218-001">jud</item>
+                                    <item AppInfo="HÅne" ConceptLink="http://cdb.iso.org/lg/CDB-00131198-001">juh</item>
+                                    <item AppInfo="Wapan" ConceptLink="http://cdb.iso.org/lg/CDB-00131197-001">juk</item>
+                                    <item AppInfo="Jirel" ConceptLink="http://cdb.iso.org/lg/CDB-00131196-001">jul</item>
+                                    <item AppInfo="Jumjum" ConceptLink="http://cdb.iso.org/lg/CDB-00131195-001">jum</item>
+                                    <item AppInfo="Juang" ConceptLink="http://cdb.iso.org/lg/CDB-00131194-001">jun</item>
+                                    <item AppInfo="Jiba" ConceptLink="http://cdb.iso.org/lg/CDB-00131185-001">juo</item>
+                                    <item AppInfo="HupdÃ«" ConceptLink="http://cdb.iso.org/lg/CDB-00131192-001">jup</item>
+                                    <item AppInfo="JurÃºna" ConceptLink="http://cdb.iso.org/lg/CDB-00131200-001">jur</item>
+                                    <item AppInfo="Jumla Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131190-001">jus</item>
+                                    <item AppInfo="Jutish" ConceptLink="http://cdb.iso.org/lg/CDB-00131189-001">jut</item>
+                                    <item AppInfo="Ju" ConceptLink="http://cdb.iso.org/lg/CDB-00131188-001">juu</item>
+                                    <item AppInfo="WÃ£pha" ConceptLink="http://cdb.iso.org/lg/CDB-00131187-001">juw</item>
+                                    <item AppInfo="Juray" ConceptLink="http://cdb.iso.org/lg/CDB-00131207-001">juy</item>
+                                    <item AppInfo="Javindo" ConceptLink="http://cdb.iso.org/lg/CDB-00137947-001">jvd</item>
+                                    <item AppInfo="Caribbean Javanese" ConceptLink="http://cdb.iso.org/lg/CDB-00131191-001">jvn</item>
+                                    <item AppInfo="Jwira-Pepesa" ConceptLink="http://cdb.iso.org/lg/CDB-00131193-001">jwi</item>
+                                    <item AppInfo="Jiarong" ConceptLink="http://cdb.iso.org/lg/CDB-00131215-001">jya</item>
+                                    <item AppInfo="Judeo-Yemeni Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00131214-001">jye</item>
+                                    <item AppInfo="Jaya" ConceptLink="http://cdb.iso.org/lg/CDB-00131213-001">jyy</item>
+                                    <item AppInfo="Kara-Kalpak" ConceptLink="http://cdb.iso.org/lg/CDB-00131212-001">kaa</item>
+                                    <item AppInfo="Kabyle" ConceptLink="http://cdb.iso.org/lg/CDB-00131096-001">kab</item>
+                                    <item AppInfo="Kachin; Jingpho" ConceptLink="http://cdb.iso.org/lg/CDB-00131210-001">kac</item>
+                                    <item AppInfo="Kadara" ConceptLink="http://cdb.iso.org/lg/CDB-00131138-001">kad</item>
+                                    <item AppInfo="Ketangalan" ConceptLink="http://cdb.iso.org/lg/CDB-00137986-001">kae</item>
+                                    <item AppInfo="Katso" ConceptLink="http://cdb.iso.org/lg/CDB-00131208-001">kaf</item>
+                                    <item AppInfo="Kajaman" ConceptLink="http://cdb.iso.org/lg/CDB-00131216-001">kag</item>
+                                    <item AppInfo="Kara" ConceptLink="http://cdb.iso.org/lg/CDB-00131206-001">kah</item>
+                                    <item AppInfo="Karekare" ConceptLink="http://cdb.iso.org/lg/CDB-00131205-001">kai</item>
+                                    <item AppInfo="Jju" ConceptLink="http://cdb.iso.org/lg/CDB-00131204-001">kaj</item>
+                                    <item AppInfo="Kayapa Kallahan" ConceptLink="http://cdb.iso.org/lg/CDB-00131203-001">kak</item>
+                                    <item AppInfo="Greenlandic; Kalaallisut" ConceptLink="http://cdb.iso.org/lg/CDB-00138546-001">kal</item>
+                                    <item AppInfo="Kamba" ConceptLink="http://cdb.iso.org/lg/CDB-00131202-001">kam</item>
+                                    <item AppInfo="Kannada" ConceptLink="http://cdb.iso.org/lg/CDB-00138548-001">kan</item>
+                                    <item AppInfo="Xaasongaxango" ConceptLink="http://cdb.iso.org/lg/CDB-00131241-001">kao</item>
+                                    <item AppInfo="Bezhta" ConceptLink="http://cdb.iso.org/lg/CDB-00131098-001">kap</item>
+                                    <item AppInfo="Capanahua" ConceptLink="http://cdb.iso.org/lg/CDB-00131024-001">kaq</item>
+                                    <item AppInfo="Kashmiri" ConceptLink="http://cdb.iso.org/lg/CDB-00138551-001">kas</item>
+                                    <item AppInfo="Georgian" ConceptLink="http://cdb.iso.org/lg/CDB-00138541-001">kat</item>
+                                    <item AppInfo="Kanuri" ConceptLink="http://cdb.iso.org/lg/CDB-00138550-001">kau</item>
+                                    <item AppInfo="KatukÃ­na" ConceptLink="http://cdb.iso.org/lg/CDB-00131025-001">kav</item>
+                                    <item AppInfo="Kawi" ConceptLink="http://cdb.iso.org/lg/CDB-00138367-001">kaw</item>
+                                    <item AppInfo="Kao" ConceptLink="http://cdb.iso.org/lg/CDB-00131026-001">kax</item>
+                                    <item AppInfo="KamayurÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00131027-001">kay</item>
+                                    <item AppInfo="Kazakh" ConceptLink="http://cdb.iso.org/lg/CDB-00138545-001">kaz</item>
+                                    <item AppInfo="Kalarko" ConceptLink="http://cdb.iso.org/lg/CDB-00137996-001">kba</item>
+                                    <item AppInfo="KaxuiÃ¢na" ConceptLink="http://cdb.iso.org/lg/CDB-00137959-001">kbb</item>
+                                    <item AppInfo="KadiwÃ©u" ConceptLink="http://cdb.iso.org/lg/CDB-00131028-001">kbc</item>
+                                    <item AppInfo="Kabardian" ConceptLink="http://cdb.iso.org/lg/CDB-00131029-001">kbd</item>
+                                    <item AppInfo="Kanju" ConceptLink="http://cdb.iso.org/lg/CDB-00131030-001">kbe</item>
+                                    <item AppInfo="Kakauhua" ConceptLink="http://cdb.iso.org/lg/CDB-00137965-001">kbf</item>
+                                    <item AppInfo="Khamba" ConceptLink="http://cdb.iso.org/lg/CDB-00131031-001">kbg</item>
+                                    <item AppInfo="CamsÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00131032-001">kbh</item>
+                                    <item AppInfo="Kaptiau" ConceptLink="http://cdb.iso.org/lg/CDB-00131033-001">kbi</item>
+                                    <item AppInfo="Kari" ConceptLink="http://cdb.iso.org/lg/CDB-00131034-001">kbj</item>
+                                    <item AppInfo="Grass Koiari" ConceptLink="http://cdb.iso.org/lg/CDB-00131035-001">kbk</item>
+                                    <item AppInfo="Kanembu" ConceptLink="http://cdb.iso.org/lg/CDB-00131051-001">kbl</item>
+                                    <item AppInfo="Iwal" ConceptLink="http://cdb.iso.org/lg/CDB-00131037-001">kbm</item>
+                                    <item AppInfo="Kare" ConceptLink="http://cdb.iso.org/lg/CDB-00131023-001">kbn</item>
+                                    <item AppInfo="Keliko" ConceptLink="http://cdb.iso.org/lg/CDB-00131039-001">kbo</item>
+                                    <item AppInfo="KabiyÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131040-001">kbp</item>
+                                    <item AppInfo="Kamano" ConceptLink="http://cdb.iso.org/lg/CDB-00131041-001">kbq</item>
+                                    <item AppInfo="Kafa" ConceptLink="http://cdb.iso.org/lg/CDB-00131042-001">kbr</item>
+                                    <item AppInfo="Kande" ConceptLink="http://cdb.iso.org/lg/CDB-00131043-001">kbs</item>
+                                    <item AppInfo="Abadi" ConceptLink="http://cdb.iso.org/lg/CDB-00131044-001">kbt</item>
+                                    <item AppInfo="Kabutra" ConceptLink="http://cdb.iso.org/lg/CDB-00131020-001">kbu</item>
+                                    <item AppInfo="Dera" ConceptLink="http://cdb.iso.org/lg/CDB-00131046-001">kbv</item>
+                                    <item AppInfo="Kaiep" ConceptLink="http://cdb.iso.org/lg/CDB-00131036-001">kbw</item>
+                                    <item AppInfo="Ap Ma" ConceptLink="http://cdb.iso.org/lg/CDB-00131047-001">kbx</item>
+                                    <item AppInfo="Manga Kanuri" ConceptLink="http://cdb.iso.org/lg/CDB-00131048-001">kby</item>
+                                    <item AppInfo="Duhwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131049-001">kbz</item>
+                                    <item AppInfo="Khanty" ConceptLink="http://cdb.iso.org/lg/CDB-00131050-001">kca</item>
+                                    <item AppInfo="Kawacha" ConceptLink="http://cdb.iso.org/lg/CDB-00131038-001">kcb</item>
+                                    <item AppInfo="Lubila" ConceptLink="http://cdb.iso.org/lg/CDB-00131008-001">kcc</item>
+                                    <item AppInfo="NgkÃ¢lmpw Kanum" ConceptLink="http://cdb.iso.org/lg/CDB-00131003-001">kcd</item>
+                                    <item AppInfo="Kaivi" ConceptLink="http://cdb.iso.org/lg/CDB-00131006-001">kce</item>
+                                    <item AppInfo="Ukaan" ConceptLink="http://cdb.iso.org/lg/CDB-00131011-001">kcf</item>
+                                    <item AppInfo="Tyap" ConceptLink="http://cdb.iso.org/lg/CDB-00131012-001">kcg</item>
+                                    <item AppInfo="Vono" ConceptLink="http://cdb.iso.org/lg/CDB-00131014-001">kch</item>
+                                    <item AppInfo="Kamantan" ConceptLink="http://cdb.iso.org/lg/CDB-00131015-001">kci</item>
+                                    <item AppInfo="Kobiana" ConceptLink="http://cdb.iso.org/lg/CDB-00131016-001">kcj</item>
+                                    <item AppInfo="Kalanga" ConceptLink="http://cdb.iso.org/lg/CDB-00131021-001">kck</item>
+                                    <item AppInfo="Kela" ConceptLink="http://cdb.iso.org/lg/CDB-00131019-001">kcl</item>
+                                    <item AppInfo="Gula" ConceptLink="http://cdb.iso.org/lg/CDB-00131018-001">kcm</item>
+                                    <item AppInfo="Nubi" ConceptLink="http://cdb.iso.org/lg/CDB-00131017-001">kcn</item>
+                                    <item AppInfo="Kinalakna" ConceptLink="http://cdb.iso.org/lg/CDB-00131013-001">kco</item>
+                                    <item AppInfo="Kanga" ConceptLink="http://cdb.iso.org/lg/CDB-00131022-001">kcp</item>
+                                    <item AppInfo="Kamo" ConceptLink="http://cdb.iso.org/lg/CDB-00131004-001">kcq</item>
+                                    <item AppInfo="Katla" ConceptLink="http://cdb.iso.org/lg/CDB-00131005-001">kcr</item>
+                                    <item AppInfo="Koenoem" ConceptLink="http://cdb.iso.org/lg/CDB-00131010-001">kcs</item>
+                                    <item AppInfo="Kaian" ConceptLink="http://cdb.iso.org/lg/CDB-00131007-001">kct</item>
+                                    <item AppInfo="Kami" ConceptLink="http://cdb.iso.org/lg/CDB-00131009-001">kcu</item>
+                                    <item AppInfo="Kete" ConceptLink="http://cdb.iso.org/lg/CDB-00131104-001">kcv</item>
+                                    <item AppInfo="Kabwari" ConceptLink="http://cdb.iso.org/lg/CDB-00131101-001">kcw</item>
+                                    <item AppInfo="Kachama-Ganjule" ConceptLink="http://cdb.iso.org/lg/CDB-00131100-001">kcx</item>
+                                    <item AppInfo="Korandje" ConceptLink="http://cdb.iso.org/lg/CDB-00131099-001">kcy</item>
+                                    <item AppInfo="Konongo" ConceptLink="http://cdb.iso.org/lg/CDB-00131053-001">kcz</item>
+                                    <item AppInfo="Worimi" ConceptLink="http://cdb.iso.org/lg/CDB-00138263-001">kda</item>
+                                    <item AppInfo="Kutu" ConceptLink="http://cdb.iso.org/lg/CDB-00131097-001">kdc</item>
+                                    <item AppInfo="Yankunytjatjara" ConceptLink="http://cdb.iso.org/lg/CDB-00131045-001">kdd</item>
+                                    <item AppInfo="Makonde" ConceptLink="http://cdb.iso.org/lg/CDB-00131086-001">kde</item>
+                                    <item AppInfo="Mamusi" ConceptLink="http://cdb.iso.org/lg/CDB-00131094-001">kdf</item>
+                                    <item AppInfo="Seba" ConceptLink="http://cdb.iso.org/lg/CDB-00131102-001">kdg</item>
+                                    <item AppInfo="Tem" ConceptLink="http://cdb.iso.org/lg/CDB-00131092-001">kdh</item>
+                                    <item AppInfo="Kumam" ConceptLink="http://cdb.iso.org/lg/CDB-00131091-001">kdi</item>
+                                    <item AppInfo="Karamojong" ConceptLink="http://cdb.iso.org/lg/CDB-00131090-001">kdj</item>
+                                    <item AppInfo="Numee" ConceptLink="http://cdb.iso.org/lg/CDB-00131089-001">kdk</item>
+                                    <item AppInfo="Tsikimba" ConceptLink="http://cdb.iso.org/lg/CDB-00131088-001">kdl</item>
+                                    <item AppInfo="Kagoma" ConceptLink="http://cdb.iso.org/lg/CDB-00131087-001">kdm</item>
+                                    <item AppInfo="Kunda" ConceptLink="http://cdb.iso.org/lg/CDB-00131110-001">kdn</item>
+                                    <item AppInfo="Kaningdon-Nindem" ConceptLink="http://cdb.iso.org/lg/CDB-00131112-001">kdp</item>
+                                    <item AppInfo="Koch" ConceptLink="http://cdb.iso.org/lg/CDB-00131095-001">kdq</item>
+                                    <item AppInfo="Karaim" ConceptLink="http://cdb.iso.org/lg/CDB-00131118-001">kdr</item>
+                                    <item AppInfo="Kuy" ConceptLink="http://cdb.iso.org/lg/CDB-00131117-001">kdt</item>
+                                    <item AppInfo="Kadaru" ConceptLink="http://cdb.iso.org/lg/CDB-00131116-001">kdu</item>
+                                    <item AppInfo="Kado" ConceptLink="http://cdb.iso.org/lg/CDB-00131115-001">kdv</item>
+                                    <item AppInfo="Koneraw" ConceptLink="http://cdb.iso.org/lg/CDB-00131114-001">kdw</item>
+                                    <item AppInfo="Kam" ConceptLink="http://cdb.iso.org/lg/CDB-00131113-001">kdx</item>
+                                    <item AppInfo="Keder" ConceptLink="http://cdb.iso.org/lg/CDB-00131103-001">kdy</item>
+                                    <item AppInfo="Kwaja" ConceptLink="http://cdb.iso.org/lg/CDB-00131111-001">kdz</item>
+                                    <item AppInfo="Kabuverdianu" ConceptLink="http://cdb.iso.org/lg/CDB-00131120-001">kea</item>
+                                    <item AppInfo="KÃ©lÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131109-001">keb</item>
+                                    <item AppInfo="Keiga" ConceptLink="http://cdb.iso.org/lg/CDB-00131108-001">kec</item>
+                                    <item AppInfo="Kerewe" ConceptLink="http://cdb.iso.org/lg/CDB-00131107-001">ked</item>
+                                    <item AppInfo="Eastern Keres" ConceptLink="http://cdb.iso.org/lg/CDB-00131106-001">kee</item>
+                                    <item AppInfo="Kpessi" ConceptLink="http://cdb.iso.org/lg/CDB-00131105-001">kef</item>
+                                    <item AppInfo="Tese" ConceptLink="http://cdb.iso.org/lg/CDB-00131078-001">keg</item>
+                                    <item AppInfo="Keak" ConceptLink="http://cdb.iso.org/lg/CDB-00131119-001">keh</item>
+                                    <item AppInfo="Kei" ConceptLink="http://cdb.iso.org/lg/CDB-00131093-001">kei</item>
+                                    <item AppInfo="Kadar" ConceptLink="http://cdb.iso.org/lg/CDB-00131067-001">kej</item>
+                                    <item AppInfo="KekchÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00131066-001">kek</item>
+                                    <item AppInfo="Kela" ConceptLink="http://cdb.iso.org/lg/CDB-00131065-001">kel</item>
+                                    <item AppInfo="Kemak" ConceptLink="http://cdb.iso.org/lg/CDB-00131064-001">kem</item>
+                                    <item AppInfo="Kenyang" ConceptLink="http://cdb.iso.org/lg/CDB-00131063-001">ken</item>
+                                    <item AppInfo="Kakwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131062-001">keo</item>
+                                    <item AppInfo="Kaikadi" ConceptLink="http://cdb.iso.org/lg/CDB-00131052-001">kep</item>
+                                    <item AppInfo="Kamar" ConceptLink="http://cdb.iso.org/lg/CDB-00131060-001">keq</item>
+                                    <item AppInfo="Kera" ConceptLink="http://cdb.iso.org/lg/CDB-00131068-001">ker</item>
+                                    <item AppInfo="Kugbo" ConceptLink="http://cdb.iso.org/lg/CDB-00131058-001">kes</item>
+                                    <item AppInfo="Ket" ConceptLink="http://cdb.iso.org/lg/CDB-00131057-001">ket</item>
+                                    <item AppInfo="Akebu" ConceptLink="http://cdb.iso.org/lg/CDB-00131056-001">keu</item>
+                                    <item AppInfo="Kanikkaran" ConceptLink="http://cdb.iso.org/lg/CDB-00131055-001">kev</item>
+                                    <item AppInfo="West Kewa" ConceptLink="http://cdb.iso.org/lg/CDB-00131054-001">kew</item>
+                                    <item AppInfo="Kukna" ConceptLink="http://cdb.iso.org/lg/CDB-00131076-001">kex</item>
+                                    <item AppInfo="Kupia" ConceptLink="http://cdb.iso.org/lg/CDB-00131059-001">key</item>
+                                    <item AppInfo="Kukele" ConceptLink="http://cdb.iso.org/lg/CDB-00131061-001">kez</item>
+                                    <item AppInfo="Kodava" ConceptLink="http://cdb.iso.org/lg/CDB-00131084-001">kfa</item>
+                                    <item AppInfo="Northwestern Kolami" ConceptLink="http://cdb.iso.org/lg/CDB-00131083-001">kfb</item>
+                                    <item AppInfo="Konda-Dora" ConceptLink="http://cdb.iso.org/lg/CDB-00131082-001">kfc</item>
+                                    <item AppInfo="Korra Koraga" ConceptLink="http://cdb.iso.org/lg/CDB-00131081-001">kfd</item>
+                                    <item AppInfo="Kota" ConceptLink="http://cdb.iso.org/lg/CDB-00131080-001">kfe</item>
+                                    <item AppInfo="Koya" ConceptLink="http://cdb.iso.org/lg/CDB-00131079-001">kff</item>
+                                    <item AppInfo="Kudiya" ConceptLink="http://cdb.iso.org/lg/CDB-00131069-001">kfg</item>
+                                    <item AppInfo="Kurichiya" ConceptLink="http://cdb.iso.org/lg/CDB-00131077-001">kfh</item>
+                                    <item AppInfo="Kannada Kurumba" ConceptLink="http://cdb.iso.org/lg/CDB-00131085-001">kfi</item>
+                                    <item AppInfo="Kemiehua" ConceptLink="http://cdb.iso.org/lg/CDB-00131075-001">kfj</item>
+                                    <item AppInfo="Kinnauri" ConceptLink="http://cdb.iso.org/lg/CDB-00131074-001">kfk</item>
+                                    <item AppInfo="Kung" ConceptLink="http://cdb.iso.org/lg/CDB-00131073-001">kfl</item>
+                                    <item AppInfo="Khunsari" ConceptLink="http://cdb.iso.org/lg/CDB-00131072-001">kfm</item>
+                                    <item AppInfo="Kuk" ConceptLink="http://cdb.iso.org/lg/CDB-00131071-001">kfn</item>
+                                    <item AppInfo="Koro" ConceptLink="http://cdb.iso.org/lg/CDB-00131070-001">kfo</item>
+                                    <item AppInfo="Korwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131201-001">kfp</item>
+                                    <item AppInfo="Korku" ConceptLink="http://cdb.iso.org/lg/CDB-00131458-001">kfq</item>
+                                    <item AppInfo="Kachchi" ConceptLink="http://cdb.iso.org/lg/CDB-00131423-001">kfr</item>
+                                    <item AppInfo="Bilaspuri" ConceptLink="http://cdb.iso.org/lg/CDB-00131422-001">kfs</item>
+                                    <item AppInfo="Kanjari" ConceptLink="http://cdb.iso.org/lg/CDB-00131421-001">kft</item>
+                                    <item AppInfo="Katkari" ConceptLink="http://cdb.iso.org/lg/CDB-00131420-001">kfu</item>
+                                    <item AppInfo="Kurmukar" ConceptLink="http://cdb.iso.org/lg/CDB-00131419-001">kfv</item>
+                                    <item AppInfo="Kharam Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00131418-001">kfw</item>
+                                    <item AppInfo="Kullu Pahari" ConceptLink="http://cdb.iso.org/lg/CDB-00131409-001">kfx</item>
+                                    <item AppInfo="Kumaoni" ConceptLink="http://cdb.iso.org/lg/CDB-00131266-001">kfy</item>
+                                    <item AppInfo="KoromfÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131424-001">kfz</item>
+                                    <item AppInfo="Koyaga" ConceptLink="http://cdb.iso.org/lg/CDB-00131211-001">kga</item>
+                                    <item AppInfo="Kawe" ConceptLink="http://cdb.iso.org/lg/CDB-00131413-001">kgb</item>
+                                    <item AppInfo="Kasseng" ConceptLink="http://cdb.iso.org/lg/CDB-00131412-001">kgc</item>
+                                    <item AppInfo="Kataang" ConceptLink="http://cdb.iso.org/lg/CDB-00131411-001">kgd</item>
+                                    <item AppInfo="Komering" ConceptLink="http://cdb.iso.org/lg/CDB-00131431-001">kge</item>
+                                    <item AppInfo="Kube" ConceptLink="http://cdb.iso.org/lg/CDB-00131415-001">kgf</item>
+                                    <item AppInfo="Kusunda" ConceptLink="http://cdb.iso.org/lg/CDB-00138048-001">kgg</item>
+                                    <item AppInfo="Upper Tanudan Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00131417-001">kgh</item>
+                                    <item AppInfo="Selangor Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131439-001">kgi</item>
+                                    <item AppInfo="Gamale Kham" ConceptLink="http://cdb.iso.org/lg/CDB-00131438-001">kgj</item>
+                                    <item AppInfo="KaiwÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00131437-001">kgk</item>
+                                    <item AppInfo="Kunggari" ConceptLink="http://cdb.iso.org/lg/CDB-00131436-001">kgl</item>
+                                    <item AppInfo="KaripÃºna" ConceptLink="http://cdb.iso.org/lg/CDB-00138046-001">kgm</item>
+                                    <item AppInfo="Karingani" ConceptLink="http://cdb.iso.org/lg/CDB-00131435-001">kgn</item>
+                                    <item AppInfo="Krongo" ConceptLink="http://cdb.iso.org/lg/CDB-00131434-001">kgo</item>
+                                    <item AppInfo="Kaingang" ConceptLink="http://cdb.iso.org/lg/CDB-00131425-001">kgp</item>
+                                    <item AppInfo="Kamoro" ConceptLink="http://cdb.iso.org/lg/CDB-00131432-001">kgq</item>
+                                    <item AppInfo="Abun" ConceptLink="http://cdb.iso.org/lg/CDB-00131440-001">kgr</item>
+                                    <item AppInfo="Kumbainggar" ConceptLink="http://cdb.iso.org/lg/CDB-00131430-001">kgs</item>
+                                    <item AppInfo="Somyev" ConceptLink="http://cdb.iso.org/lg/CDB-00131429-001">kgt</item>
+                                    <item AppInfo="Kobol" ConceptLink="http://cdb.iso.org/lg/CDB-00131428-001">kgu</item>
+                                    <item AppInfo="Karas" ConceptLink="http://cdb.iso.org/lg/CDB-00131427-001">kgv</item>
+                                    <item AppInfo="Karon Dori" ConceptLink="http://cdb.iso.org/lg/CDB-00131426-001">kgw</item>
+                                    <item AppInfo="Kamaru" ConceptLink="http://cdb.iso.org/lg/CDB-00131401-001">kgx</item>
+                                    <item AppInfo="Kyerung" ConceptLink="http://cdb.iso.org/lg/CDB-00131378-001">kgy</item>
+                                    <item AppInfo="Khasi" ConceptLink="http://cdb.iso.org/lg/CDB-00131410-001">kha</item>
+                                    <item AppInfo="LÃŒ" ConceptLink="http://cdb.iso.org/lg/CDB-00131390-001">khb</item>
+                                    <item AppInfo="Tukang Besi North" ConceptLink="http://cdb.iso.org/lg/CDB-00131389-001">khc</item>
+                                    <item AppInfo="BÃ€di Kanum" ConceptLink="http://cdb.iso.org/lg/CDB-00131388-001">khd</item>
+                                    <item AppInfo="Korowai" ConceptLink="http://cdb.iso.org/lg/CDB-00131387-001">khe</item>
+                                    <item AppInfo="Khuen" ConceptLink="http://cdb.iso.org/lg/CDB-00131386-001">khf</item>
+                                    <item AppInfo="Khams Tibetan" ConceptLink="http://cdb.iso.org/lg/CDB-00131377-001">khg</item>
+                                    <item AppInfo="Kehu" ConceptLink="http://cdb.iso.org/lg/CDB-00131384-001">khh</item>
+                                    <item AppInfo="Kuturmi" ConceptLink="http://cdb.iso.org/lg/CDB-00131392-001">khj</item>
+                                    <item AppInfo="Halh Mongolian" ConceptLink="http://cdb.iso.org/lg/CDB-00131382-001">khk</item>
+                                    <item AppInfo="Lusi" ConceptLink="http://cdb.iso.org/lg/CDB-00131381-001">khl</item>
+                                    <item AppInfo="Central Khmer" ConceptLink="http://cdb.iso.org/lg/CDB-00138547-001">khm</item>
+                                    <item AppInfo="Khandesi" ConceptLink="http://cdb.iso.org/lg/CDB-00131380-001">khn</item>
+                                    <item AppInfo="Khotanese; Sakan" ConceptLink="http://cdb.iso.org/lg/CDB-00138453-001">kho</item>
+                                    <item AppInfo="Kapori" ConceptLink="http://cdb.iso.org/lg/CDB-00131379-001">khp</item>
+                                    <item AppInfo="Koyra Chiini Songhay" ConceptLink="http://cdb.iso.org/lg/CDB-00131399-001">khq</item>
+                                    <item AppInfo="Kharia" ConceptLink="http://cdb.iso.org/lg/CDB-00131383-001">khr</item>
+                                    <item AppInfo="Kasua" ConceptLink="http://cdb.iso.org/lg/CDB-00131385-001">khs</item>
+                                    <item AppInfo="Khamti" ConceptLink="http://cdb.iso.org/lg/CDB-00131407-001">kht</item>
+                                    <item AppInfo="Nkhumbi" ConceptLink="http://cdb.iso.org/lg/CDB-00131406-001">khu</item>
+                                    <item AppInfo="Khvarshi" ConceptLink="http://cdb.iso.org/lg/CDB-00131405-001">khv</item>
+                                    <item AppInfo="Khowar" ConceptLink="http://cdb.iso.org/lg/CDB-00131404-001">khw</item>
+                                    <item AppInfo="Kanu" ConceptLink="http://cdb.iso.org/lg/CDB-00131403-001">khx</item>
+                                    <item AppInfo="Kele" ConceptLink="http://cdb.iso.org/lg/CDB-00131402-001">khy</item>
+                                    <item AppInfo="Keapara" ConceptLink="http://cdb.iso.org/lg/CDB-00131393-001">khz</item>
+                                    <item AppInfo="Kim" ConceptLink="http://cdb.iso.org/lg/CDB-00131400-001">kia</item>
+                                    <item AppInfo="Koalib" ConceptLink="http://cdb.iso.org/lg/CDB-00131408-001">kib</item>
+                                    <item AppInfo="Kickapoo" ConceptLink="http://cdb.iso.org/lg/CDB-00131398-001">kic</item>
+                                    <item AppInfo="Koshin" ConceptLink="http://cdb.iso.org/lg/CDB-00131397-001">kid</item>
+                                    <item AppInfo="Kibet" ConceptLink="http://cdb.iso.org/lg/CDB-00131396-001">kie</item>
+                                    <item AppInfo="Eastern Parbate Kham" ConceptLink="http://cdb.iso.org/lg/CDB-00131395-001">kif</item>
+                                    <item AppInfo="Kimaama" ConceptLink="http://cdb.iso.org/lg/CDB-00131394-001">kig</item>
+                                    <item AppInfo="Kilmeri" ConceptLink="http://cdb.iso.org/lg/CDB-00131442-001">kih</item>
+                                    <item AppInfo="Kitsai" ConceptLink="http://cdb.iso.org/lg/CDB-00138101-001">kii</item>
+                                    <item AppInfo="Kilivila" ConceptLink="http://cdb.iso.org/lg/CDB-00131490-001">kij</item>
+                                    <item AppInfo="Kikuyu; Gikuyu" ConceptLink="http://cdb.iso.org/lg/CDB-00138543-001">kik</item>
+                                    <item AppInfo="Kariya" ConceptLink="http://cdb.iso.org/lg/CDB-00131433-001">kil</item>
+                                    <item AppInfo="Karagas" ConceptLink="http://cdb.iso.org/lg/CDB-00131486-001">kim</item>
+                                    <item AppInfo="Kinyarwanda; Rwanda" ConceptLink="http://cdb.iso.org/lg/CDB-00138601-001">kin</item>
+                                    <item AppInfo="Kiowa" ConceptLink="http://cdb.iso.org/lg/CDB-00131485-001">kio</item>
+                                    <item AppInfo="Sheshi Kham" ConceptLink="http://cdb.iso.org/lg/CDB-00131484-001">kip</item>
+                                    <item AppInfo="Kosadle" ConceptLink="http://cdb.iso.org/lg/CDB-00131483-001">kiq</item>
+                                    <item AppInfo="Kyrgyz; Kirghiz" ConceptLink="http://cdb.iso.org/lg/CDB-00138555-001">kir</item>
+                                    <item AppInfo="Kis" ConceptLink="http://cdb.iso.org/lg/CDB-00131482-001">kis</item>
+                                    <item AppInfo="Agob" ConceptLink="http://cdb.iso.org/lg/CDB-00131473-001">kit</item>
+                                    <item AppInfo="Kirmanjki" ConceptLink="http://cdb.iso.org/lg/CDB-00131480-001">kiu</item>
+                                    <item AppInfo="Kimbu" ConceptLink="http://cdb.iso.org/lg/CDB-00131488-001">kiv</item>
+                                    <item AppInfo="Northeast Kiwai" ConceptLink="http://cdb.iso.org/lg/CDB-00131478-001">kiw</item>
+                                    <item AppInfo="Khiamniungan Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00131477-001">kix</item>
+                                    <item AppInfo="Kirikiri" ConceptLink="http://cdb.iso.org/lg/CDB-00131476-001">kiy</item>
+                                    <item AppInfo="Kisi" ConceptLink="http://cdb.iso.org/lg/CDB-00131475-001">kiz</item>
+                                    <item AppInfo="Mlap" ConceptLink="http://cdb.iso.org/lg/CDB-00131474-001">kja</item>
+                                    <item AppInfo="Q'anjob'al" ConceptLink="http://cdb.iso.org/lg/CDB-00131496-001">kjb</item>
+                                    <item AppInfo="Coastal Konjo" ConceptLink="http://cdb.iso.org/lg/CDB-00131498-001">kjc</item>
+                                    <item AppInfo="Southern Kiwai" ConceptLink="http://cdb.iso.org/lg/CDB-00131481-001">kjd</item>
+                                    <item AppInfo="Kisar" ConceptLink="http://cdb.iso.org/lg/CDB-00131503-001">kje</item>
+                                    <item AppInfo="Khalaj" ConceptLink="http://cdb.iso.org/lg/CDB-00131502-001">kjf</item>
+                                    <item AppInfo="Khmu" ConceptLink="http://cdb.iso.org/lg/CDB-00131501-001">kjg</item>
+                                    <item AppInfo="Khakas" ConceptLink="http://cdb.iso.org/lg/CDB-00131500-001">kjh</item>
+                                    <item AppInfo="Zabana" ConceptLink="http://cdb.iso.org/lg/CDB-00131499-001">kji</item>
+                                    <item AppInfo="Khinalugh" ConceptLink="http://cdb.iso.org/lg/CDB-00131489-001">kjj</item>
+                                    <item AppInfo="Highland Konjo" ConceptLink="http://cdb.iso.org/lg/CDB-00131497-001">kjk</item>
+                                    <item AppInfo="Western Parbate Kham" ConceptLink="http://cdb.iso.org/lg/CDB-00131505-001">kjl</item>
+                                    <item AppInfo="KhÃ¡ng" ConceptLink="http://cdb.iso.org/lg/CDB-00131495-001">kjm</item>
+                                    <item AppInfo="Kunjen" ConceptLink="http://cdb.iso.org/lg/CDB-00131494-001">kjn</item>
+                                    <item AppInfo="Harijan Kinnauri" ConceptLink="http://cdb.iso.org/lg/CDB-00131493-001">kjo</item>
+                                    <item AppInfo="Pwo Eastern Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00131492-001">kjp</item>
+                                    <item AppInfo="Western Keres" ConceptLink="http://cdb.iso.org/lg/CDB-00131491-001">kjq</item>
+                                    <item AppInfo="Kurudu" ConceptLink="http://cdb.iso.org/lg/CDB-00131465-001">kjr</item>
+                                    <item AppInfo="East Kewa" ConceptLink="http://cdb.iso.org/lg/CDB-00131504-001">kjs</item>
+                                    <item AppInfo="Phrae Pwo Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00131479-001">kjt</item>
+                                    <item AppInfo="Kashaya" ConceptLink="http://cdb.iso.org/lg/CDB-00131455-001">kju</item>
+                                    <item AppInfo="Ramopa" ConceptLink="http://cdb.iso.org/lg/CDB-00131454-001">kjx</item>
+                                    <item AppInfo="Erave" ConceptLink="http://cdb.iso.org/lg/CDB-00131453-001">kjy</item>
+                                    <item AppInfo="Bumthangkha" ConceptLink="http://cdb.iso.org/lg/CDB-00131452-001">kjz</item>
+                                    <item AppInfo="Kakanda" ConceptLink="http://cdb.iso.org/lg/CDB-00131451-001">kka</item>
+                                    <item AppInfo="Kwerisa" ConceptLink="http://cdb.iso.org/lg/CDB-00131450-001">kkb</item>
+                                    <item AppInfo="Odoodee" ConceptLink="http://cdb.iso.org/lg/CDB-00131441-001">kkc</item>
+                                    <item AppInfo="Kinuku" ConceptLink="http://cdb.iso.org/lg/CDB-00131448-001">kkd</item>
+                                    <item AppInfo="Kakabe" ConceptLink="http://cdb.iso.org/lg/CDB-00131456-001">kke</item>
+                                    <item AppInfo="Kalaktang Monpa" ConceptLink="http://cdb.iso.org/lg/CDB-00131446-001">kkf</item>
+                                    <item AppInfo="Mabaka Valley Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00131445-001">kkg</item>
+                                    <item AppInfo="KhÃŒn" ConceptLink="http://cdb.iso.org/lg/CDB-00131444-001">kkh</item>
+                                    <item AppInfo="Kagulu" ConceptLink="http://cdb.iso.org/lg/CDB-00131443-001">kki</item>
+                                    <item AppInfo="Kako" ConceptLink="http://cdb.iso.org/lg/CDB-00131463-001">kkj</item>
+                                    <item AppInfo="Kokota" ConceptLink="http://cdb.iso.org/lg/CDB-00131447-001">kkk</item>
+                                    <item AppInfo="Kosarek Yale" ConceptLink="http://cdb.iso.org/lg/CDB-00131449-001">kkl</item>
+                                    <item AppInfo="Kiong" ConceptLink="http://cdb.iso.org/lg/CDB-00131471-001">kkm</item>
+                                    <item AppInfo="Kon Keu" ConceptLink="http://cdb.iso.org/lg/CDB-00131470-001">kkn</item>
+                                    <item AppInfo="Karko" ConceptLink="http://cdb.iso.org/lg/CDB-00131469-001">kko</item>
+                                    <item AppInfo="Gugubera" ConceptLink="http://cdb.iso.org/lg/CDB-00131468-001">kkp</item>
+                                    <item AppInfo="Kaiku" ConceptLink="http://cdb.iso.org/lg/CDB-00131467-001">kkq</item>
+                                    <item AppInfo="Kir-Balar" ConceptLink="http://cdb.iso.org/lg/CDB-00131466-001">kkr</item>
+                                    <item AppInfo="Giiwo" ConceptLink="http://cdb.iso.org/lg/CDB-00131457-001">kks</item>
+                                    <item AppInfo="Koi" ConceptLink="http://cdb.iso.org/lg/CDB-00131464-001">kkt</item>
+                                    <item AppInfo="Tumi" ConceptLink="http://cdb.iso.org/lg/CDB-00131472-001">kku</item>
+                                    <item AppInfo="Kangean" ConceptLink="http://cdb.iso.org/lg/CDB-00131462-001">kkv</item>
+                                    <item AppInfo="Teke-Kukuya" ConceptLink="http://cdb.iso.org/lg/CDB-00131461-001">kkw</item>
+                                    <item AppInfo="Kohin" ConceptLink="http://cdb.iso.org/lg/CDB-00131460-001">kkx</item>
+                                    <item AppInfo="Guguyimidjir" ConceptLink="http://cdb.iso.org/lg/CDB-00131459-001">kky</item>
+                                    <item AppInfo="Kaska" ConceptLink="http://cdb.iso.org/lg/CDB-00131369-001">kkz</item>
+                                    <item AppInfo="Klamath-Modoc" ConceptLink="http://cdb.iso.org/lg/CDB-00131487-001">kla</item>
+                                    <item AppInfo="Kiliwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131391-001">klb</item>
+                                    <item AppInfo="Kolbila" ConceptLink="http://cdb.iso.org/lg/CDB-00131295-001">klc</item>
+                                    <item AppInfo="Gamilaraay" ConceptLink="http://cdb.iso.org/lg/CDB-00131294-001">kld</item>
+                                    <item AppInfo="Kulung" ConceptLink="http://cdb.iso.org/lg/CDB-00131293-001">kle</item>
+                                    <item AppInfo="Kendeje" ConceptLink="http://cdb.iso.org/lg/CDB-00131292-001">klf</item>
+                                    <item AppInfo="Tagakaulu Kalagan" ConceptLink="http://cdb.iso.org/lg/CDB-00131291-001">klg</item>
+                                    <item AppInfo="Weliki" ConceptLink="http://cdb.iso.org/lg/CDB-00131290-001">klh</item>
+                                    <item AppInfo="Kalumpang" ConceptLink="http://cdb.iso.org/lg/CDB-00131281-001">kli</item>
+                                    <item AppInfo="Turkic Khalaj" ConceptLink="http://cdb.iso.org/lg/CDB-00131288-001">klj</item>
+                                    <item AppInfo="Kono" ConceptLink="http://cdb.iso.org/lg/CDB-00131296-001">klk</item>
+                                    <item AppInfo="Kagan Kalagan" ConceptLink="http://cdb.iso.org/lg/CDB-00131286-001">kll</item>
+                                    <item AppInfo="Kolom" ConceptLink="http://cdb.iso.org/lg/CDB-00131285-001">klm</item>
+                                    <item AppInfo="Kalenjin" ConceptLink="http://cdb.iso.org/lg/CDB-00130984-001">kln</item>
+                                    <item AppInfo="Kapya" ConceptLink="http://cdb.iso.org/lg/CDB-00131284-001">klo</item>
+                                    <item AppInfo="Kamasa" ConceptLink="http://cdb.iso.org/lg/CDB-00131283-001">klp</item>
+                                    <item AppInfo="Rumu" ConceptLink="http://cdb.iso.org/lg/CDB-00131303-001">klq</item>
+                                    <item AppInfo="Khaling" ConceptLink="http://cdb.iso.org/lg/CDB-00131287-001">klr</item>
+                                    <item AppInfo="Kalasha" ConceptLink="http://cdb.iso.org/lg/CDB-00131289-001">kls</item>
+                                    <item AppInfo="Nukna" ConceptLink="http://cdb.iso.org/lg/CDB-00131311-001">klt</item>
+                                    <item AppInfo="Klao" ConceptLink="http://cdb.iso.org/lg/CDB-00131310-001">klu</item>
+                                    <item AppInfo="Maskelynes" ConceptLink="http://cdb.iso.org/lg/CDB-00131309-001">klv</item>
+                                    <item AppInfo="Lindu" ConceptLink="http://cdb.iso.org/lg/CDB-00131308-001">klw</item>
+                                    <item AppInfo="Koluwawa" ConceptLink="http://cdb.iso.org/lg/CDB-00131307-001">klx</item>
+                                    <item AppInfo="Kalao" ConceptLink="http://cdb.iso.org/lg/CDB-00131306-001">kly</item>
+                                    <item AppInfo="Kabola" ConceptLink="http://cdb.iso.org/lg/CDB-00131297-001">klz</item>
+                                    <item AppInfo="Konni" ConceptLink="http://cdb.iso.org/lg/CDB-00131304-001">kma</item>
+                                    <item AppInfo="Kimbundu" ConceptLink="http://cdb.iso.org/lg/CDB-00131312-001">kmb</item>
+                                    <item AppInfo="Southern Dong" ConceptLink="http://cdb.iso.org/lg/CDB-00131302-001">kmc</item>
+                                    <item AppInfo="Madukayang Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00131301-001">kmd</item>
+                                    <item AppInfo="Bakole" ConceptLink="http://cdb.iso.org/lg/CDB-00131300-001">kme</item>
+                                    <item AppInfo="Kare" ConceptLink="http://cdb.iso.org/lg/CDB-00131299-001">kmf</item>
+                                    <item AppInfo="KÃ¢te" ConceptLink="http://cdb.iso.org/lg/CDB-00131298-001">kmg</item>
+                                    <item AppInfo="Kalam" ConceptLink="http://cdb.iso.org/lg/CDB-00131273-001">kmh</item>
+                                    <item AppInfo="Kami" ConceptLink="http://cdb.iso.org/lg/CDB-00131250-001">kmi</item>
+                                    <item AppInfo="Kumarbhag Paharia" ConceptLink="http://cdb.iso.org/lg/CDB-00131282-001">kmj</item>
+                                    <item AppInfo="Limos Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00131262-001">kmk</item>
+                                    <item AppInfo="Lower Tanudan Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00131261-001">kml</item>
+                                    <item AppInfo="Kom" ConceptLink="http://cdb.iso.org/lg/CDB-00131260-001">kmm</item>
+                                    <item AppInfo="Awtuw" ConceptLink="http://cdb.iso.org/lg/CDB-00131259-001">kmn</item>
+                                    <item AppInfo="Kwoma" ConceptLink="http://cdb.iso.org/lg/CDB-00131258-001">kmo</item>
+                                    <item AppInfo="Gimme" ConceptLink="http://cdb.iso.org/lg/CDB-00131249-001">kmp</item>
+                                    <item AppInfo="Kwama" ConceptLink="http://cdb.iso.org/lg/CDB-00131256-001">kmq</item>
+                                    <item AppInfo="Northern Kurdish" ConceptLink="http://cdb.iso.org/lg/CDB-00131264-001">kmr</item>
+                                    <item AppInfo="Kamasau" ConceptLink="http://cdb.iso.org/lg/CDB-00131254-001">kms</item>
+                                    <item AppInfo="Kemtuik" ConceptLink="http://cdb.iso.org/lg/CDB-00131253-001">kmt</item>
+                                    <item AppInfo="Kanite" ConceptLink="http://cdb.iso.org/lg/CDB-00131252-001">kmu</item>
+                                    <item AppInfo="KaripÃºna Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00131251-001">kmv</item>
+                                    <item AppInfo="Komo" ConceptLink="http://cdb.iso.org/lg/CDB-00131271-001">kmw</item>
+                                    <item AppInfo="Waboda" ConceptLink="http://cdb.iso.org/lg/CDB-00131255-001">kmx</item>
+                                    <item AppInfo="Koma" ConceptLink="http://cdb.iso.org/lg/CDB-00131257-001">kmy</item>
+                                    <item AppInfo="Khorasani Turkish" ConceptLink="http://cdb.iso.org/lg/CDB-00131279-001">kmz</item>
+                                    <item AppInfo="Dera" ConceptLink="http://cdb.iso.org/lg/CDB-00131278-001">kna</item>
+                                    <item AppInfo="Lubuagan Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00131277-001">knb</item>
+                                    <item AppInfo="Central Kanuri" ConceptLink="http://cdb.iso.org/lg/CDB-00131276-001">knc</item>
+                                    <item AppInfo="Konda" ConceptLink="http://cdb.iso.org/lg/CDB-00131275-001">knd</item>
+                                    <item AppInfo="Kankanaey" ConceptLink="http://cdb.iso.org/lg/CDB-00131274-001">kne</item>
+                                    <item AppInfo="Mankanya" ConceptLink="http://cdb.iso.org/lg/CDB-00131265-001">knf</item>
+                                    <item AppInfo="Koongo" ConceptLink="http://cdb.iso.org/lg/CDB-00131272-001">kng</item>
+                                    <item AppInfo="Kanufi" ConceptLink="http://cdb.iso.org/lg/CDB-00131280-001">kni</item>
+                                    <item AppInfo="Western Kanjobal" ConceptLink="http://cdb.iso.org/lg/CDB-00131270-001">knj</item>
+                                    <item AppInfo="Kuranko" ConceptLink="http://cdb.iso.org/lg/CDB-00131269-001">knk</item>
+                                    <item AppInfo="Keninjal" ConceptLink="http://cdb.iso.org/lg/CDB-00131268-001">knl</item>
+                                    <item AppInfo="KanamarÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00131267-001">knm</item>
+                                    <item AppInfo="Konkani" ConceptLink="http://cdb.iso.org/lg/CDB-00131327-001">knn</item>
+                                    <item AppInfo="Kono" ConceptLink="http://cdb.iso.org/lg/CDB-00131263-001">kno</item>
+                                    <item AppInfo="Kwanja" ConceptLink="http://cdb.iso.org/lg/CDB-00131305-001">knp</item>
+                                    <item AppInfo="Kintaq" ConceptLink="http://cdb.iso.org/lg/CDB-00131359-001">knq</item>
+                                    <item AppInfo="Kaningra" ConceptLink="http://cdb.iso.org/lg/CDB-00131358-001">knr</item>
+                                    <item AppInfo="Kensiu" ConceptLink="http://cdb.iso.org/lg/CDB-00131357-001">kns</item>
+                                    <item AppInfo="Panoan KatukÃ­na" ConceptLink="http://cdb.iso.org/lg/CDB-00131356-001">knt</item>
+                                    <item AppInfo="Kono" ConceptLink="http://cdb.iso.org/lg/CDB-00131355-001">knu</item>
+                                    <item AppInfo="Tabo" ConceptLink="http://cdb.iso.org/lg/CDB-00131354-001">knv</item>
+                                    <item AppInfo="Kung-Ekoka" ConceptLink="http://cdb.iso.org/lg/CDB-00131345-001">knw</item>
+                                    <item AppInfo="Kendayan" ConceptLink="http://cdb.iso.org/lg/CDB-00131352-001">knx</item>
+                                    <item AppInfo="Kanyok" ConceptLink="http://cdb.iso.org/lg/CDB-00131360-001">kny</item>
+                                    <item AppInfo="KalamsÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131350-001">knz</item>
+                                    <item AppInfo="Konomala" ConceptLink="http://cdb.iso.org/lg/CDB-00131349-001">koa</item>
+                                    <item AppInfo="Kpati" ConceptLink="http://cdb.iso.org/lg/CDB-00138168-001">koc</item>
+                                    <item AppInfo="Kodi" ConceptLink="http://cdb.iso.org/lg/CDB-00131348-001">kod</item>
+                                    <item AppInfo="Kacipo-Balesi" ConceptLink="http://cdb.iso.org/lg/CDB-00131347-001">koe</item>
+                                    <item AppInfo="Kubi" ConceptLink="http://cdb.iso.org/lg/CDB-00138173-001">kof</item>
+                                    <item AppInfo="Cogui" ConceptLink="http://cdb.iso.org/lg/CDB-00131367-001">kog</item>
+                                    <item AppInfo="Koyo" ConceptLink="http://cdb.iso.org/lg/CDB-00131351-001">koh</item>
+                                    <item AppInfo="Komi-Permyak" ConceptLink="http://cdb.iso.org/lg/CDB-00131353-001">koi</item>
+                                    <item AppInfo="Sara Dunjo" ConceptLink="http://cdb.iso.org/lg/CDB-00131375-001">koj</item>
+                                    <item AppInfo="Konkani" ConceptLink="http://cdb.iso.org/lg/CDB-00130991-001">kok</item>
+                                    <item AppInfo="Kol" ConceptLink="http://cdb.iso.org/lg/CDB-00131374-001">kol</item>
+                                    <item AppInfo="Komi" ConceptLink="http://cdb.iso.org/lg/CDB-00138553-001">kom</item>
+                                    <item AppInfo="Kongo" ConceptLink="http://cdb.iso.org/lg/CDB-00138542-001">kon</item>
+                                    <item AppInfo="Konzo" ConceptLink="http://cdb.iso.org/lg/CDB-00131373-001">koo</item>
+                                    <item AppInfo="Kwato" ConceptLink="http://cdb.iso.org/lg/CDB-00131372-001">kop</item>
+                                    <item AppInfo="Kota" ConceptLink="http://cdb.iso.org/lg/CDB-00131371-001">koq</item>
+                                    <item AppInfo="Korean" ConceptLink="http://cdb.iso.org/lg/CDB-00138549-001">kor</item>
+                                    <item AppInfo="Kosraean" ConceptLink="http://cdb.iso.org/lg/CDB-00131370-001">kos</item>
+                                    <item AppInfo="Lagwan" ConceptLink="http://cdb.iso.org/lg/CDB-00131361-001">kot</item>
+                                    <item AppInfo="Koke" ConceptLink="http://cdb.iso.org/lg/CDB-00131368-001">kou</item>
+                                    <item AppInfo="Kudu-Camo" ConceptLink="http://cdb.iso.org/lg/CDB-00131376-001">kov</item>
+                                    <item AppInfo="Kugama" ConceptLink="http://cdb.iso.org/lg/CDB-00131366-001">kow</item>
+                                    <item AppInfo="Coxima" ConceptLink="http://cdb.iso.org/lg/CDB-00138220-001">kox</item>
+                                    <item AppInfo="Koyukon" ConceptLink="http://cdb.iso.org/lg/CDB-00131365-001">koy</item>
+                                    <item AppInfo="Korak" ConceptLink="http://cdb.iso.org/lg/CDB-00131364-001">koz</item>
+                                    <item AppInfo="Kutto" ConceptLink="http://cdb.iso.org/lg/CDB-00131363-001">kpa</item>
+                                    <item AppInfo="Mullu Kurumba" ConceptLink="http://cdb.iso.org/lg/CDB-00131362-001">kpb</item>
+                                    <item AppInfo="Curripaco" ConceptLink="http://cdb.iso.org/lg/CDB-00131337-001">kpc</item>
+                                    <item AppInfo="Koba" ConceptLink="http://cdb.iso.org/lg/CDB-00131314-001">kpd</item>
+                                    <item AppInfo="Kpelle" ConceptLink="http://cdb.iso.org/lg/CDB-00130983-001">kpe</item>
+                                    <item AppInfo="Komba" ConceptLink="http://cdb.iso.org/lg/CDB-00131346-001">kpf</item>
+                                    <item AppInfo="Kapingamarangi" ConceptLink="http://cdb.iso.org/lg/CDB-00131326-001">kpg</item>
+                                    <item AppInfo="Kplang" ConceptLink="http://cdb.iso.org/lg/CDB-00131325-001">kph</item>
+                                    <item AppInfo="Kofei" ConceptLink="http://cdb.iso.org/lg/CDB-00131324-001">kpi</item>
+                                    <item AppInfo="KarajÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00131323-001">kpj</item>
+                                    <item AppInfo="Kpan" ConceptLink="http://cdb.iso.org/lg/CDB-00131322-001">kpk</item>
+                                    <item AppInfo="Kpala" ConceptLink="http://cdb.iso.org/lg/CDB-00131313-001">kpl</item>
+                                    <item AppInfo="Koho" ConceptLink="http://cdb.iso.org/lg/CDB-00131320-001">kpm</item>
+                                    <item AppInfo="KepkiriwÃ¡t" ConceptLink="http://cdb.iso.org/lg/CDB-00138180-001">kpn</item>
+                                    <item AppInfo="Ikposo" ConceptLink="http://cdb.iso.org/lg/CDB-00131328-001">kpo</item>
+                                    <item AppInfo="Paku Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00131318-001">kpp</item>
+                                    <item AppInfo="Korupun-Sela" ConceptLink="http://cdb.iso.org/lg/CDB-00131317-001">kpq</item>
+                                    <item AppInfo="Korafe-Yegha" ConceptLink="http://cdb.iso.org/lg/CDB-00131316-001">kpr</item>
+                                    <item AppInfo="Tehit" ConceptLink="http://cdb.iso.org/lg/CDB-00131315-001">kps</item>
+                                    <item AppInfo="Karata" ConceptLink="http://cdb.iso.org/lg/CDB-00131335-001">kpt</item>
+                                    <item AppInfo="Kafoa" ConceptLink="http://cdb.iso.org/lg/CDB-00131319-001">kpu</item>
+                                    <item AppInfo="Komi-Zyrian" ConceptLink="http://cdb.iso.org/lg/CDB-00131321-001">kpv</item>
+                                    <item AppInfo="Kobon" ConceptLink="http://cdb.iso.org/lg/CDB-00131343-001">kpw</item>
+                                    <item AppInfo="Mountain Koiali" ConceptLink="http://cdb.iso.org/lg/CDB-00131342-001">kpx</item>
+                                    <item AppInfo="Koryak" ConceptLink="http://cdb.iso.org/lg/CDB-00131341-001">kpy</item>
+                                    <item AppInfo="Kupsabiny" ConceptLink="http://cdb.iso.org/lg/CDB-00131340-001">kpz</item>
+                                    <item AppInfo="Mum" ConceptLink="http://cdb.iso.org/lg/CDB-00131339-001">kqa</item>
+                                    <item AppInfo="Kovai" ConceptLink="http://cdb.iso.org/lg/CDB-00131338-001">kqb</item>
+                                    <item AppInfo="Doromu-Koki" ConceptLink="http://cdb.iso.org/lg/CDB-00131329-001">kqc</item>
+                                    <item AppInfo="Koy Sanjaq Surat" ConceptLink="http://cdb.iso.org/lg/CDB-00131336-001">kqd</item>
+                                    <item AppInfo="Kalagan" ConceptLink="http://cdb.iso.org/lg/CDB-00131344-001">kqe</item>
+                                    <item AppInfo="Kakabai" ConceptLink="http://cdb.iso.org/lg/CDB-00131334-001">kqf</item>
+                                    <item AppInfo="Khe" ConceptLink="http://cdb.iso.org/lg/CDB-00131333-001">kqg</item>
+                                    <item AppInfo="Kisankasa" ConceptLink="http://cdb.iso.org/lg/CDB-00131332-001">kqh</item>
+                                    <item AppInfo="Koitabu" ConceptLink="http://cdb.iso.org/lg/CDB-00131331-001">kqi</item>
+                                    <item AppInfo="Koromira" ConceptLink="http://cdb.iso.org/lg/CDB-00131330-001">kqj</item>
+                                    <item AppInfo="Kotafon Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00131853-001">kqk</item>
+                                    <item AppInfo="Kyenele" ConceptLink="http://cdb.iso.org/lg/CDB-00133024-001">kql</item>
+                                    <item AppInfo="Khisa" ConceptLink="http://cdb.iso.org/lg/CDB-00132727-001">kqm</item>
+                                    <item AppInfo="Kaonde" ConceptLink="http://cdb.iso.org/lg/CDB-00132726-001">kqn</item>
+                                    <item AppInfo="Eastern Krahn" ConceptLink="http://cdb.iso.org/lg/CDB-00132725-001">kqo</item>
+                                    <item AppInfo="KimrÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00132724-001">kqp</item>
+                                    <item AppInfo="Krenak" ConceptLink="http://cdb.iso.org/lg/CDB-00132723-001">kqq</item>
+                                    <item AppInfo="Kimaragang" ConceptLink="http://cdb.iso.org/lg/CDB-00132205-001">kqr</item>
+                                    <item AppInfo="Northern Kissi" ConceptLink="http://cdb.iso.org/lg/CDB-00132713-001">kqs</item>
+                                    <item AppInfo="Klias River Kadazan" ConceptLink="http://cdb.iso.org/lg/CDB-00131864-001">kqt</item>
+                                    <item AppInfo="Seroa" ConceptLink="http://cdb.iso.org/lg/CDB-00138334-001">kqu</item>
+                                    <item AppInfo="Okolod" ConceptLink="http://cdb.iso.org/lg/CDB-00132728-001">kqv</item>
+                                    <item AppInfo="Kandas" ConceptLink="http://cdb.iso.org/lg/CDB-00132718-001">kqw</item>
+                                    <item AppInfo="Mser" ConceptLink="http://cdb.iso.org/lg/CDB-00132717-001">kqx</item>
+                                    <item AppInfo="Koorete" ConceptLink="http://cdb.iso.org/lg/CDB-00132716-001">kqy</item>
+                                    <item AppInfo="Korana" ConceptLink="http://cdb.iso.org/lg/CDB-00138304-001">kqz</item>
+                                    <item AppInfo="Kumhali" ConceptLink="http://cdb.iso.org/lg/CDB-00132715-001">kra</item>
+                                    <item AppInfo="Karkin" ConceptLink="http://cdb.iso.org/lg/CDB-00138265-001">krb</item>
+                                    <item AppInfo="Karachay-Balkar" ConceptLink="http://cdb.iso.org/lg/CDB-00132714-001">krc</item>
+                                    <item AppInfo="Kairui-Midiki" ConceptLink="http://cdb.iso.org/lg/CDB-00132736-001">krd</item>
+                                    <item AppInfo="PanarÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00132738-001">kre</item>
+                                    <item AppInfo="Koro" ConceptLink="http://cdb.iso.org/lg/CDB-00132721-001">krf</item>
+                                    <item AppInfo="Kurama" ConceptLink="http://cdb.iso.org/lg/CDB-00132743-001">krh</item>
+                                    <item AppInfo="Krio" ConceptLink="http://cdb.iso.org/lg/CDB-00132742-001">kri</item>
+                                    <item AppInfo="Kinaray-A" ConceptLink="http://cdb.iso.org/lg/CDB-00132741-001">krj</item>
+                                    <item AppInfo="Kerek" ConceptLink="http://cdb.iso.org/lg/CDB-00132740-001">krk</item>
+                                    <item AppInfo="Karelian" ConceptLink="http://cdb.iso.org/lg/CDB-00132739-001">krl</item>
+                                    <item AppInfo="Krim" ConceptLink="http://cdb.iso.org/lg/CDB-00132729-001">krm</item>
+                                    <item AppInfo="Sapo" ConceptLink="http://cdb.iso.org/lg/CDB-00132737-001">krn</item>
+                                    <item AppInfo="Korop" ConceptLink="http://cdb.iso.org/lg/CDB-00132745-001">krp</item>
+                                    <item AppInfo="Kru'ng 2" ConceptLink="http://cdb.iso.org/lg/CDB-00132735-001">krr</item>
+                                    <item AppInfo="Gbaya" ConceptLink="http://cdb.iso.org/lg/CDB-00132734-001">krs</item>
+                                    <item AppInfo="Tumari Kanuri" ConceptLink="http://cdb.iso.org/lg/CDB-00132733-001">krt</item>
+                                    <item AppInfo="Kurukh" ConceptLink="http://cdb.iso.org/lg/CDB-00132732-001">kru</item>
+                                    <item AppInfo="Kavet" ConceptLink="http://cdb.iso.org/lg/CDB-00132731-001">krv</item>
+                                    <item AppInfo="Western Krahn" ConceptLink="http://cdb.iso.org/lg/CDB-00132705-001">krw</item>
+                                    <item AppInfo="Karon" ConceptLink="http://cdb.iso.org/lg/CDB-00132744-001">krx</item>
+                                    <item AppInfo="Kryts" ConceptLink="http://cdb.iso.org/lg/CDB-00132719-001">kry</item>
+                                    <item AppInfo="Sota Kanum" ConceptLink="http://cdb.iso.org/lg/CDB-00132695-001">krz</item>
+                                    <item AppInfo="Shuwa-Zamani" ConceptLink="http://cdb.iso.org/lg/CDB-00132694-001">ksa</item>
+                                    <item AppInfo="Shambala" ConceptLink="http://cdb.iso.org/lg/CDB-00132693-001">ksb</item>
+                                    <item AppInfo="Southern Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00132692-001">ksc</item>
+                                    <item AppInfo="Kuanua" ConceptLink="http://cdb.iso.org/lg/CDB-00132691-001">ksd</item>
+                                    <item AppInfo="Kuni" ConceptLink="http://cdb.iso.org/lg/CDB-00132690-001">kse</item>
+                                    <item AppInfo="Bafia" ConceptLink="http://cdb.iso.org/lg/CDB-00132681-001">ksf</item>
+                                    <item AppInfo="Kusaghe" ConceptLink="http://cdb.iso.org/lg/CDB-00132688-001">ksg</item>
+                                    <item AppInfo="KÃ¶lsch" ConceptLink="http://cdb.iso.org/lg/CDB-00132696-001">ksh</item>
+                                    <item AppInfo="Krisa" ConceptLink="http://cdb.iso.org/lg/CDB-00132686-001">ksi</item>
+                                    <item AppInfo="Uare" ConceptLink="http://cdb.iso.org/lg/CDB-00132685-001">ksj</item>
+                                    <item AppInfo="Kansa" ConceptLink="http://cdb.iso.org/lg/CDB-00132684-001">ksk</item>
+                                    <item AppInfo="Kumalu" ConceptLink="http://cdb.iso.org/lg/CDB-00132683-001">ksl</item>
+                                    <item AppInfo="Kumba" ConceptLink="http://cdb.iso.org/lg/CDB-00132703-001">ksm</item>
+                                    <item AppInfo="Kasiguranin" ConceptLink="http://cdb.iso.org/lg/CDB-00132687-001">ksn</item>
+                                    <item AppInfo="Kofa" ConceptLink="http://cdb.iso.org/lg/CDB-00132689-001">kso</item>
+                                    <item AppInfo="Kaba" ConceptLink="http://cdb.iso.org/lg/CDB-00132711-001">ksp</item>
+                                    <item AppInfo="Kwaami" ConceptLink="http://cdb.iso.org/lg/CDB-00132710-001">ksq</item>
+                                    <item AppInfo="Borong" ConceptLink="http://cdb.iso.org/lg/CDB-00132709-001">ksr</item>
+                                    <item AppInfo="Southern Kisi" ConceptLink="http://cdb.iso.org/lg/CDB-00132708-001">kss</item>
+                                    <item AppInfo="WinyÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00132707-001">kst</item>
+                                    <item AppInfo="Khamyang" ConceptLink="http://cdb.iso.org/lg/CDB-00132706-001">ksu</item>
+                                    <item AppInfo="Kusu" ConceptLink="http://cdb.iso.org/lg/CDB-00132697-001">ksv</item>
+                                    <item AppInfo="S'gaw Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132704-001">ksw</item>
+                                    <item AppInfo="Kedang" ConceptLink="http://cdb.iso.org/lg/CDB-00132712-001">ksx</item>
+                                    <item AppInfo="Kharia Thar" ConceptLink="http://cdb.iso.org/lg/CDB-00132702-001">ksy</item>
+                                    <item AppInfo="Kodaku" ConceptLink="http://cdb.iso.org/lg/CDB-00132701-001">ksz</item>
+                                    <item AppInfo="Katua" ConceptLink="http://cdb.iso.org/lg/CDB-00132700-001">kta</item>
+                                    <item AppInfo="Kambaata" ConceptLink="http://cdb.iso.org/lg/CDB-00132699-001">ktb</item>
+                                    <item AppInfo="Kholok" ConceptLink="http://cdb.iso.org/lg/CDB-00132698-001">ktc</item>
+                                    <item AppInfo="Kokata" ConceptLink="http://cdb.iso.org/lg/CDB-00132760-001">ktd</item>
+                                    <item AppInfo="Nubri" ConceptLink="http://cdb.iso.org/lg/CDB-00132810-001">kte</item>
+                                    <item AppInfo="Kwami" ConceptLink="http://cdb.iso.org/lg/CDB-00132730-001">ktf</item>
+                                    <item AppInfo="Kalkutung" ConceptLink="http://cdb.iso.org/lg/CDB-00137941-001">ktg</item>
+                                    <item AppInfo="Karanga" ConceptLink="http://cdb.iso.org/lg/CDB-00132792-001">kth</item>
+                                    <item AppInfo="North Muyu" ConceptLink="http://cdb.iso.org/lg/CDB-00132791-001">kti</item>
+                                    <item AppInfo="Plapo Krumen" ConceptLink="http://cdb.iso.org/lg/CDB-00132790-001">ktj</item>
+                                    <item AppInfo="Kaniet" ConceptLink="http://cdb.iso.org/lg/CDB-00137931-001">ktk</item>
+                                    <item AppInfo="Koroshi" ConceptLink="http://cdb.iso.org/lg/CDB-00132789-001">ktl</item>
+                                    <item AppInfo="Kurti" ConceptLink="http://cdb.iso.org/lg/CDB-00132788-001">ktm</item>
+                                    <item AppInfo="KaritiÃ¢na" ConceptLink="http://cdb.iso.org/lg/CDB-00132779-001">ktn</item>
+                                    <item AppInfo="Kuot" ConceptLink="http://cdb.iso.org/lg/CDB-00132786-001">kto</item>
+                                    <item AppInfo="Kaduo" ConceptLink="http://cdb.iso.org/lg/CDB-00132794-001">ktp</item>
+                                    <item AppInfo="Katabaga" ConceptLink="http://cdb.iso.org/lg/CDB-00137990-001">ktq</item>
+                                    <item AppInfo="Kota Marudu Tinagas" ConceptLink="http://cdb.iso.org/lg/CDB-00132784-001">ktr</item>
+                                    <item AppInfo="South Muyu" ConceptLink="http://cdb.iso.org/lg/CDB-00132783-001">kts</item>
+                                    <item AppInfo="Ketum" ConceptLink="http://cdb.iso.org/lg/CDB-00132782-001">ktt</item>
+                                    <item AppInfo="Kituba" ConceptLink="http://cdb.iso.org/lg/CDB-00132781-001">ktu</item>
+                                    <item AppInfo="Eastern Katu" ConceptLink="http://cdb.iso.org/lg/CDB-00132780-001">ktv</item>
+                                    <item AppInfo="Kato" ConceptLink="http://cdb.iso.org/lg/CDB-00137992-001">ktw</item>
+                                    <item AppInfo="KaxararÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00132802-001">ktx</item>
+                                    <item AppInfo="Kango" ConceptLink="http://cdb.iso.org/lg/CDB-00132804-001">kty</item>
+                                    <item AppInfo="Ju/'hoan" ConceptLink="http://cdb.iso.org/lg/CDB-00132787-001">ktz</item>
+                                    <item AppInfo="Kuanyama; Kwanyama" ConceptLink="http://cdb.iso.org/lg/CDB-00138544-001">kua</item>
+                                    <item AppInfo="Kutep" ConceptLink="http://cdb.iso.org/lg/CDB-00132809-001">kub</item>
+                                    <item AppInfo="Kwinsu" ConceptLink="http://cdb.iso.org/lg/CDB-00132808-001">kuc</item>
+                                    <item AppInfo="'Auhelawa" ConceptLink="http://cdb.iso.org/lg/CDB-00132807-001">kud</item>
+                                    <item AppInfo="Kuman" ConceptLink="http://cdb.iso.org/lg/CDB-00132806-001">kue</item>
+                                    <item AppInfo="Western Katu" ConceptLink="http://cdb.iso.org/lg/CDB-00132805-001">kuf</item>
+                                    <item AppInfo="Kupa" ConceptLink="http://cdb.iso.org/lg/CDB-00132795-001">kug</item>
+                                    <item AppInfo="Kushi" ConceptLink="http://cdb.iso.org/lg/CDB-00132803-001">kuh</item>
+                                    <item AppInfo="KuikÃºro-KalapÃ¡lo" ConceptLink="http://cdb.iso.org/lg/CDB-00132811-001">kui</item>
+                                    <item AppInfo="Kuria" ConceptLink="http://cdb.iso.org/lg/CDB-00132801-001">kuj</item>
+                                    <item AppInfo="Kepo'" ConceptLink="http://cdb.iso.org/lg/CDB-00132800-001">kuk</item>
+                                    <item AppInfo="Kulere" ConceptLink="http://cdb.iso.org/lg/CDB-00132799-001">kul</item>
+                                    <item AppInfo="Kumyk" ConceptLink="http://cdb.iso.org/lg/CDB-00132798-001">kum</item>
+                                    <item AppInfo="Kunama" ConceptLink="http://cdb.iso.org/lg/CDB-00132797-001">kun</item>
+                                    <item AppInfo="Kumukio" ConceptLink="http://cdb.iso.org/lg/CDB-00132796-001">kuo</item>
+                                    <item AppInfo="Kunimaipa" ConceptLink="http://cdb.iso.org/lg/CDB-00132777-001">kup</item>
+                                    <item AppInfo="Karipuna" ConceptLink="http://cdb.iso.org/lg/CDB-00132752-001">kuq</item>
+                                    <item AppInfo="Kurdish" ConceptLink="http://cdb.iso.org/lg/CDB-00138552-001">kur</item>
+                                    <item AppInfo="Kusaal" ConceptLink="http://cdb.iso.org/lg/CDB-00132785-001">kus</item>
+                                    <item AppInfo="Kutenai" ConceptLink="http://cdb.iso.org/lg/CDB-00132759-001">kut</item>
+                                    <item AppInfo="Upper Kuskokwim" ConceptLink="http://cdb.iso.org/lg/CDB-00132758-001">kuu</item>
+                                    <item AppInfo="Kur" ConceptLink="http://cdb.iso.org/lg/CDB-00132757-001">kuv</item>
+                                    <item AppInfo="Kpagua" ConceptLink="http://cdb.iso.org/lg/CDB-00132756-001">kuw</item>
+                                    <item AppInfo="Kukatja" ConceptLink="http://cdb.iso.org/lg/CDB-00132755-001">kux</item>
+                                    <item AppInfo="Kuuku-Ya'u" ConceptLink="http://cdb.iso.org/lg/CDB-00132746-001">kuy</item>
+                                    <item AppInfo="Kunza" ConceptLink="http://cdb.iso.org/lg/CDB-00138066-001">kuz</item>
+                                    <item AppInfo="Bagvalal" ConceptLink="http://cdb.iso.org/lg/CDB-00132753-001">kva</item>
+                                    <item AppInfo="Kubu" ConceptLink="http://cdb.iso.org/lg/CDB-00132761-001">kvb</item>
+                                    <item AppInfo="Kove" ConceptLink="http://cdb.iso.org/lg/CDB-00132751-001">kvc</item>
+                                    <item AppInfo="Kui" ConceptLink="http://cdb.iso.org/lg/CDB-00132750-001">kvd</item>
+                                    <item AppInfo="Kalabakan" ConceptLink="http://cdb.iso.org/lg/CDB-00132749-001">kve</item>
+                                    <item AppInfo="Kabalai" ConceptLink="http://cdb.iso.org/lg/CDB-00132748-001">kvf</item>
+                                    <item AppInfo="Kuni-Boazi" ConceptLink="http://cdb.iso.org/lg/CDB-00132747-001">kvg</item>
+                                    <item AppInfo="Komodo" ConceptLink="http://cdb.iso.org/lg/CDB-00132769-001">kvh</item>
+                                    <item AppInfo="Kwang" ConceptLink="http://cdb.iso.org/lg/CDB-00132771-001">kvi</item>
+                                    <item AppInfo="Psikye" ConceptLink="http://cdb.iso.org/lg/CDB-00132754-001">kvj</item>
+                                    <item AppInfo="Korean Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132776-001">kvk</item>
+                                    <item AppInfo="Brek Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132775-001">kvl</item>
+                                    <item AppInfo="Kendem" ConceptLink="http://cdb.iso.org/lg/CDB-00132774-001">kvm</item>
+                                    <item AppInfo="Border Kuna" ConceptLink="http://cdb.iso.org/lg/CDB-00132773-001">kvn</item>
+                                    <item AppInfo="Dobel" ConceptLink="http://cdb.iso.org/lg/CDB-00132772-001">kvo</item>
+                                    <item AppInfo="Kompane" ConceptLink="http://cdb.iso.org/lg/CDB-00132762-001">kvp</item>
+                                    <item AppInfo="Geba Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132770-001">kvq</item>
+                                    <item AppInfo="Kerinci" ConceptLink="http://cdb.iso.org/lg/CDB-00132778-001">kvr</item>
+                                    <item AppInfo="Kunggara" ConceptLink="http://cdb.iso.org/lg/CDB-00132768-001">kvs</item>
+                                    <item AppInfo="Lahta Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132767-001">kvt</item>
+                                    <item AppInfo="Yinbaw Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132766-001">kvu</item>
+                                    <item AppInfo="Kola" ConceptLink="http://cdb.iso.org/lg/CDB-00132765-001">kvv</item>
+                                    <item AppInfo="Wersing" ConceptLink="http://cdb.iso.org/lg/CDB-00132764-001">kvw</item>
+                                    <item AppInfo="Parkari Koli" ConceptLink="http://cdb.iso.org/lg/CDB-00132665-001">kvx</item>
+                                    <item AppInfo="Yintale Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132793-001">kvy</item>
+                                    <item AppInfo="Tsakwambo" ConceptLink="http://cdb.iso.org/lg/CDB-00132682-001">kvz</item>
+                                    <item AppInfo="DÃ¢w" ConceptLink="http://cdb.iso.org/lg/CDB-00132597-001">kwa</item>
+                                    <item AppInfo="Kwa" ConceptLink="http://cdb.iso.org/lg/CDB-00132596-001">kwb</item>
+                                    <item AppInfo="Likwala" ConceptLink="http://cdb.iso.org/lg/CDB-00132595-001">kwc</item>
+                                    <item AppInfo="Kwaio" ConceptLink="http://cdb.iso.org/lg/CDB-00132594-001">kwd</item>
+                                    <item AppInfo="Kwerba" ConceptLink="http://cdb.iso.org/lg/CDB-00132593-001">kwe</item>
+                                    <item AppInfo="Kwara'ae" ConceptLink="http://cdb.iso.org/lg/CDB-00132592-001">kwf</item>
+                                    <item AppInfo="Sara Kaba Deme" ConceptLink="http://cdb.iso.org/lg/CDB-00132583-001">kwg</item>
+                                    <item AppInfo="Kowiai" ConceptLink="http://cdb.iso.org/lg/CDB-00132590-001">kwh</item>
+                                    <item AppInfo="Awa-Cuaiquer" ConceptLink="http://cdb.iso.org/lg/CDB-00132598-001">kwi</item>
+                                    <item AppInfo="Kwanga" ConceptLink="http://cdb.iso.org/lg/CDB-00132588-001">kwj</item>
+                                    <item AppInfo="Kwakiutl" ConceptLink="http://cdb.iso.org/lg/CDB-00132587-001">kwk</item>
+                                    <item AppInfo="Kofyar" ConceptLink="http://cdb.iso.org/lg/CDB-00132586-001">kwl</item>
+                                    <item AppInfo="Kwambi" ConceptLink="http://cdb.iso.org/lg/CDB-00132585-001">kwm</item>
+                                    <item AppInfo="Kwangali" ConceptLink="http://cdb.iso.org/lg/CDB-00132584-001">kwn</item>
+                                    <item AppInfo="Kwomtari" ConceptLink="http://cdb.iso.org/lg/CDB-00132606-001">kwo</item>
+                                    <item AppInfo="Kodia" ConceptLink="http://cdb.iso.org/lg/CDB-00132608-001">kwp</item>
+                                    <item AppInfo="Kwak" ConceptLink="http://cdb.iso.org/lg/CDB-00132591-001">kwq</item>
+                                    <item AppInfo="Kwer" ConceptLink="http://cdb.iso.org/lg/CDB-00132613-001">kwr</item>
+                                    <item AppInfo="Kwese" ConceptLink="http://cdb.iso.org/lg/CDB-00132612-001">kws</item>
+                                    <item AppInfo="Kwesten" ConceptLink="http://cdb.iso.org/lg/CDB-00132611-001">kwt</item>
+                                    <item AppInfo="Kwakum" ConceptLink="http://cdb.iso.org/lg/CDB-00132610-001">kwu</item>
+                                    <item AppInfo="Sara Kaba NÃ¡Ã " ConceptLink="http://cdb.iso.org/lg/CDB-00132609-001">kwv</item>
+                                    <item AppInfo="Kwinti" ConceptLink="http://cdb.iso.org/lg/CDB-00132599-001">kww</item>
+                                    <item AppInfo="Khirwar" ConceptLink="http://cdb.iso.org/lg/CDB-00132607-001">kwx</item>
+                                    <item AppInfo="San Salvador Kongo" ConceptLink="http://cdb.iso.org/lg/CDB-00132615-001">kwy</item>
+                                    <item AppInfo="Kwadi" ConceptLink="http://cdb.iso.org/lg/CDB-00138086-001">kwz</item>
+                                    <item AppInfo="Kairiru" ConceptLink="http://cdb.iso.org/lg/CDB-00132605-001">kxa</item>
+                                    <item AppInfo="Krobu" ConceptLink="http://cdb.iso.org/lg/CDB-00132604-001">kxb</item>
+                                    <item AppInfo="Konso" ConceptLink="http://cdb.iso.org/lg/CDB-00132603-001">kxc</item>
+                                    <item AppInfo="Brunei" ConceptLink="http://cdb.iso.org/lg/CDB-00132602-001">kxd</item>
+                                    <item AppInfo="Kakihum" ConceptLink="http://cdb.iso.org/lg/CDB-00132601-001">kxe</item>
+                                    <item AppInfo="Manumanaw Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132575-001">kxf</item>
+                                    <item AppInfo="Karo" ConceptLink="http://cdb.iso.org/lg/CDB-00132614-001">kxh</item>
+                                    <item AppInfo="Keningau Murut" ConceptLink="http://cdb.iso.org/lg/CDB-00132589-001">kxi</item>
+                                    <item AppInfo="Kulfa" ConceptLink="http://cdb.iso.org/lg/CDB-00132565-001">kxj</item>
+                                    <item AppInfo="Zayein Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00132564-001">kxk</item>
+                                    <item AppInfo="Nepali Kurux" ConceptLink="http://cdb.iso.org/lg/CDB-00132563-001">kxl</item>
+                                    <item AppInfo="Northern Khmer" ConceptLink="http://cdb.iso.org/lg/CDB-00132562-001">kxm</item>
+                                    <item AppInfo="Kanowit-Tanjong Melanau" ConceptLink="http://cdb.iso.org/lg/CDB-00132561-001">kxn</item>
+                                    <item AppInfo="KanoÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00137989-001">kxo</item>
+                                    <item AppInfo="Wadiyara Koli" ConceptLink="http://cdb.iso.org/lg/CDB-00132560-001">kxp</item>
+                                    <item AppInfo="SmÃ€rky Kanum" ConceptLink="http://cdb.iso.org/lg/CDB-00132551-001">kxq</item>
+                                    <item AppInfo="Koro" ConceptLink="http://cdb.iso.org/lg/CDB-00132558-001">kxr</item>
+                                    <item AppInfo="Kangjia" ConceptLink="http://cdb.iso.org/lg/CDB-00132566-001">kxs</item>
+                                    <item AppInfo="Koiwat" ConceptLink="http://cdb.iso.org/lg/CDB-00132556-001">kxt</item>
+                                    <item AppInfo="Kui" ConceptLink="http://cdb.iso.org/lg/CDB-00132555-001">kxu</item>
+                                    <item AppInfo="Kuvi" ConceptLink="http://cdb.iso.org/lg/CDB-00132554-001">kxv</item>
+                                    <item AppInfo="Konai" ConceptLink="http://cdb.iso.org/lg/CDB-00132553-001">kxw</item>
+                                    <item AppInfo="Likuba" ConceptLink="http://cdb.iso.org/lg/CDB-00132573-001">kxx</item>
+                                    <item AppInfo="Kayong" ConceptLink="http://cdb.iso.org/lg/CDB-00132557-001">kxy</item>
+                                    <item AppInfo="Kerewo" ConceptLink="http://cdb.iso.org/lg/CDB-00132559-001">kxz</item>
+                                    <item AppInfo="Kwaya" ConceptLink="http://cdb.iso.org/lg/CDB-00132581-001">kya</item>
+                                    <item AppInfo="Butbut Kalinga" ConceptLink="http://cdb.iso.org/lg/CDB-00132580-001">kyb</item>
+                                    <item AppInfo="Kyaka" ConceptLink="http://cdb.iso.org/lg/CDB-00132579-001">kyc</item>
+                                    <item AppInfo="Karey" ConceptLink="http://cdb.iso.org/lg/CDB-00132578-001">kyd</item>
+                                    <item AppInfo="Krache" ConceptLink="http://cdb.iso.org/lg/CDB-00132577-001">kye</item>
+                                    <item AppInfo="Kouya" ConceptLink="http://cdb.iso.org/lg/CDB-00132576-001">kyf</item>
+                                    <item AppInfo="Keyagana" ConceptLink="http://cdb.iso.org/lg/CDB-00132567-001">kyg</item>
+                                    <item AppInfo="Karok" ConceptLink="http://cdb.iso.org/lg/CDB-00132574-001">kyh</item>
+                                    <item AppInfo="Kiput" ConceptLink="http://cdb.iso.org/lg/CDB-00132582-001">kyi</item>
+                                    <item AppInfo="Karao" ConceptLink="http://cdb.iso.org/lg/CDB-00132572-001">kyj</item>
+                                    <item AppInfo="Kamayo" ConceptLink="http://cdb.iso.org/lg/CDB-00132571-001">kyk</item>
+                                    <item AppInfo="Kalapuya" ConceptLink="http://cdb.iso.org/lg/CDB-00132570-001">kyl</item>
+                                    <item AppInfo="Kpatili" ConceptLink="http://cdb.iso.org/lg/CDB-00132569-001">kym</item>
+                                    <item AppInfo="Karolanos" ConceptLink="http://cdb.iso.org/lg/CDB-00132617-001">kyn</item>
+                                    <item AppInfo="Kelon" ConceptLink="http://cdb.iso.org/lg/CDB-00132552-001">kyo</item>
+                                    <item AppInfo="Kang" ConceptLink="http://cdb.iso.org/lg/CDB-00132600-001">kyp</item>
+                                    <item AppInfo="Kenga" ConceptLink="http://cdb.iso.org/lg/CDB-00132662-001">kyq</item>
+                                    <item AppInfo="KuruÃ¡ya" ConceptLink="http://cdb.iso.org/lg/CDB-00132661-001">kyr</item>
+                                    <item AppInfo="Baram Kayan" ConceptLink="http://cdb.iso.org/lg/CDB-00132660-001">kys</item>
+                                    <item AppInfo="Kayagar" ConceptLink="http://cdb.iso.org/lg/CDB-00132659-001">kyt</item>
+                                    <item AppInfo="Western Kayah" ConceptLink="http://cdb.iso.org/lg/CDB-00132658-001">kyu</item>
+                                    <item AppInfo="Kayort" ConceptLink="http://cdb.iso.org/lg/CDB-00132657-001">kyv</item>
+                                    <item AppInfo="Kudmali" ConceptLink="http://cdb.iso.org/lg/CDB-00132648-001">kyw</item>
+                                    <item AppInfo="Rapoisi" ConceptLink="http://cdb.iso.org/lg/CDB-00132655-001">kyx</item>
+                                    <item AppInfo="Kambaira" ConceptLink="http://cdb.iso.org/lg/CDB-00132663-001">kyy</item>
+                                    <item AppInfo="KayabÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00132653-001">kyz</item>
+                                    <item AppInfo="Western Karaboro" ConceptLink="http://cdb.iso.org/lg/CDB-00132652-001">kza</item>
+                                    <item AppInfo="Kaibobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132651-001">kzb</item>
+                                    <item AppInfo="Bondoukou Kulango" ConceptLink="http://cdb.iso.org/lg/CDB-00132650-001">kzc</item>
+                                    <item AppInfo="Kadai" ConceptLink="http://cdb.iso.org/lg/CDB-00132649-001">kzd</item>
+                                    <item AppInfo="Kosena" ConceptLink="http://cdb.iso.org/lg/CDB-00132671-001">kze</item>
+                                    <item AppInfo="Da'a Kaili" ConceptLink="http://cdb.iso.org/lg/CDB-00132673-001">kzf</item>
+                                    <item AppInfo="Kikai" ConceptLink="http://cdb.iso.org/lg/CDB-00132656-001">kzg</item>
+                                    <item AppInfo="Kenuzi-Dongola" ConceptLink="http://cdb.iso.org/lg/CDB-00132678-001">kzh</item>
+                                    <item AppInfo="Kelabit" ConceptLink="http://cdb.iso.org/lg/CDB-00132677-001">kzi</item>
+                                    <item AppInfo="Coastal Kadazan" ConceptLink="http://cdb.iso.org/lg/CDB-00132676-001">kzj</item>
+                                    <item AppInfo="Kazukuru" ConceptLink="http://cdb.iso.org/lg/CDB-00138305-001">kzk</item>
+                                    <item AppInfo="Kayeli" ConceptLink="http://cdb.iso.org/lg/CDB-00132675-001">kzl</item>
+                                    <item AppInfo="Kais" ConceptLink="http://cdb.iso.org/lg/CDB-00132674-001">kzm</item>
+                                    <item AppInfo="Kokola" ConceptLink="http://cdb.iso.org/lg/CDB-00132664-001">kzn</item>
+                                    <item AppInfo="Kaningi" ConceptLink="http://cdb.iso.org/lg/CDB-00132672-001">kzo</item>
+                                    <item AppInfo="Kaidipang" ConceptLink="http://cdb.iso.org/lg/CDB-00132680-001">kzp</item>
+                                    <item AppInfo="Kaike" ConceptLink="http://cdb.iso.org/lg/CDB-00132670-001">kzq</item>
+                                    <item AppInfo="Karang" ConceptLink="http://cdb.iso.org/lg/CDB-00132669-001">kzr</item>
+                                    <item AppInfo="Sugut Dusun" ConceptLink="http://cdb.iso.org/lg/CDB-00132668-001">kzs</item>
+                                    <item AppInfo="Tambunan Dusun" ConceptLink="http://cdb.iso.org/lg/CDB-00132667-001">kzt</item>
+                                    <item AppInfo="Kayupulau" ConceptLink="http://cdb.iso.org/lg/CDB-00132666-001">kzu</item>
+                                    <item AppInfo="Komyandaret" ConceptLink="http://cdb.iso.org/lg/CDB-00132640-001">kzv</item>
+                                    <item AppInfo="KarirÃ­-XocÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00138199-001">kzw</item>
+                                    <item AppInfo="Kamarian" ConceptLink="http://cdb.iso.org/lg/CDB-00132679-001">kzx</item>
+                                    <item AppInfo="Kango" ConceptLink="http://cdb.iso.org/lg/CDB-00132654-001">kzy</item>
+                                    <item AppInfo="Kalabra" ConceptLink="http://cdb.iso.org/lg/CDB-00132630-001">kzz</item>
+                                    <item AppInfo="Lapuyan Subanun" ConceptLink="http://cdb.iso.org/lg/CDB-00132629-001">laa</item>
+                                    <item AppInfo="Linear A" ConceptLink="http://cdb.iso.org/lg/CDB-00138365-001">lab</item>
+                                    <item AppInfo="Lacandon" ConceptLink="http://cdb.iso.org/lg/CDB-00132628-001">lac</item>
+                                    <item AppInfo="Ladino" ConceptLink="http://cdb.iso.org/lg/CDB-00132627-001">lad</item>
+                                    <item AppInfo="Pattani" ConceptLink="http://cdb.iso.org/lg/CDB-00132626-001">lae</item>
+                                    <item AppInfo="Lafofa" ConceptLink="http://cdb.iso.org/lg/CDB-00132625-001">laf</item>
+                                    <item AppInfo="Langi" ConceptLink="http://cdb.iso.org/lg/CDB-00132616-001">lag</item>
+                                    <item AppInfo="Lahnda" ConceptLink="http://cdb.iso.org/lg/CDB-00130982-001">lah</item>
+                                    <item AppInfo="Lambya" ConceptLink="http://cdb.iso.org/lg/CDB-00132623-001">lai</item>
+                                    <item AppInfo="Lango" ConceptLink="http://cdb.iso.org/lg/CDB-00132631-001">laj</item>
+                                    <item AppInfo="Laka" ConceptLink="http://cdb.iso.org/lg/CDB-00132621-001">lak</item>
+                                    <item AppInfo="Lalia" ConceptLink="http://cdb.iso.org/lg/CDB-00132620-001">lal</item>
+                                    <item AppInfo="Lamba" ConceptLink="http://cdb.iso.org/lg/CDB-00132619-001">lam</item>
+                                    <item AppInfo="Laru" ConceptLink="http://cdb.iso.org/lg/CDB-00132618-001">lan</item>
+                                    <item AppInfo="Laotian; Lao" ConceptLink="http://cdb.iso.org/lg/CDB-00138561-001">lao</item>
+                                    <item AppInfo="Laka" ConceptLink="http://cdb.iso.org/lg/CDB-00132638-001">lap</item>
+                                    <item AppInfo="Qabiao" ConceptLink="http://cdb.iso.org/lg/CDB-00132622-001">laq</item>
+                                    <item AppInfo="Larteh" ConceptLink="http://cdb.iso.org/lg/CDB-00132624-001">lar</item>
+                                    <item AppInfo="Lama" ConceptLink="http://cdb.iso.org/lg/CDB-00132646-001">las</item>
+                                    <item AppInfo="Latin" ConceptLink="http://cdb.iso.org/lg/CDB-00138556-001">lat</item>
+                                    <item AppInfo="Laba" ConceptLink="http://cdb.iso.org/lg/CDB-00132645-001">lau</item>
+                                    <item AppInfo="Latvian" ConceptLink="http://cdb.iso.org/lg/CDB-00138564-001">lav</item>
+                                    <item AppInfo="Lauje" ConceptLink="http://cdb.iso.org/lg/CDB-00132644-001">law</item>
+                                    <item AppInfo="Tiwa" ConceptLink="http://cdb.iso.org/lg/CDB-00132643-001">lax</item>
+                                    <item AppInfo="Lama" ConceptLink="http://cdb.iso.org/lg/CDB-00132642-001">lay</item>
+                                    <item AppInfo="Aribwatsa" ConceptLink="http://cdb.iso.org/lg/CDB-00138292-001">laz</item>
+                                    <item AppInfo="Lui" ConceptLink="http://cdb.iso.org/lg/CDB-00132641-001">lba</item>
+                                    <item AppInfo="Label" ConceptLink="http://cdb.iso.org/lg/CDB-00132632-001">lbb</item>
+                                    <item AppInfo="Lakkia" ConceptLink="http://cdb.iso.org/lg/CDB-00132639-001">lbc</item>
+                                    <item AppInfo="Lak" ConceptLink="http://cdb.iso.org/lg/CDB-00132647-001">lbe</item>
+                                    <item AppInfo="Tinani" ConceptLink="http://cdb.iso.org/lg/CDB-00132637-001">lbf</item>
+                                    <item AppInfo="Laopang" ConceptLink="http://cdb.iso.org/lg/CDB-00132636-001">lbg</item>
+                                    <item AppInfo="La'bi" ConceptLink="http://cdb.iso.org/lg/CDB-00132635-001">lbi</item>
+                                    <item AppInfo="Ladakhi" ConceptLink="http://cdb.iso.org/lg/CDB-00132634-001">lbj</item>
+                                    <item AppInfo="Lodhi" ConceptLink="http://cdb.iso.org/lg/CDB-00132829-001">lbm</item>
+                                    <item AppInfo="Lamet" ConceptLink="http://cdb.iso.org/lg/CDB-00132568-001">lbn</item>
+                                    <item AppInfo="Laven" ConceptLink="http://cdb.iso.org/lg/CDB-00132763-001">lbo</item>
+                                    <item AppInfo="Wampar" ConceptLink="http://cdb.iso.org/lg/CDB-00132988-001">lbq</item>
+                                    <item AppInfo="Northern Lorung" ConceptLink="http://cdb.iso.org/lg/CDB-00132987-001">lbr</item>
+                                    <item AppInfo="Libyan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132986-001">lbs</item>
+                                    <item AppInfo="Lachi" ConceptLink="http://cdb.iso.org/lg/CDB-00132985-001">lbt</item>
+                                    <item AppInfo="Labu" ConceptLink="http://cdb.iso.org/lg/CDB-00132984-001">lbu</item>
+                                    <item AppInfo="Lavatbura-Lamusong" ConceptLink="http://cdb.iso.org/lg/CDB-00132983-001">lbv</item>
+                                    <item AppInfo="Tolaki" ConceptLink="http://cdb.iso.org/lg/CDB-00132974-001">lbw</item>
+                                    <item AppInfo="Lawangan" ConceptLink="http://cdb.iso.org/lg/CDB-00132981-001">lbx</item>
+                                    <item AppInfo="Lamu-Lamu" ConceptLink="http://cdb.iso.org/lg/CDB-00132989-001">lby</item>
+                                    <item AppInfo="Lardil" ConceptLink="http://cdb.iso.org/lg/CDB-00132979-001">lbz</item>
+                                    <item AppInfo="Legenyem" ConceptLink="http://cdb.iso.org/lg/CDB-00132978-001">lcc</item>
+                                    <item AppInfo="Lola" ConceptLink="http://cdb.iso.org/lg/CDB-00132977-001">lcd</item>
+                                    <item AppInfo="Loncong" ConceptLink="http://cdb.iso.org/lg/CDB-00132976-001">lce</item>
+                                    <item AppInfo="Lubu" ConceptLink="http://cdb.iso.org/lg/CDB-00131696-001">lcf</item>
+                                    <item AppInfo="Luchazi" ConceptLink="http://cdb.iso.org/lg/CDB-00131695-001">lch</item>
+                                    <item AppInfo="Lisela" ConceptLink="http://cdb.iso.org/lg/CDB-00131694-001">lcl</item>
+                                    <item AppInfo="Tungag" ConceptLink="http://cdb.iso.org/lg/CDB-00131684-001">lcm</item>
+                                    <item AppInfo="Western Lawa" ConceptLink="http://cdb.iso.org/lg/CDB-00131692-001">lcp</item>
+                                    <item AppInfo="Luhu" ConceptLink="http://cdb.iso.org/lg/CDB-00131700-001">lcq</item>
+                                    <item AppInfo="Lisabata-Nuniali" ConceptLink="http://cdb.iso.org/lg/CDB-00131690-001">lcs</item>
+                                    <item AppInfo="Idun" ConceptLink="http://cdb.iso.org/lg/CDB-00131689-001">ldb</item>
+                                    <item AppInfo="Luri" ConceptLink="http://cdb.iso.org/lg/CDB-00131688-001">ldd</item>
+                                    <item AppInfo="Lenyima" ConceptLink="http://cdb.iso.org/lg/CDB-00131687-001">ldg</item>
+                                    <item AppInfo="Lamja-Dengsa-Tola" ConceptLink="http://cdb.iso.org/lg/CDB-00131686-001">ldh</item>
+                                    <item AppInfo="Laari" ConceptLink="http://cdb.iso.org/lg/CDB-00131660-001">ldi</item>
+                                    <item AppInfo="Lemoro" ConceptLink="http://cdb.iso.org/lg/CDB-00131699-001">ldj</item>
+                                    <item AppInfo="Leelau" ConceptLink="http://cdb.iso.org/lg/CDB-00131674-001">ldk</item>
+                                    <item AppInfo="Kaan" ConceptLink="http://cdb.iso.org/lg/CDB-00131650-001">ldl</item>
+                                    <item AppInfo="Landoma" ConceptLink="http://cdb.iso.org/lg/CDB-00131649-001">ldm</item>
+                                    <item AppInfo="LÃ¡adan" ConceptLink="http://cdb.iso.org/lg/CDB-00138346-001">ldn</item>
+                                    <item AppInfo="Loo" ConceptLink="http://cdb.iso.org/lg/CDB-00131648-001">ldo</item>
+                                    <item AppInfo="Tso" ConceptLink="http://cdb.iso.org/lg/CDB-00131647-001">ldp</item>
+                                    <item AppInfo="Lufu" ConceptLink="http://cdb.iso.org/lg/CDB-00131646-001">ldq</item>
+                                    <item AppInfo="Lega-Shabunda" ConceptLink="http://cdb.iso.org/lg/CDB-00131645-001">lea</item>
+                                    <item AppInfo="Lala-Bisa" ConceptLink="http://cdb.iso.org/lg/CDB-00131636-001">leb</item>
+                                    <item AppInfo="Leco" ConceptLink="http://cdb.iso.org/lg/CDB-00131643-001">lec</item>
+                                    <item AppInfo="Lendu" ConceptLink="http://cdb.iso.org/lg/CDB-00131651-001">led</item>
+                                    <item AppInfo="LyÃ©lÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131641-001">lee</item>
+                                    <item AppInfo="Lelemi" ConceptLink="http://cdb.iso.org/lg/CDB-00131640-001">lef</item>
+                                    <item AppInfo="Lengua" ConceptLink="http://cdb.iso.org/lg/CDB-00131639-001">leg</item>
+                                    <item AppInfo="Lenje" ConceptLink="http://cdb.iso.org/lg/CDB-00131638-001">leh</item>
+                                    <item AppInfo="Lemio" ConceptLink="http://cdb.iso.org/lg/CDB-00131658-001">lei</item>
+                                    <item AppInfo="Lengola" ConceptLink="http://cdb.iso.org/lg/CDB-00131642-001">lej</item>
+                                    <item AppInfo="Leipon" ConceptLink="http://cdb.iso.org/lg/CDB-00131644-001">lek</item>
+                                    <item AppInfo="Lele" ConceptLink="http://cdb.iso.org/lg/CDB-00131666-001">lel</item>
+                                    <item AppInfo="Nomaande" ConceptLink="http://cdb.iso.org/lg/CDB-00131665-001">lem</item>
+                                    <item AppInfo="Lenca" ConceptLink="http://cdb.iso.org/lg/CDB-00131664-001">len</item>
+                                    <item AppInfo="Leti" ConceptLink="http://cdb.iso.org/lg/CDB-00131663-001">leo</item>
+                                    <item AppInfo="Lepcha" ConceptLink="http://cdb.iso.org/lg/CDB-00131662-001">lep</item>
+                                    <item AppInfo="Lembena" ConceptLink="http://cdb.iso.org/lg/CDB-00131661-001">leq</item>
+                                    <item AppInfo="Lenkau" ConceptLink="http://cdb.iso.org/lg/CDB-00131652-001">ler</item>
+                                    <item AppInfo="Lese" ConceptLink="http://cdb.iso.org/lg/CDB-00131659-001">les</item>
+                                    <item AppInfo="Lesing-Gelimi" ConceptLink="http://cdb.iso.org/lg/CDB-00131667-001">let</item>
+                                    <item AppInfo="Kara" ConceptLink="http://cdb.iso.org/lg/CDB-00131657-001">leu</item>
+                                    <item AppInfo="Lamma" ConceptLink="http://cdb.iso.org/lg/CDB-00131656-001">lev</item>
+                                    <item AppInfo="Ledo Kaili" ConceptLink="http://cdb.iso.org/lg/CDB-00131655-001">lew</item>
+                                    <item AppInfo="Luang" ConceptLink="http://cdb.iso.org/lg/CDB-00131654-001">lex</item>
+                                    <item AppInfo="Lemolang" ConceptLink="http://cdb.iso.org/lg/CDB-00131653-001">ley</item>
+                                    <item AppInfo="Lezghian" ConceptLink="http://cdb.iso.org/lg/CDB-00131715-001">lez</item>
+                                    <item AppInfo="Lefa" ConceptLink="http://cdb.iso.org/lg/CDB-00131765-001">lfa</item>
+                                    <item AppInfo="Lingua Franca Nova" ConceptLink="http://cdb.iso.org/lg/CDB-00138356-001">lfn</item>
+                                    <item AppInfo="Lungga" ConceptLink="http://cdb.iso.org/lg/CDB-00131685-001">lga</item>
+                                    <item AppInfo="Laghu" ConceptLink="http://cdb.iso.org/lg/CDB-00131747-001">lgb</item>
+                                    <item AppInfo="Lugbara" ConceptLink="http://cdb.iso.org/lg/CDB-00131746-001">lgg</item>
+                                    <item AppInfo="Laghuu" ConceptLink="http://cdb.iso.org/lg/CDB-00131745-001">lgh</item>
+                                    <item AppInfo="Lengilu" ConceptLink="http://cdb.iso.org/lg/CDB-00131744-001">lgi</item>
+                                    <item AppInfo="Lingarak" ConceptLink="http://cdb.iso.org/lg/CDB-00131743-001">lgk</item>
+                                    <item AppInfo="Wala" ConceptLink="http://cdb.iso.org/lg/CDB-00131734-001">lgl</item>
+                                    <item AppInfo="Lega-Mwenga" ConceptLink="http://cdb.iso.org/lg/CDB-00131741-001">lgm</item>
+                                    <item AppInfo="Opuuo" ConceptLink="http://cdb.iso.org/lg/CDB-00131749-001">lgn</item>
+                                    <item AppInfo="Logba" ConceptLink="http://cdb.iso.org/lg/CDB-00131739-001">lgq</item>
+                                    <item AppInfo="Lengo" ConceptLink="http://cdb.iso.org/lg/CDB-00131738-001">lgr</item>
+                                    <item AppInfo="Pahi" ConceptLink="http://cdb.iso.org/lg/CDB-00131737-001">lgt</item>
+                                    <item AppInfo="Longgu" ConceptLink="http://cdb.iso.org/lg/CDB-00131736-001">lgu</item>
+                                    <item AppInfo="Ligenza" ConceptLink="http://cdb.iso.org/lg/CDB-00131735-001">lgz</item>
+                                    <item AppInfo="Laha" ConceptLink="http://cdb.iso.org/lg/CDB-00131757-001">lha</item>
+                                    <item AppInfo="Laha" ConceptLink="http://cdb.iso.org/lg/CDB-00131759-001">lhh</item>
+                                    <item AppInfo="Lahu Shi" ConceptLink="http://cdb.iso.org/lg/CDB-00131742-001">lhi</item>
+                                    <item AppInfo="Lahul Lohar" ConceptLink="http://cdb.iso.org/lg/CDB-00131764-001">lhl</item>
+                                    <item AppInfo="Lhomi" ConceptLink="http://cdb.iso.org/lg/CDB-00131763-001">lhm</item>
+                                    <item AppInfo="Lahanan" ConceptLink="http://cdb.iso.org/lg/CDB-00131762-001">lhn</item>
+                                    <item AppInfo="Lhokpu" ConceptLink="http://cdb.iso.org/lg/CDB-00131761-001">lhp</item>
+                                    <item AppInfo="MlahsÃ¶" ConceptLink="http://cdb.iso.org/lg/CDB-00138287-001">lhs</item>
+                                    <item AppInfo="Lo-Toga" ConceptLink="http://cdb.iso.org/lg/CDB-00131760-001">lht</item>
+                                    <item AppInfo="Lahu" ConceptLink="http://cdb.iso.org/lg/CDB-00131750-001">lhu</item>
+                                    <item AppInfo="West-Central Limba" ConceptLink="http://cdb.iso.org/lg/CDB-00131758-001">lia</item>
+                                    <item AppInfo="Likum" ConceptLink="http://cdb.iso.org/lg/CDB-00131766-001">lib</item>
+                                    <item AppInfo="Hlai" ConceptLink="http://cdb.iso.org/lg/CDB-00131756-001">lic</item>
+                                    <item AppInfo="Nyindrou" ConceptLink="http://cdb.iso.org/lg/CDB-00131755-001">lid</item>
+                                    <item AppInfo="Likila" ConceptLink="http://cdb.iso.org/lg/CDB-00131754-001">lie</item>
+                                    <item AppInfo="Limbu" ConceptLink="http://cdb.iso.org/lg/CDB-00131753-001">lif</item>
+                                    <item AppInfo="Ligbi" ConceptLink="http://cdb.iso.org/lg/CDB-00131752-001">lig</item>
+                                    <item AppInfo="Lihir" ConceptLink="http://cdb.iso.org/lg/CDB-00131751-001">lih</item>
+                                    <item AppInfo="Lingkhim" ConceptLink="http://cdb.iso.org/lg/CDB-00131732-001">lii</item>
+                                    <item AppInfo="Ligurian" ConceptLink="http://cdb.iso.org/lg/CDB-00131707-001">lij</item>
+                                    <item AppInfo="Lika" ConceptLink="http://cdb.iso.org/lg/CDB-00131740-001">lik</item>
+                                    <item AppInfo="Lillooet" ConceptLink="http://cdb.iso.org/lg/CDB-00131714-001">lil</item>
+                                    <item AppInfo="Limburgish; Limburger; Limburgian" ConceptLink="http://cdb.iso.org/lg/CDB-00138559-001">lim</item>
+                                    <item AppInfo="Lingala" ConceptLink="http://cdb.iso.org/lg/CDB-00138560-001">lin</item>
+                                    <item AppInfo="Liki" ConceptLink="http://cdb.iso.org/lg/CDB-00131713-001">lio</item>
+                                    <item AppInfo="Sekpele" ConceptLink="http://cdb.iso.org/lg/CDB-00131712-001">lip</item>
+                                    <item AppInfo="Libido" ConceptLink="http://cdb.iso.org/lg/CDB-00131711-001">liq</item>
+                                    <item AppInfo="Liberian English" ConceptLink="http://cdb.iso.org/lg/CDB-00131710-001">lir</item>
+                                    <item AppInfo="Lisu" ConceptLink="http://cdb.iso.org/lg/CDB-00131701-001">lis</item>
+                                    <item AppInfo="Lithuanian" ConceptLink="http://cdb.iso.org/lg/CDB-00138562-001">lit</item>
+                                    <item AppInfo="Logorik" ConceptLink="http://cdb.iso.org/lg/CDB-00131708-001">liu</item>
+                                    <item AppInfo="Liv" ConceptLink="http://cdb.iso.org/lg/CDB-00131716-001">liv</item>
+                                    <item AppInfo="Col" ConceptLink="http://cdb.iso.org/lg/CDB-00131706-001">liw</item>
+                                    <item AppInfo="Liabuku" ConceptLink="http://cdb.iso.org/lg/CDB-00131705-001">lix</item>
+                                    <item AppInfo="Banda-Bambari" ConceptLink="http://cdb.iso.org/lg/CDB-00131704-001">liy</item>
+                                    <item AppInfo="Libinza" ConceptLink="http://cdb.iso.org/lg/CDB-00131703-001">liz</item>
+                                    <item AppInfo="Rampi" ConceptLink="http://cdb.iso.org/lg/CDB-00131702-001">lje</item>
+                                    <item AppInfo="Laiyolo" ConceptLink="http://cdb.iso.org/lg/CDB-00131724-001">lji</item>
+                                    <item AppInfo="Li'o" ConceptLink="http://cdb.iso.org/lg/CDB-00131726-001">ljl</item>
+                                    <item AppInfo="Lampung Api" ConceptLink="http://cdb.iso.org/lg/CDB-00131709-001">ljp</item>
+                                    <item AppInfo="Lakalei" ConceptLink="http://cdb.iso.org/lg/CDB-00131731-001">lka</item>
+                                    <item AppInfo="Kabras" ConceptLink="http://cdb.iso.org/lg/CDB-00131730-001">lkb</item>
+                                    <item AppInfo="Kucong" ConceptLink="http://cdb.iso.org/lg/CDB-00131729-001">lkc</item>
+                                    <item AppInfo="LakondÄ" ConceptLink="http://cdb.iso.org/lg/CDB-00131728-001">lkd</item>
+                                    <item AppInfo="Kenyi" ConceptLink="http://cdb.iso.org/lg/CDB-00131727-001">lke</item>
+                                    <item AppInfo="Lakha" ConceptLink="http://cdb.iso.org/lg/CDB-00131717-001">lkh</item>
+                                    <item AppInfo="Laki" ConceptLink="http://cdb.iso.org/lg/CDB-00131725-001">lki</item>
+                                    <item AppInfo="Remun" ConceptLink="http://cdb.iso.org/lg/CDB-00131733-001">lkj</item>
+                                    <item AppInfo="Laeko-Libuat" ConceptLink="http://cdb.iso.org/lg/CDB-00131723-001">lkl</item>
+                                    <item AppInfo="Lakon" ConceptLink="http://cdb.iso.org/lg/CDB-00131722-001">lkn</item>
+                                    <item AppInfo="Khayo" ConceptLink="http://cdb.iso.org/lg/CDB-00131721-001">lko</item>
+                                    <item AppInfo="PÃ€ri" ConceptLink="http://cdb.iso.org/lg/CDB-00131720-001">lkr</item>
+                                    <item AppInfo="Kisa" ConceptLink="http://cdb.iso.org/lg/CDB-00131719-001">lks</item>
+                                    <item AppInfo="Lakota" ConceptLink="http://cdb.iso.org/lg/CDB-00131620-001">lkt</item>
+                                    <item AppInfo="Lokoya" ConceptLink="http://cdb.iso.org/lg/CDB-00131748-001">lky</item>
+                                    <item AppInfo="Lala-Roba" ConceptLink="http://cdb.iso.org/lg/CDB-00131637-001">lla</item>
+                                    <item AppInfo="Lolo" ConceptLink="http://cdb.iso.org/lg/CDB-00131552-001">llb</item>
+                                    <item AppInfo="Lele" ConceptLink="http://cdb.iso.org/lg/CDB-00131551-001">llc</item>
+                                    <item AppInfo="Ladin" ConceptLink="http://cdb.iso.org/lg/CDB-00131550-001">lld</item>
+                                    <item AppInfo="Lele" ConceptLink="http://cdb.iso.org/lg/CDB-00131549-001">lle</item>
+                                    <item AppInfo="Hermit" ConceptLink="http://cdb.iso.org/lg/CDB-00138083-001">llf</item>
+                                    <item AppInfo="Lole" ConceptLink="http://cdb.iso.org/lg/CDB-00131548-001">llg</item>
+                                    <item AppInfo="Lamu" ConceptLink="http://cdb.iso.org/lg/CDB-00131547-001">llh</item>
+                                    <item AppInfo="Teke-Laali" ConceptLink="http://cdb.iso.org/lg/CDB-00131538-001">lli</item>
+                                    <item AppInfo="Lelak" ConceptLink="http://cdb.iso.org/lg/CDB-00131545-001">llk</item>
+                                    <item AppInfo="Lilau" ConceptLink="http://cdb.iso.org/lg/CDB-00131553-001">lll</item>
+                                    <item AppInfo="Lasalimu" ConceptLink="http://cdb.iso.org/lg/CDB-00131543-001">llm</item>
+                                    <item AppInfo="Lele" ConceptLink="http://cdb.iso.org/lg/CDB-00131542-001">lln</item>
+                                    <item AppInfo="Khlor" ConceptLink="http://cdb.iso.org/lg/CDB-00131541-001">llo</item>
+                                    <item AppInfo="North Efate" ConceptLink="http://cdb.iso.org/lg/CDB-00131540-001">llp</item>
+                                    <item AppInfo="Lolak" ConceptLink="http://cdb.iso.org/lg/CDB-00131539-001">llq</item>
+                                    <item AppInfo="Lithuanian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131561-001">lls</item>
+                                    <item AppInfo="Lau" ConceptLink="http://cdb.iso.org/lg/CDB-00131563-001">llu</item>
+                                    <item AppInfo="Lauan" ConceptLink="http://cdb.iso.org/lg/CDB-00131546-001">llx</item>
+                                    <item AppInfo="East Limba" ConceptLink="http://cdb.iso.org/lg/CDB-00131568-001">lma</item>
+                                    <item AppInfo="Merei" ConceptLink="http://cdb.iso.org/lg/CDB-00131567-001">lmb</item>
+                                    <item AppInfo="Limilngan" ConceptLink="http://cdb.iso.org/lg/CDB-00131566-001">lmc</item>
+                                    <item AppInfo="Lumun" ConceptLink="http://cdb.iso.org/lg/CDB-00131565-001">lmd</item>
+                                    <item AppInfo="PÃ©vÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00131564-001">lme</item>
+                                    <item AppInfo="South Lembata" ConceptLink="http://cdb.iso.org/lg/CDB-00131554-001">lmf</item>
+                                    <item AppInfo="Lamogai" ConceptLink="http://cdb.iso.org/lg/CDB-00131562-001">lmg</item>
+                                    <item AppInfo="Lambichhong" ConceptLink="http://cdb.iso.org/lg/CDB-00131570-001">lmh</item>
+                                    <item AppInfo="Lombi" ConceptLink="http://cdb.iso.org/lg/CDB-00131560-001">lmi</item>
+                                    <item AppInfo="West Lembata" ConceptLink="http://cdb.iso.org/lg/CDB-00131559-001">lmj</item>
+                                    <item AppInfo="Lamkang" ConceptLink="http://cdb.iso.org/lg/CDB-00131558-001">lmk</item>
+                                    <item AppInfo="Hano" ConceptLink="http://cdb.iso.org/lg/CDB-00131557-001">lml</item>
+                                    <item AppInfo="Lamam" ConceptLink="http://cdb.iso.org/lg/CDB-00131556-001">lmm</item>
+                                    <item AppInfo="Lambadi" ConceptLink="http://cdb.iso.org/lg/CDB-00131530-001">lmn</item>
+                                    <item AppInfo="Lombard" ConceptLink="http://cdb.iso.org/lg/CDB-00131569-001">lmo</item>
+                                    <item AppInfo="Limbum" ConceptLink="http://cdb.iso.org/lg/CDB-00131544-001">lmp</item>
+                                    <item AppInfo="Lamatuka" ConceptLink="http://cdb.iso.org/lg/CDB-00131520-001">lmq</item>
+                                    <item AppInfo="Lamalera" ConceptLink="http://cdb.iso.org/lg/CDB-00131519-001">lmr</item>
+                                    <item AppInfo="Lamenu" ConceptLink="http://cdb.iso.org/lg/CDB-00131518-001">lmu</item>
+                                    <item AppInfo="Lomaiviti" ConceptLink="http://cdb.iso.org/lg/CDB-00131517-001">lmv</item>
+                                    <item AppInfo="Lake Miwok" ConceptLink="http://cdb.iso.org/lg/CDB-00131516-001">lmw</item>
+                                    <item AppInfo="Laimbue" ConceptLink="http://cdb.iso.org/lg/CDB-00131515-001">lmx</item>
+                                    <item AppInfo="Lamboya" ConceptLink="http://cdb.iso.org/lg/CDB-00131506-001">lmy</item>
+                                    <item AppInfo="Lumbee" ConceptLink="http://cdb.iso.org/lg/CDB-00138049-001">lmz</item>
+                                    <item AppInfo="Langbashe" ConceptLink="http://cdb.iso.org/lg/CDB-00132975-001">lna</item>
+                                    <item AppInfo="Mbalanhu" ConceptLink="http://cdb.iso.org/lg/CDB-00132997-001">lnb</item>
+                                    <item AppInfo="Lundayeh" ConceptLink="http://cdb.iso.org/lg/CDB-00132999-001">lnd</item>
+                                    <item AppInfo="Langobardic" ConceptLink="http://cdb.iso.org/lg/CDB-00138370-001">lng</item>
+                                    <item AppInfo="Lanoh" ConceptLink="http://cdb.iso.org/lg/CDB-00132982-001">lnh</item>
+                                    <item AppInfo="Daantanai'" ConceptLink="http://cdb.iso.org/lg/CDB-00133004-001">lni</item>
+                                    <item AppInfo="Leningitij" ConceptLink="http://cdb.iso.org/lg/CDB-00137984-001">lnj</item>
+                                    <item AppInfo="South Central Banda" ConceptLink="http://cdb.iso.org/lg/CDB-00133003-001">lnl</item>
+                                    <item AppInfo="Langam" ConceptLink="http://cdb.iso.org/lg/CDB-00133002-001">lnm</item>
+                                    <item AppInfo="Lorediakarkar" ConceptLink="http://cdb.iso.org/lg/CDB-00133001-001">lnn</item>
+                                    <item AppInfo="Lango" ConceptLink="http://cdb.iso.org/lg/CDB-00133000-001">lno</item>
+                                    <item AppInfo="Lamnso'" ConceptLink="http://cdb.iso.org/lg/CDB-00132990-001">lns</item>
+                                    <item AppInfo="Longuda" ConceptLink="http://cdb.iso.org/lg/CDB-00132998-001">lnu</item>
+                                    <item AppInfo="Lonzo" ConceptLink="http://cdb.iso.org/lg/CDB-00133006-001">lnz</item>
+                                    <item AppInfo="Loloda" ConceptLink="http://cdb.iso.org/lg/CDB-00132996-001">loa</item>
+                                    <item AppInfo="Lobi" ConceptLink="http://cdb.iso.org/lg/CDB-00132995-001">lob</item>
+                                    <item AppInfo="Inonhan" ConceptLink="http://cdb.iso.org/lg/CDB-00132994-001">loc</item>
+                                    <item AppInfo="Saluan" ConceptLink="http://cdb.iso.org/lg/CDB-00132993-001">loe</item>
+                                    <item AppInfo="Logol" ConceptLink="http://cdb.iso.org/lg/CDB-00132992-001">lof</item>
+                                    <item AppInfo="Logo" ConceptLink="http://cdb.iso.org/lg/CDB-00132966-001">log</item>
+                                    <item AppInfo="Narim" ConceptLink="http://cdb.iso.org/lg/CDB-00133005-001">loh</item>
+                                    <item AppInfo="Loma" ConceptLink="http://cdb.iso.org/lg/CDB-00132980-001">loi</item>
+                                    <item AppInfo="Lou" ConceptLink="http://cdb.iso.org/lg/CDB-00132956-001">loj</item>
+                                    <item AppInfo="Loko" ConceptLink="http://cdb.iso.org/lg/CDB-00132955-001">lok</item>
+                                    <item AppInfo="Mongo" ConceptLink="http://cdb.iso.org/lg/CDB-00132954-001">lol</item>
+                                    <item AppInfo="Loma" ConceptLink="http://cdb.iso.org/lg/CDB-00132953-001">lom</item>
+                                    <item AppInfo="Malawi Lomwe" ConceptLink="http://cdb.iso.org/lg/CDB-00132952-001">lon</item>
+                                    <item AppInfo="Lombo" ConceptLink="http://cdb.iso.org/lg/CDB-00132951-001">loo</item>
+                                    <item AppInfo="Lopa" ConceptLink="http://cdb.iso.org/lg/CDB-00132942-001">lop</item>
+                                    <item AppInfo="Lobala" ConceptLink="http://cdb.iso.org/lg/CDB-00132949-001">loq</item>
+                                    <item AppInfo="TÃ©Ã©n" ConceptLink="http://cdb.iso.org/lg/CDB-00132957-001">lor</item>
+                                    <item AppInfo="Loniu" ConceptLink="http://cdb.iso.org/lg/CDB-00132947-001">los</item>
+                                    <item AppInfo="Otuho" ConceptLink="http://cdb.iso.org/lg/CDB-00132946-001">lot</item>
+                                    <item AppInfo="Louisiana Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00132945-001">lou</item>
+                                    <item AppInfo="Lopi" ConceptLink="http://cdb.iso.org/lg/CDB-00132944-001">lov</item>
+                                    <item AppInfo="Tampias Lobu" ConceptLink="http://cdb.iso.org/lg/CDB-00132964-001">low</item>
+                                    <item AppInfo="Loun" ConceptLink="http://cdb.iso.org/lg/CDB-00132948-001">lox</item>
+                                    <item AppInfo="Lowa" ConceptLink="http://cdb.iso.org/lg/CDB-00132950-001">loy</item>
+                                    <item AppInfo="Lozi" ConceptLink="http://cdb.iso.org/lg/CDB-00132972-001">loz</item>
+                                    <item AppInfo="Lelepa" ConceptLink="http://cdb.iso.org/lg/CDB-00132971-001">lpa</item>
+                                    <item AppInfo="Lepki" ConceptLink="http://cdb.iso.org/lg/CDB-00132970-001">lpe</item>
+                                    <item AppInfo="Long Phuri Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00132969-001">lpn</item>
+                                    <item AppInfo="Lipo" ConceptLink="http://cdb.iso.org/lg/CDB-00132968-001">lpo</item>
+                                    <item AppInfo="Lopit" ConceptLink="http://cdb.iso.org/lg/CDB-00132967-001">lpx</item>
+                                    <item AppInfo="Rara Bakati'" ConceptLink="http://cdb.iso.org/lg/CDB-00132958-001">lra</item>
+                                    <item AppInfo="Northern Luri" ConceptLink="http://cdb.iso.org/lg/CDB-00132965-001">lrc</item>
+                                    <item AppInfo="Laurentian" ConceptLink="http://cdb.iso.org/lg/CDB-00138104-001">lre</item>
+                                    <item AppInfo="Laragia" ConceptLink="http://cdb.iso.org/lg/CDB-00132973-001">lrg</item>
+                                    <item AppInfo="Marachi" ConceptLink="http://cdb.iso.org/lg/CDB-00132963-001">lri</item>
+                                    <item AppInfo="Loarki" ConceptLink="http://cdb.iso.org/lg/CDB-00132962-001">lrk</item>
+                                    <item AppInfo="Lari" ConceptLink="http://cdb.iso.org/lg/CDB-00132961-001">lrl</item>
+                                    <item AppInfo="Marama" ConceptLink="http://cdb.iso.org/lg/CDB-00132960-001">lrm</item>
+                                    <item AppInfo="Lorang" ConceptLink="http://cdb.iso.org/lg/CDB-00132959-001">lrn</item>
+                                    <item AppInfo="Laro" ConceptLink="http://cdb.iso.org/lg/CDB-00133021-001">lro</item>
+                                    <item AppInfo="Southern Lorung" ConceptLink="http://cdb.iso.org/lg/CDB-00133071-001">lrr</item>
+                                    <item AppInfo="Larantuka Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132991-001">lrt</item>
+                                    <item AppInfo="Larevat" ConceptLink="http://cdb.iso.org/lg/CDB-00133053-001">lrv</item>
+                                    <item AppInfo="Lemerig" ConceptLink="http://cdb.iso.org/lg/CDB-00133052-001">lrz</item>
+                                    <item AppInfo="Lasgerdi" ConceptLink="http://cdb.iso.org/lg/CDB-00133051-001">lsa</item>
+                                    <item AppInfo="Lishana Deni" ConceptLink="http://cdb.iso.org/lg/CDB-00133050-001">lsd</item>
+                                    <item AppInfo="Lusengo" ConceptLink="http://cdb.iso.org/lg/CDB-00133049-001">lse</item>
+                                    <item AppInfo="Lyons Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133040-001">lsg</item>
+                                    <item AppInfo="Lish" ConceptLink="http://cdb.iso.org/lg/CDB-00133047-001">lsh</item>
+                                    <item AppInfo="Lashi" ConceptLink="http://cdb.iso.org/lg/CDB-00133055-001">lsi</item>
+                                    <item AppInfo="Latvian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133045-001">lsl</item>
+                                    <item AppInfo="Saamia" ConceptLink="http://cdb.iso.org/lg/CDB-00133044-001">lsm</item>
+                                    <item AppInfo="Laos Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133043-001">lso</item>
+                                    <item AppInfo="Panamanian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133042-001">lsp</item>
+                                    <item AppInfo="Aruop" ConceptLink="http://cdb.iso.org/lg/CDB-00133041-001">lsr</item>
+                                    <item AppInfo="Lasi" ConceptLink="http://cdb.iso.org/lg/CDB-00133063-001">lss</item>
+                                    <item AppInfo="Trinidad and Tobago Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00133065-001">lst</item>
+                                    <item AppInfo="Late Middle Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00137914-001">ltc</item>
+                                    <item AppInfo="Leti" ConceptLink="http://cdb.iso.org/lg/CDB-00133048-001">lti</item>
+                                    <item AppInfo="LatundÄ" ConceptLink="http://cdb.iso.org/lg/CDB-00133070-001">ltn</item>
+                                    <item AppInfo="Tsotso" ConceptLink="http://cdb.iso.org/lg/CDB-00133069-001">lto</item>
+                                    <item AppInfo="Tachoni" ConceptLink="http://cdb.iso.org/lg/CDB-00133068-001">lts</item>
+                                    <item AppInfo="Latu" ConceptLink="http://cdb.iso.org/lg/CDB-00133067-001">ltu</item>
+                                    <item AppInfo="Letzeburgesch; Luxembourgish" ConceptLink="http://cdb.iso.org/lg/CDB-00138557-001">ltz</item>
+                                    <item AppInfo="Luba-Lulua" ConceptLink="http://cdb.iso.org/lg/CDB-00133066-001">lua</item>
+                                    <item AppInfo="Luba-Katanga" ConceptLink="http://cdb.iso.org/lg/CDB-00138563-001">lub</item>
+                                    <item AppInfo="Aringa" ConceptLink="http://cdb.iso.org/lg/CDB-00133056-001">luc</item>
+                                    <item AppInfo="Ludian" ConceptLink="http://cdb.iso.org/lg/CDB-00133064-001">lud</item>
+                                    <item AppInfo="Luvale" ConceptLink="http://cdb.iso.org/lg/CDB-00133072-001">lue</item>
+                                    <item AppInfo="Laua" ConceptLink="http://cdb.iso.org/lg/CDB-00133062-001">luf</item>
+                                    <item AppInfo="Luganda; Ganda" ConceptLink="http://cdb.iso.org/lg/CDB-00138558-001">lug</item>
+                                    <item AppInfo="Luiseno" ConceptLink="http://cdb.iso.org/lg/CDB-00133061-001">lui</item>
+                                    <item AppInfo="Luna" ConceptLink="http://cdb.iso.org/lg/CDB-00133060-001">luj</item>
+                                    <item AppInfo="Lunanakha" ConceptLink="http://cdb.iso.org/lg/CDB-00133059-001">luk</item>
+                                    <item AppInfo="Olu'bo" ConceptLink="http://cdb.iso.org/lg/CDB-00133058-001">lul</item>
+                                    <item AppInfo="Luimbi" ConceptLink="http://cdb.iso.org/lg/CDB-00133057-001">lum</item>
+                                    <item AppInfo="Lunda" ConceptLink="http://cdb.iso.org/lg/CDB-00133038-001">lun</item>
+                                    <item AppInfo="Luo" ConceptLink="http://cdb.iso.org/lg/CDB-00133013-001">luo</item>
+                                    <item AppInfo="Lumbu" ConceptLink="http://cdb.iso.org/lg/CDB-00133046-001">lup</item>
+                                    <item AppInfo="Lucumi" ConceptLink="http://cdb.iso.org/lg/CDB-00133020-001">luq</item>
+                                    <item AppInfo="Laura" ConceptLink="http://cdb.iso.org/lg/CDB-00133019-001">lur</item>
+                                    <item AppInfo="Lushai" ConceptLink="http://cdb.iso.org/lg/CDB-00133018-001">lus</item>
+                                    <item AppInfo="Lushootseed" ConceptLink="http://cdb.iso.org/lg/CDB-00133017-001">lut</item>
+                                    <item AppInfo="Lumba-Yakkha" ConceptLink="http://cdb.iso.org/lg/CDB-00133016-001">luu</item>
+                                    <item AppInfo="Luwati" ConceptLink="http://cdb.iso.org/lg/CDB-00133007-001">luv</item>
+                                    <item AppInfo="Luo" ConceptLink="http://cdb.iso.org/lg/CDB-00133014-001">luw</item>
+                                    <item AppInfo="Luyia" ConceptLink="http://cdb.iso.org/lg/CDB-00130979-001">luy</item>
+                                    <item AppInfo="Southern Luri" ConceptLink="http://cdb.iso.org/lg/CDB-00133022-001">luz</item>
+                                    <item AppInfo="Maku'a" ConceptLink="http://cdb.iso.org/lg/CDB-00133012-001">lva</item>
+                                    <item AppInfo="Lavukaleve" ConceptLink="http://cdb.iso.org/lg/CDB-00133011-001">lvk</item>
+                                    <item AppInfo="Levuka" ConceptLink="http://cdb.iso.org/lg/CDB-00133010-001">lvu</item>
+                                    <item AppInfo="Lwalu" ConceptLink="http://cdb.iso.org/lg/CDB-00133009-001">lwa</item>
+                                    <item AppInfo="Lewo Eleng" ConceptLink="http://cdb.iso.org/lg/CDB-00133008-001">lwe</item>
+                                    <item AppInfo="Wanga" ConceptLink="http://cdb.iso.org/lg/CDB-00133030-001">lwg</item>
+                                    <item AppInfo="White Lachi" ConceptLink="http://cdb.iso.org/lg/CDB-00133032-001">lwh</item>
+                                    <item AppInfo="Eastern Lawa" ConceptLink="http://cdb.iso.org/lg/CDB-00133015-001">lwl</item>
+                                    <item AppInfo="Laomian" ConceptLink="http://cdb.iso.org/lg/CDB-00133037-001">lwm</item>
+                                    <item AppInfo="Luwo" ConceptLink="http://cdb.iso.org/lg/CDB-00133036-001">lwo</item>
+                                    <item AppInfo="Lewotobi" ConceptLink="http://cdb.iso.org/lg/CDB-00133035-001">lwt</item>
+                                    <item AppInfo="Lewo" ConceptLink="http://cdb.iso.org/lg/CDB-00133034-001">lww</item>
+                                    <item AppInfo="Layakha" ConceptLink="http://cdb.iso.org/lg/CDB-00133033-001">lya</item>
+                                    <item AppInfo="Lyngngam" ConceptLink="http://cdb.iso.org/lg/CDB-00133023-001">lyg</item>
+                                    <item AppInfo="Luyana" ConceptLink="http://cdb.iso.org/lg/CDB-00133031-001">lyn</item>
+                                    <item AppInfo="Literary Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00137900-001">lzh</item>
+                                    <item AppInfo="Litzlitz" ConceptLink="http://cdb.iso.org/lg/CDB-00133039-001">lzl</item>
+                                    <item AppInfo="Leinong Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00133029-001">lzn</item>
+                                    <item AppInfo="Laz" ConceptLink="http://cdb.iso.org/lg/CDB-00133028-001">lzz</item>
+                                    <item AppInfo="San JerÃ³nimo TecÃ³atl Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00133027-001">maa</item>
+                                    <item AppInfo="Yutanduchi Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00133026-001">mab</item>
+                                    <item AppInfo="Madurese" ConceptLink="http://cdb.iso.org/lg/CDB-00133025-001">mad</item>
+                                    <item AppInfo="Bo-Rukul" ConceptLink="http://cdb.iso.org/lg/CDB-00132926-001">mae</item>
+                                    <item AppInfo="Mafa" ConceptLink="http://cdb.iso.org/lg/CDB-00133054-001">maf</item>
+                                    <item AppInfo="Magahi" ConceptLink="http://cdb.iso.org/lg/CDB-00132943-001">mag</item>
+                                    <item AppInfo="Marshallese" ConceptLink="http://cdb.iso.org/lg/CDB-00138566-001">mah</item>
+                                    <item AppInfo="Maithili" ConceptLink="http://cdb.iso.org/lg/CDB-00132858-001">mai</item>
+                                    <item AppInfo="Jalapa De DÃ­az Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00132857-001">maj</item>
+                                    <item AppInfo="Makasar" ConceptLink="http://cdb.iso.org/lg/CDB-00132856-001">mak</item>
+                                    <item AppInfo="Malayalam" ConceptLink="http://cdb.iso.org/lg/CDB-00138569-001">mal</item>
+                                    <item AppInfo="Mam" ConceptLink="http://cdb.iso.org/lg/CDB-00132855-001">mam</item>
+                                    <item AppInfo="Mandingo" ConceptLink="http://cdb.iso.org/lg/CDB-00130998-001">man</item>
+                                    <item AppInfo="ChiquihuitlÃ¡n Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00132854-001">maq</item>
+                                    <item AppInfo="Marathi" ConceptLink="http://cdb.iso.org/lg/CDB-00138571-001">mar</item>
+                                    <item AppInfo="Masai" ConceptLink="http://cdb.iso.org/lg/CDB-00132853-001">mas</item>
+                                    <item AppInfo="San Francisco Matlatzinca" ConceptLink="http://cdb.iso.org/lg/CDB-00132844-001">mat</item>
+                                    <item AppInfo="Huautla Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00132851-001">mau</item>
+                                    <item AppInfo="SaterÃ©-MawÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00132859-001">mav</item>
+                                    <item AppInfo="Mampruli" ConceptLink="http://cdb.iso.org/lg/CDB-00132849-001">maw</item>
+                                    <item AppInfo="North Moluccan Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132848-001">max</item>
+                                    <item AppInfo="Central Mazahua" ConceptLink="http://cdb.iso.org/lg/CDB-00132847-001">maz</item>
+                                    <item AppInfo="Higaonon" ConceptLink="http://cdb.iso.org/lg/CDB-00132846-001">mba</item>
+                                    <item AppInfo="Western Bukidnon Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132845-001">mbb</item>
+                                    <item AppInfo="Macushi" ConceptLink="http://cdb.iso.org/lg/CDB-00132867-001">mbc</item>
+                                    <item AppInfo="Dibabawon Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132869-001">mbd</item>
+                                    <item AppInfo="Molale" ConceptLink="http://cdb.iso.org/lg/CDB-00138074-001">mbe</item>
+                                    <item AppInfo="Baba Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132852-001">mbf</item>
+                                    <item AppInfo="Mangseng" ConceptLink="http://cdb.iso.org/lg/CDB-00132874-001">mbh</item>
+                                    <item AppInfo="Ilianen Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132873-001">mbi</item>
+                                    <item AppInfo="NadÃ«b" ConceptLink="http://cdb.iso.org/lg/CDB-00132872-001">mbj</item>
+                                    <item AppInfo="Malol" ConceptLink="http://cdb.iso.org/lg/CDB-00132871-001">mbk</item>
+                                    <item AppInfo="MaxakalÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00132870-001">mbl</item>
+                                    <item AppInfo="Ombamba" ConceptLink="http://cdb.iso.org/lg/CDB-00132860-001">mbm</item>
+                                    <item AppInfo="MacaguÃ¡n" ConceptLink="http://cdb.iso.org/lg/CDB-00132868-001">mbn</item>
+                                    <item AppInfo="Mbo" ConceptLink="http://cdb.iso.org/lg/CDB-00132876-001">mbo</item>
+                                    <item AppInfo="Malayo" ConceptLink="http://cdb.iso.org/lg/CDB-00132866-001">mbp</item>
+                                    <item AppInfo="Maisin" ConceptLink="http://cdb.iso.org/lg/CDB-00132865-001">mbq</item>
+                                    <item AppInfo="Nukak MakÃº" ConceptLink="http://cdb.iso.org/lg/CDB-00132864-001">mbr</item>
+                                    <item AppInfo="Sarangani Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132863-001">mbs</item>
+                                    <item AppInfo="Matigsalug Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132862-001">mbt</item>
+                                    <item AppInfo="Mbula-Bwazza" ConceptLink="http://cdb.iso.org/lg/CDB-00132836-001">mbu</item>
+                                    <item AppInfo="Mbulungish" ConceptLink="http://cdb.iso.org/lg/CDB-00132875-001">mbv</item>
+                                    <item AppInfo="Maring" ConceptLink="http://cdb.iso.org/lg/CDB-00132850-001">mbw</item>
+                                    <item AppInfo="Mari" ConceptLink="http://cdb.iso.org/lg/CDB-00132826-001">mbx</item>
+                                    <item AppInfo="Memoni" ConceptLink="http://cdb.iso.org/lg/CDB-00132825-001">mby</item>
+                                    <item AppInfo="Amoltepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132824-001">mbz</item>
+                                    <item AppInfo="Maca" ConceptLink="http://cdb.iso.org/lg/CDB-00132823-001">mca</item>
+                                    <item AppInfo="Machiguenga" ConceptLink="http://cdb.iso.org/lg/CDB-00132822-001">mcb</item>
+                                    <item AppInfo="Bitur" ConceptLink="http://cdb.iso.org/lg/CDB-00132821-001">mcc</item>
+                                    <item AppInfo="Sharanahua" ConceptLink="http://cdb.iso.org/lg/CDB-00132812-001">mcd</item>
+                                    <item AppInfo="Itundujia Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132819-001">mce</item>
+                                    <item AppInfo="MatsÃ©s" ConceptLink="http://cdb.iso.org/lg/CDB-00132827-001">mcf</item>
+                                    <item AppInfo="Mapoyo" ConceptLink="http://cdb.iso.org/lg/CDB-00132817-001">mcg</item>
+                                    <item AppInfo="Maquiritari" ConceptLink="http://cdb.iso.org/lg/CDB-00132816-001">mch</item>
+                                    <item AppInfo="Mese" ConceptLink="http://cdb.iso.org/lg/CDB-00132815-001">mci</item>
+                                    <item AppInfo="Mvanip" ConceptLink="http://cdb.iso.org/lg/CDB-00132814-001">mcj</item>
+                                    <item AppInfo="Mbunda" ConceptLink="http://cdb.iso.org/lg/CDB-00132834-001">mck</item>
+                                    <item AppInfo="Macaguaje" ConceptLink="http://cdb.iso.org/lg/CDB-00137940-001">mcl</item>
+                                    <item AppInfo="Malaccan Creole Portuguese" ConceptLink="http://cdb.iso.org/lg/CDB-00132818-001">mcm</item>
+                                    <item AppInfo="Masana" ConceptLink="http://cdb.iso.org/lg/CDB-00132820-001">mcn</item>
+                                    <item AppInfo="CoatlÃ¡n Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00132842-001">mco</item>
+                                    <item AppInfo="Makaa" ConceptLink="http://cdb.iso.org/lg/CDB-00132841-001">mcp</item>
+                                    <item AppInfo="Ese" ConceptLink="http://cdb.iso.org/lg/CDB-00132840-001">mcq</item>
+                                    <item AppInfo="Menya" ConceptLink="http://cdb.iso.org/lg/CDB-00132839-001">mcr</item>
+                                    <item AppInfo="Mambai" ConceptLink="http://cdb.iso.org/lg/CDB-00132838-001">mcs</item>
+                                    <item AppInfo="Mengisa" ConceptLink="http://cdb.iso.org/lg/CDB-00132837-001">mct</item>
+                                    <item AppInfo="Cameroon Mambila" ConceptLink="http://cdb.iso.org/lg/CDB-00132828-001">mcu</item>
+                                    <item AppInfo="Minanibai" ConceptLink="http://cdb.iso.org/lg/CDB-00132835-001">mcv</item>
+                                    <item AppInfo="Mawa" ConceptLink="http://cdb.iso.org/lg/CDB-00132843-001">mcw</item>
+                                    <item AppInfo="Mpiemo" ConceptLink="http://cdb.iso.org/lg/CDB-00132833-001">mcx</item>
+                                    <item AppInfo="South Watut" ConceptLink="http://cdb.iso.org/lg/CDB-00132832-001">mcy</item>
+                                    <item AppInfo="Mawan" ConceptLink="http://cdb.iso.org/lg/CDB-00132831-001">mcz</item>
+                                    <item AppInfo="Mada" ConceptLink="http://cdb.iso.org/lg/CDB-00132830-001">mda</item>
+                                    <item AppInfo="Morigi" ConceptLink="http://cdb.iso.org/lg/CDB-00132878-001">mdb</item>
+                                    <item AppInfo="Male" ConceptLink="http://cdb.iso.org/lg/CDB-00132813-001">mdc</item>
+                                    <item AppInfo="Mbum" ConceptLink="http://cdb.iso.org/lg/CDB-00132861-001">mdd</item>
+                                    <item AppInfo="Maba" ConceptLink="http://cdb.iso.org/lg/CDB-00132923-001">mde</item>
+                                    <item AppInfo="Moksha" ConceptLink="http://cdb.iso.org/lg/CDB-00132922-001">mdf</item>
+                                    <item AppInfo="Massalat" ConceptLink="http://cdb.iso.org/lg/CDB-00132921-001">mdg</item>
+                                    <item AppInfo="Maguindanao" ConceptLink="http://cdb.iso.org/lg/CDB-00132920-001">mdh</item>
+                                    <item AppInfo="Mamvu" ConceptLink="http://cdb.iso.org/lg/CDB-00132919-001">mdi</item>
+                                    <item AppInfo="Mangbetu" ConceptLink="http://cdb.iso.org/lg/CDB-00132918-001">mdj</item>
+                                    <item AppInfo="Mangbutu" ConceptLink="http://cdb.iso.org/lg/CDB-00132909-001">mdk</item>
+                                    <item AppInfo="Maltese Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132916-001">mdl</item>
+                                    <item AppInfo="Mayogo" ConceptLink="http://cdb.iso.org/lg/CDB-00132924-001">mdm</item>
+                                    <item AppInfo="Mbati" ConceptLink="http://cdb.iso.org/lg/CDB-00132914-001">mdn</item>
+                                    <item AppInfo="Mbala" ConceptLink="http://cdb.iso.org/lg/CDB-00132913-001">mdp</item>
+                                    <item AppInfo="Mbole" ConceptLink="http://cdb.iso.org/lg/CDB-00132912-001">mdq</item>
+                                    <item AppInfo="Mandar" ConceptLink="http://cdb.iso.org/lg/CDB-00132911-001">mdr</item>
+                                    <item AppInfo="Maria" ConceptLink="http://cdb.iso.org/lg/CDB-00132910-001">mds</item>
+                                    <item AppInfo="Mbere" ConceptLink="http://cdb.iso.org/lg/CDB-00132932-001">mdt</item>
+                                    <item AppInfo="Mboko" ConceptLink="http://cdb.iso.org/lg/CDB-00132934-001">mdu</item>
+                                    <item AppInfo="Santa LucÃ­a Monteverde Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132917-001">mdv</item>
+                                    <item AppInfo="Mbosi" ConceptLink="http://cdb.iso.org/lg/CDB-00132939-001">mdw</item>
+                                    <item AppInfo="Dizin" ConceptLink="http://cdb.iso.org/lg/CDB-00132938-001">mdx</item>
+                                    <item AppInfo="Male" ConceptLink="http://cdb.iso.org/lg/CDB-00132937-001">mdy</item>
+                                    <item AppInfo="SuruÃ­ Do ParÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00132936-001">mdz</item>
+                                    <item AppInfo="Menka" ConceptLink="http://cdb.iso.org/lg/CDB-00132935-001">mea</item>
+                                    <item AppInfo="Ikobi-Mena" ConceptLink="http://cdb.iso.org/lg/CDB-00132925-001">meb</item>
+                                    <item AppInfo="Mara" ConceptLink="http://cdb.iso.org/lg/CDB-00132933-001">mec</item>
+                                    <item AppInfo="Melpa" ConceptLink="http://cdb.iso.org/lg/CDB-00132941-001">med</item>
+                                    <item AppInfo="Mengen" ConceptLink="http://cdb.iso.org/lg/CDB-00132931-001">mee</item>
+                                    <item AppInfo="Megam" ConceptLink="http://cdb.iso.org/lg/CDB-00132930-001">mef</item>
+                                    <item AppInfo="Mea" ConceptLink="http://cdb.iso.org/lg/CDB-00132929-001">meg</item>
+                                    <item AppInfo="Southwestern Tlaxiaco Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132928-001">meh</item>
+                                    <item AppInfo="Midob" ConceptLink="http://cdb.iso.org/lg/CDB-00132927-001">mei</item>
+                                    <item AppInfo="Meyah" ConceptLink="http://cdb.iso.org/lg/CDB-00132901-001">mej</item>
+                                    <item AppInfo="Mekeo" ConceptLink="http://cdb.iso.org/lg/CDB-00132940-001">mek</item>
+                                    <item AppInfo="Central Melanau" ConceptLink="http://cdb.iso.org/lg/CDB-00132915-001">mel</item>
+                                    <item AppInfo="Mangala" ConceptLink="http://cdb.iso.org/lg/CDB-00137968-001">mem</item>
+                                    <item AppInfo="Mende" ConceptLink="http://cdb.iso.org/lg/CDB-00132891-001">men</item>
+                                    <item AppInfo="Kedah Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132890-001">meo</item>
+                                    <item AppInfo="Miriwung" ConceptLink="http://cdb.iso.org/lg/CDB-00132889-001">mep</item>
+                                    <item AppInfo="Merey" ConceptLink="http://cdb.iso.org/lg/CDB-00132888-001">meq</item>
+                                    <item AppInfo="Meru" ConceptLink="http://cdb.iso.org/lg/CDB-00132887-001">mer</item>
+                                    <item AppInfo="Masmaje" ConceptLink="http://cdb.iso.org/lg/CDB-00132886-001">mes</item>
+                                    <item AppInfo="Mato" ConceptLink="http://cdb.iso.org/lg/CDB-00132877-001">met</item>
+                                    <item AppInfo="Motu" ConceptLink="http://cdb.iso.org/lg/CDB-00132884-001">meu</item>
+                                    <item AppInfo="Mann" ConceptLink="http://cdb.iso.org/lg/CDB-00132892-001">mev</item>
+                                    <item AppInfo="Maaka" ConceptLink="http://cdb.iso.org/lg/CDB-00132882-001">mew</item>
+                                    <item AppInfo="Hassaniyya" ConceptLink="http://cdb.iso.org/lg/CDB-00132881-001">mey</item>
+                                    <item AppInfo="Menominee" ConceptLink="http://cdb.iso.org/lg/CDB-00132880-001">mez</item>
+                                    <item AppInfo="Pattani Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132879-001">mfa</item>
+                                    <item AppInfo="Bangka" ConceptLink="http://cdb.iso.org/lg/CDB-00132899-001">mfb</item>
+                                    <item AppInfo="Mba" ConceptLink="http://cdb.iso.org/lg/CDB-00132883-001">mfc</item>
+                                    <item AppInfo="Mendankwe-Nkwen" ConceptLink="http://cdb.iso.org/lg/CDB-00132885-001">mfd</item>
+                                    <item AppInfo="Morisyen" ConceptLink="http://cdb.iso.org/lg/CDB-00132907-001">mfe</item>
+                                    <item AppInfo="Naki" ConceptLink="http://cdb.iso.org/lg/CDB-00132906-001">mff</item>
+                                    <item AppInfo="Mixifore" ConceptLink="http://cdb.iso.org/lg/CDB-00132905-001">mfg</item>
+                                    <item AppInfo="Matal" ConceptLink="http://cdb.iso.org/lg/CDB-00132904-001">mfh</item>
+                                    <item AppInfo="Wandala" ConceptLink="http://cdb.iso.org/lg/CDB-00132903-001">mfi</item>
+                                    <item AppInfo="Mefele" ConceptLink="http://cdb.iso.org/lg/CDB-00132902-001">mfj</item>
+                                    <item AppInfo="North Mofu" ConceptLink="http://cdb.iso.org/lg/CDB-00132893-001">mfk</item>
+                                    <item AppInfo="Putai" ConceptLink="http://cdb.iso.org/lg/CDB-00132900-001">mfl</item>
+                                    <item AppInfo="Marghi South" ConceptLink="http://cdb.iso.org/lg/CDB-00132908-001">mfm</item>
+                                    <item AppInfo="Cross River Mbembe" ConceptLink="http://cdb.iso.org/lg/CDB-00132898-001">mfn</item>
+                                    <item AppInfo="Mbe" ConceptLink="http://cdb.iso.org/lg/CDB-00132897-001">mfo</item>
+                                    <item AppInfo="Makassar Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132896-001">mfp</item>
+                                    <item AppInfo="Moba" ConceptLink="http://cdb.iso.org/lg/CDB-00132895-001">mfq</item>
+                                    <item AppInfo="Marithiel" ConceptLink="http://cdb.iso.org/lg/CDB-00132894-001">mfr</item>
+                                    <item AppInfo="Mexican Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132502-001">mfs</item>
+                                    <item AppInfo="Mokerang" ConceptLink="http://cdb.iso.org/lg/CDB-00132111-001">mft</item>
+                                    <item AppInfo="Mbwela" ConceptLink="http://cdb.iso.org/lg/CDB-00132633-001">mfu</item>
+                                    <item AppInfo="Mandjak" ConceptLink="http://cdb.iso.org/lg/CDB-00132204-001">mfv</item>
+                                    <item AppInfo="Mulaha" ConceptLink="http://cdb.iso.org/lg/CDB-00138255-001">mfw</item>
+                                    <item AppInfo="Melo" ConceptLink="http://cdb.iso.org/lg/CDB-00132203-001">mfx</item>
+                                    <item AppInfo="Mayo" ConceptLink="http://cdb.iso.org/lg/CDB-00132202-001">mfy</item>
+                                    <item AppInfo="Mabaan" ConceptLink="http://cdb.iso.org/lg/CDB-00132201-001">mfz</item>
+                                    <item AppInfo="Middle Irish" ConceptLink="http://cdb.iso.org/lg/CDB-00137894-001">mga</item>
+                                    <item AppInfo="Mararit" ConceptLink="http://cdb.iso.org/lg/CDB-00132200-001">mgb</item>
+                                    <item AppInfo="Morokodo" ConceptLink="http://cdb.iso.org/lg/CDB-00132191-001">mgc</item>
+                                    <item AppInfo="Moru" ConceptLink="http://cdb.iso.org/lg/CDB-00132198-001">mgd</item>
+                                    <item AppInfo="Mango" ConceptLink="http://cdb.iso.org/lg/CDB-00132206-001">mge</item>
+                                    <item AppInfo="Maklew" ConceptLink="http://cdb.iso.org/lg/CDB-00132196-001">mgf</item>
+                                    <item AppInfo="Mpongmpong" ConceptLink="http://cdb.iso.org/lg/CDB-00132195-001">mgg</item>
+                                    <item AppInfo="Makhuwa-Meetto" ConceptLink="http://cdb.iso.org/lg/CDB-00132194-001">mgh</item>
+                                    <item AppInfo="Lijili" ConceptLink="http://cdb.iso.org/lg/CDB-00132193-001">mgi</item>
+                                    <item AppInfo="Abureni" ConceptLink="http://cdb.iso.org/lg/CDB-00132192-001">mgj</item>
+                                    <item AppInfo="Mawes" ConceptLink="http://cdb.iso.org/lg/CDB-00132214-001">mgk</item>
+                                    <item AppInfo="Maleu-Kilenge" ConceptLink="http://cdb.iso.org/lg/CDB-00132216-001">mgl</item>
+                                    <item AppInfo="Mambae" ConceptLink="http://cdb.iso.org/lg/CDB-00132199-001">mgm</item>
+                                    <item AppInfo="Mbangi" ConceptLink="http://cdb.iso.org/lg/CDB-00132221-001">mgn</item>
+                                    <item AppInfo="Meta'" ConceptLink="http://cdb.iso.org/lg/CDB-00132220-001">mgo</item>
+                                    <item AppInfo="Eastern Magar" ConceptLink="http://cdb.iso.org/lg/CDB-00132219-001">mgp</item>
+                                    <item AppInfo="Malila" ConceptLink="http://cdb.iso.org/lg/CDB-00132218-001">mgq</item>
+                                    <item AppInfo="Mambwe-Lungu" ConceptLink="http://cdb.iso.org/lg/CDB-00132217-001">mgr</item>
+                                    <item AppInfo="Manda" ConceptLink="http://cdb.iso.org/lg/CDB-00132207-001">mgs</item>
+                                    <item AppInfo="Mongol" ConceptLink="http://cdb.iso.org/lg/CDB-00132215-001">mgt</item>
+                                    <item AppInfo="Mailu" ConceptLink="http://cdb.iso.org/lg/CDB-00132223-001">mgu</item>
+                                    <item AppInfo="Matengo" ConceptLink="http://cdb.iso.org/lg/CDB-00132213-001">mgv</item>
+                                    <item AppInfo="Matumbi" ConceptLink="http://cdb.iso.org/lg/CDB-00132212-001">mgw</item>
+                                    <item AppInfo="Omati" ConceptLink="http://cdb.iso.org/lg/CDB-00132211-001">mgx</item>
+                                    <item AppInfo="Mbunga" ConceptLink="http://cdb.iso.org/lg/CDB-00132210-001">mgy</item>
+                                    <item AppInfo="Mbugwe" ConceptLink="http://cdb.iso.org/lg/CDB-00132209-001">mgz</item>
+                                    <item AppInfo="Manda" ConceptLink="http://cdb.iso.org/lg/CDB-00132183-001">mha</item>
+                                    <item AppInfo="Mahongwe" ConceptLink="http://cdb.iso.org/lg/CDB-00132222-001">mhb</item>
+                                    <item AppInfo="Mocho" ConceptLink="http://cdb.iso.org/lg/CDB-00132197-001">mhc</item>
+                                    <item AppInfo="Mbugu" ConceptLink="http://cdb.iso.org/lg/CDB-00132173-001">mhd</item>
+                                    <item AppInfo="Besisi" ConceptLink="http://cdb.iso.org/lg/CDB-00132172-001">mhe</item>
+                                    <item AppInfo="Mamaa" ConceptLink="http://cdb.iso.org/lg/CDB-00132171-001">mhf</item>
+                                    <item AppInfo="Margu" ConceptLink="http://cdb.iso.org/lg/CDB-00132170-001">mhg</item>
+                                    <item AppInfo="Maskoy Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00132169-001">mhh</item>
+                                    <item AppInfo="Ma'di" ConceptLink="http://cdb.iso.org/lg/CDB-00132168-001">mhi</item>
+                                    <item AppInfo="Mogholi" ConceptLink="http://cdb.iso.org/lg/CDB-00132159-001">mhj</item>
+                                    <item AppInfo="Mungaka" ConceptLink="http://cdb.iso.org/lg/CDB-00132166-001">mhk</item>
+                                    <item AppInfo="Mauwake" ConceptLink="http://cdb.iso.org/lg/CDB-00132174-001">mhl</item>
+                                    <item AppInfo="Makhuwa-Moniga" ConceptLink="http://cdb.iso.org/lg/CDB-00132164-001">mhm</item>
+                                    <item AppInfo="MÃ³cheno" ConceptLink="http://cdb.iso.org/lg/CDB-00132163-001">mhn</item>
+                                    <item AppInfo="Mashi" ConceptLink="http://cdb.iso.org/lg/CDB-00132162-001">mho</item>
+                                    <item AppInfo="Balinese Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132161-001">mhp</item>
+                                    <item AppInfo="Mandan" ConceptLink="http://cdb.iso.org/lg/CDB-00132181-001">mhq</item>
+                                    <item AppInfo="Eastern Mari" ConceptLink="http://cdb.iso.org/lg/CDB-00132165-001">mhr</item>
+                                    <item AppInfo="Buru" ConceptLink="http://cdb.iso.org/lg/CDB-00132167-001">mhs</item>
+                                    <item AppInfo="Mandahuaca" ConceptLink="http://cdb.iso.org/lg/CDB-00132189-001">mht</item>
+                                    <item AppInfo="Digaro-Mishmi" ConceptLink="http://cdb.iso.org/lg/CDB-00132188-001">mhu</item>
+                                    <item AppInfo="Mbukushu" ConceptLink="http://cdb.iso.org/lg/CDB-00132187-001">mhw</item>
+                                    <item AppInfo="Maru" ConceptLink="http://cdb.iso.org/lg/CDB-00132186-001">mhx</item>
+                                    <item AppInfo="Ma'anyan" ConceptLink="http://cdb.iso.org/lg/CDB-00132185-001">mhy</item>
+                                    <item AppInfo="Mor" ConceptLink="http://cdb.iso.org/lg/CDB-00132184-001">mhz</item>
+                                    <item AppInfo="Miami" ConceptLink="http://cdb.iso.org/lg/CDB-00138162-001">mia</item>
+                                    <item AppInfo="AtatlÃ¡huca Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132175-001">mib</item>
+                                    <item AppInfo="Mi'kmaq; Micmac" ConceptLink="http://cdb.iso.org/lg/CDB-00132182-001">mic</item>
+                                    <item AppInfo="Mandaic" ConceptLink="http://cdb.iso.org/lg/CDB-00132190-001">mid</item>
+                                    <item AppInfo="Ocotepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132180-001">mie</item>
+                                    <item AppInfo="Mofu-Gudur" ConceptLink="http://cdb.iso.org/lg/CDB-00132179-001">mif</item>
+                                    <item AppInfo="San Miguel El Grande Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132178-001">mig</item>
+                                    <item AppInfo="Chayuco Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132177-001">mih</item>
+                                    <item AppInfo="ChigmecatitlÃ¡n Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132176-001">mii</item>
+                                    <item AppInfo="Abar" ConceptLink="http://cdb.iso.org/lg/CDB-00132238-001">mij</item>
+                                    <item AppInfo="Mikasuki" ConceptLink="http://cdb.iso.org/lg/CDB-00132288-001">mik</item>
+                                    <item AppInfo="PeÅoles Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132208-001">mil</item>
+                                    <item AppInfo="Alacatlatzala Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132270-001">mim</item>
+                                    <item AppInfo="Minangkabau" ConceptLink="http://cdb.iso.org/lg/CDB-00132269-001">min</item>
+                                    <item AppInfo="Pinotepa Nacional Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132268-001">mio</item>
+                                    <item AppInfo="Apasco-Apoala Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132267-001">mip</item>
+                                    <item AppInfo="MÃ­skito" ConceptLink="http://cdb.iso.org/lg/CDB-00132266-001">miq</item>
+                                    <item AppInfo="Isthmus Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00132257-001">mir</item>
+                                    <item AppInfo="uncoded languages" ConceptLink="http://cdb.iso.org/lg/CDB-00130972-001">mis</item>
+                                    <item AppInfo="Southern Puebla Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132264-001">mit</item>
+                                    <item AppInfo="Cacaloxtepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132272-001">miu</item>
+                                    <item AppInfo="Akoye" ConceptLink="http://cdb.iso.org/lg/CDB-00132262-001">miw</item>
+                                    <item AppInfo="Mixtepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132261-001">mix</item>
+                                    <item AppInfo="Ayutla Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132260-001">miy</item>
+                                    <item AppInfo="Coatzospan Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132259-001">miz</item>
+                                    <item AppInfo="Mahei" ConceptLink="http://cdb.iso.org/lg/CDB-00132258-001">mja</item>
+                                    <item AppInfo="San Juan Colorado Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132280-001">mjc</item>
+                                    <item AppInfo="Northwest Maidu" ConceptLink="http://cdb.iso.org/lg/CDB-00132282-001">mjd</item>
+                                    <item AppInfo="Muskum" ConceptLink="http://cdb.iso.org/lg/CDB-00138189-001">mje</item>
+                                    <item AppInfo="Tu" ConceptLink="http://cdb.iso.org/lg/CDB-00132265-001">mjg</item>
+                                    <item AppInfo="Mwera" ConceptLink="http://cdb.iso.org/lg/CDB-00132287-001">mjh</item>
+                                    <item AppInfo="Kim Mun" ConceptLink="http://cdb.iso.org/lg/CDB-00132286-001">mji</item>
+                                    <item AppInfo="Mawak" ConceptLink="http://cdb.iso.org/lg/CDB-00132285-001">mjj</item>
+                                    <item AppInfo="Matukar" ConceptLink="http://cdb.iso.org/lg/CDB-00132284-001">mjk</item>
+                                    <item AppInfo="Mandeali" ConceptLink="http://cdb.iso.org/lg/CDB-00132283-001">mjl</item>
+                                    <item AppInfo="Medebur" ConceptLink="http://cdb.iso.org/lg/CDB-00132273-001">mjm</item>
+                                    <item AppInfo="Ma" ConceptLink="http://cdb.iso.org/lg/CDB-00132281-001">mjn</item>
+                                    <item AppInfo="Malankuravan" ConceptLink="http://cdb.iso.org/lg/CDB-00132289-001">mjo</item>
+                                    <item AppInfo="Malapandaram" ConceptLink="http://cdb.iso.org/lg/CDB-00132279-001">mjp</item>
+                                    <item AppInfo="Malaryan" ConceptLink="http://cdb.iso.org/lg/CDB-00132278-001">mjq</item>
+                                    <item AppInfo="Malavedan" ConceptLink="http://cdb.iso.org/lg/CDB-00132277-001">mjr</item>
+                                    <item AppInfo="Miship" ConceptLink="http://cdb.iso.org/lg/CDB-00132276-001">mjs</item>
+                                    <item AppInfo="Sauria Paharia" ConceptLink="http://cdb.iso.org/lg/CDB-00132275-001">mjt</item>
+                                    <item AppInfo="Manna-Dora" ConceptLink="http://cdb.iso.org/lg/CDB-00132274-001">mju</item>
+                                    <item AppInfo="Mannan" ConceptLink="http://cdb.iso.org/lg/CDB-00132255-001">mjv</item>
+                                    <item AppInfo="Karbi" ConceptLink="http://cdb.iso.org/lg/CDB-00132230-001">mjw</item>
+                                    <item AppInfo="Mahali" ConceptLink="http://cdb.iso.org/lg/CDB-00132263-001">mjx</item>
+                                    <item AppInfo="Mahican" ConceptLink="http://cdb.iso.org/lg/CDB-00138184-001">mjy</item>
+                                    <item AppInfo="Majhi" ConceptLink="http://cdb.iso.org/lg/CDB-00132237-001">mjz</item>
+                                    <item AppInfo="Mbre" ConceptLink="http://cdb.iso.org/lg/CDB-00132236-001">mka</item>
+                                    <item AppInfo="Mal Paharia" ConceptLink="http://cdb.iso.org/lg/CDB-00132235-001">mkb</item>
+                                    <item AppInfo="Siliput" ConceptLink="http://cdb.iso.org/lg/CDB-00132234-001">mkc</item>
+                                    <item AppInfo="Macedonian" ConceptLink="http://cdb.iso.org/lg/CDB-00138568-001">mkd</item>
+                                    <item AppInfo="Mawchi" ConceptLink="http://cdb.iso.org/lg/CDB-00132233-001">mke</item>
+                                    <item AppInfo="Miya" ConceptLink="http://cdb.iso.org/lg/CDB-00132224-001">mkf</item>
+                                    <item AppInfo="Mak" ConceptLink="http://cdb.iso.org/lg/CDB-00132231-001">mkg</item>
+                                    <item AppInfo="Dhatki" ConceptLink="http://cdb.iso.org/lg/CDB-00132239-001">mki</item>
+                                    <item AppInfo="Mokilese" ConceptLink="http://cdb.iso.org/lg/CDB-00132229-001">mkj</item>
+                                    <item AppInfo="Byep" ConceptLink="http://cdb.iso.org/lg/CDB-00132228-001">mkk</item>
+                                    <item AppInfo="Mokole" ConceptLink="http://cdb.iso.org/lg/CDB-00132227-001">mkl</item>
+                                    <item AppInfo="Moklen" ConceptLink="http://cdb.iso.org/lg/CDB-00132226-001">mkm</item>
+                                    <item AppInfo="Kupang Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132225-001">mkn</item>
+                                    <item AppInfo="Mingang Doso" ConceptLink="http://cdb.iso.org/lg/CDB-00132247-001">mko</item>
+                                    <item AppInfo="Moikodi" ConceptLink="http://cdb.iso.org/lg/CDB-00132249-001">mkp</item>
+                                    <item AppInfo="Bay Miwok" ConceptLink="http://cdb.iso.org/lg/CDB-00138169-001">mkq</item>
+                                    <item AppInfo="Malas" ConceptLink="http://cdb.iso.org/lg/CDB-00132232-001">mkr</item>
+                                    <item AppInfo="Silacayoapan Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132254-001">mks</item>
+                                    <item AppInfo="Vamale" ConceptLink="http://cdb.iso.org/lg/CDB-00132253-001">mkt</item>
+                                    <item AppInfo="Konyanka Maninka" ConceptLink="http://cdb.iso.org/lg/CDB-00132252-001">mku</item>
+                                    <item AppInfo="Mafea" ConceptLink="http://cdb.iso.org/lg/CDB-00132251-001">mkv</item>
+                                    <item AppInfo="Kituba" ConceptLink="http://cdb.iso.org/lg/CDB-00132250-001">mkw</item>
+                                    <item AppInfo="Cinamiguin Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132240-001">mkx</item>
+                                    <item AppInfo="East Makian" ConceptLink="http://cdb.iso.org/lg/CDB-00132248-001">mky</item>
+                                    <item AppInfo="Makasae" ConceptLink="http://cdb.iso.org/lg/CDB-00132256-001">mkz</item>
+                                    <item AppInfo="Malo" ConceptLink="http://cdb.iso.org/lg/CDB-00132246-001">mla</item>
+                                    <item AppInfo="Mbule" ConceptLink="http://cdb.iso.org/lg/CDB-00132245-001">mlb</item>
+                                    <item AppInfo="Cao Lan" ConceptLink="http://cdb.iso.org/lg/CDB-00132244-001">mlc</item>
+                                    <item AppInfo="Malakhel" ConceptLink="http://cdb.iso.org/lg/CDB-00132243-001">mld</item>
+                                    <item AppInfo="Manambu" ConceptLink="http://cdb.iso.org/lg/CDB-00132242-001">mle</item>
+                                    <item AppInfo="Mal" ConceptLink="http://cdb.iso.org/lg/CDB-00132143-001">mlf</item>
+                                    <item AppInfo="Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00138565-001">mlg</item>
+                                    <item AppInfo="Mape" ConceptLink="http://cdb.iso.org/lg/CDB-00132271-001">mlh</item>
+                                    <item AppInfo="Malimpung" ConceptLink="http://cdb.iso.org/lg/CDB-00132160-001">mli</item>
+                                    <item AppInfo="Miltu" ConceptLink="http://cdb.iso.org/lg/CDB-00132075-001">mlj</item>
+                                    <item AppInfo="Ilwana" ConceptLink="http://cdb.iso.org/lg/CDB-00132074-001">mlk</item>
+                                    <item AppInfo="Malua Bay" ConceptLink="http://cdb.iso.org/lg/CDB-00132073-001">mll</item>
+                                    <item AppInfo="Mulam" ConceptLink="http://cdb.iso.org/lg/CDB-00132072-001">mlm</item>
+                                    <item AppInfo="Malango" ConceptLink="http://cdb.iso.org/lg/CDB-00132071-001">mln</item>
+                                    <item AppInfo="Mlomp" ConceptLink="http://cdb.iso.org/lg/CDB-00132070-001">mlo</item>
+                                    <item AppInfo="Bargam" ConceptLink="http://cdb.iso.org/lg/CDB-00132061-001">mlp</item>
+                                    <item AppInfo="Western Maninkakan" ConceptLink="http://cdb.iso.org/lg/CDB-00132068-001">mlq</item>
+                                    <item AppInfo="Vame" ConceptLink="http://cdb.iso.org/lg/CDB-00132076-001">mlr</item>
+                                    <item AppInfo="Masalit" ConceptLink="http://cdb.iso.org/lg/CDB-00132066-001">mls</item>
+                                    <item AppInfo="Maltese" ConceptLink="http://cdb.iso.org/lg/CDB-00138573-001">mlt</item>
+                                    <item AppInfo="To'abaita" ConceptLink="http://cdb.iso.org/lg/CDB-00132065-001">mlu</item>
+                                    <item AppInfo="Motlav" ConceptLink="http://cdb.iso.org/lg/CDB-00132064-001">mlv</item>
+                                    <item AppInfo="Moloko" ConceptLink="http://cdb.iso.org/lg/CDB-00132063-001">mlw</item>
+                                    <item AppInfo="Malfaxal" ConceptLink="http://cdb.iso.org/lg/CDB-00132062-001">mlx</item>
+                                    <item AppInfo="Malaynon" ConceptLink="http://cdb.iso.org/lg/CDB-00132084-001">mlz</item>
+                                    <item AppInfo="Mama" ConceptLink="http://cdb.iso.org/lg/CDB-00132086-001">mma</item>
+                                    <item AppInfo="Momina" ConceptLink="http://cdb.iso.org/lg/CDB-00132069-001">mmb</item>
+                                    <item AppInfo="MichoacÃ¡n Mazahua" ConceptLink="http://cdb.iso.org/lg/CDB-00132091-001">mmc</item>
+                                    <item AppInfo="Maonan" ConceptLink="http://cdb.iso.org/lg/CDB-00132090-001">mmd</item>
+                                    <item AppInfo="Mae" ConceptLink="http://cdb.iso.org/lg/CDB-00132089-001">mme</item>
+                                    <item AppInfo="Mundat" ConceptLink="http://cdb.iso.org/lg/CDB-00132088-001">mmf</item>
+                                    <item AppInfo="North Ambrym" ConceptLink="http://cdb.iso.org/lg/CDB-00132087-001">mmg</item>
+                                    <item AppInfo="MehinÃ¡ku" ConceptLink="http://cdb.iso.org/lg/CDB-00132077-001">mmh</item>
+                                    <item AppInfo="Musar" ConceptLink="http://cdb.iso.org/lg/CDB-00132085-001">mmi</item>
+                                    <item AppInfo="Majhwar" ConceptLink="http://cdb.iso.org/lg/CDB-00132093-001">mmj</item>
+                                    <item AppInfo="Mukha-Dora" ConceptLink="http://cdb.iso.org/lg/CDB-00132083-001">mmk</item>
+                                    <item AppInfo="Man Met" ConceptLink="http://cdb.iso.org/lg/CDB-00132082-001">mml</item>
+                                    <item AppInfo="Maii" ConceptLink="http://cdb.iso.org/lg/CDB-00132081-001">mmm</item>
+                                    <item AppInfo="Mamanwa" ConceptLink="http://cdb.iso.org/lg/CDB-00132080-001">mmn</item>
+                                    <item AppInfo="Mangga Buang" ConceptLink="http://cdb.iso.org/lg/CDB-00132079-001">mmo</item>
+                                    <item AppInfo="Siawi" ConceptLink="http://cdb.iso.org/lg/CDB-00132053-001">mmp</item>
+                                    <item AppInfo="Musak" ConceptLink="http://cdb.iso.org/lg/CDB-00132092-001">mmq</item>
+                                    <item AppInfo="Western Xiangxi Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00132067-001">mmr</item>
+                                    <item AppInfo="Malalamai" ConceptLink="http://cdb.iso.org/lg/CDB-00132043-001">mmt</item>
+                                    <item AppInfo="Mmaala" ConceptLink="http://cdb.iso.org/lg/CDB-00132042-001">mmu</item>
+                                    <item AppInfo="Miriti" ConceptLink="http://cdb.iso.org/lg/CDB-00138271-001">mmv</item>
+                                    <item AppInfo="Emae" ConceptLink="http://cdb.iso.org/lg/CDB-00132041-001">mmw</item>
+                                    <item AppInfo="Madak" ConceptLink="http://cdb.iso.org/lg/CDB-00132040-001">mmx</item>
+                                    <item AppInfo="Migaama" ConceptLink="http://cdb.iso.org/lg/CDB-00132039-001">mmy</item>
+                                    <item AppInfo="Mabaale" ConceptLink="http://cdb.iso.org/lg/CDB-00132038-001">mmz</item>
+                                    <item AppInfo="Mbula" ConceptLink="http://cdb.iso.org/lg/CDB-00132029-001">mna</item>
+                                    <item AppInfo="Muna" ConceptLink="http://cdb.iso.org/lg/CDB-00132036-001">mnb</item>
+                                    <item AppInfo="Manchu" ConceptLink="http://cdb.iso.org/lg/CDB-00132044-001">mnc</item>
+                                    <item AppInfo="MondÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00132034-001">mnd</item>
+                                    <item AppInfo="Naba" ConceptLink="http://cdb.iso.org/lg/CDB-00132033-001">mne</item>
+                                    <item AppInfo="Mundani" ConceptLink="http://cdb.iso.org/lg/CDB-00132032-001">mnf</item>
+                                    <item AppInfo="Eastern Mnong" ConceptLink="http://cdb.iso.org/lg/CDB-00132031-001">mng</item>
+                                    <item AppInfo="Mono" ConceptLink="http://cdb.iso.org/lg/CDB-00132051-001">mnh</item>
+                                    <item AppInfo="Manipuri" ConceptLink="http://cdb.iso.org/lg/CDB-00132035-001">mni</item>
+                                    <item AppInfo="Munji" ConceptLink="http://cdb.iso.org/lg/CDB-00132037-001">mnj</item>
+                                    <item AppInfo="Mandinka" ConceptLink="http://cdb.iso.org/lg/CDB-00132059-001">mnk</item>
+                                    <item AppInfo="Tiale" ConceptLink="http://cdb.iso.org/lg/CDB-00132058-001">mnl</item>
+                                    <item AppInfo="Mapena" ConceptLink="http://cdb.iso.org/lg/CDB-00132057-001">mnm</item>
+                                    <item AppInfo="Southern Mnong" ConceptLink="http://cdb.iso.org/lg/CDB-00132056-001">mnn</item>
+                                    <item AppInfo="Min Bei Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00132055-001">mnp</item>
+                                    <item AppInfo="Minriq" ConceptLink="http://cdb.iso.org/lg/CDB-00132054-001">mnq</item>
+                                    <item AppInfo="Mono" ConceptLink="http://cdb.iso.org/lg/CDB-00132045-001">mnr</item>
+                                    <item AppInfo="Mansi" ConceptLink="http://cdb.iso.org/lg/CDB-00132052-001">mns</item>
+                                    <item AppInfo="Maykulan" ConceptLink="http://cdb.iso.org/lg/CDB-00138296-001">mnt</item>
+                                    <item AppInfo="Mer" ConceptLink="http://cdb.iso.org/lg/CDB-00132060-001">mnu</item>
+                                    <item AppInfo="Rennell-Bellona" ConceptLink="http://cdb.iso.org/lg/CDB-00132050-001">mnv</item>
+                                    <item AppInfo="Mon" ConceptLink="http://cdb.iso.org/lg/CDB-00132049-001">mnw</item>
+                                    <item AppInfo="Manikion" ConceptLink="http://cdb.iso.org/lg/CDB-00132048-001">mnx</item>
+                                    <item AppInfo="Manyawa" ConceptLink="http://cdb.iso.org/lg/CDB-00132047-001">mny</item>
+                                    <item AppInfo="Moni" ConceptLink="http://cdb.iso.org/lg/CDB-00132095-001">mnz</item>
+                                    <item AppInfo="Mwan" ConceptLink="http://cdb.iso.org/lg/CDB-00132030-001">moa</item>
+                                    <item AppInfo="MocovÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00132078-001">moc</item>
+                                    <item AppInfo="Mobilian" ConceptLink="http://cdb.iso.org/lg/CDB-00138280-001">mod</item>
+                                    <item AppInfo="Montagnais" ConceptLink="http://cdb.iso.org/lg/CDB-00132140-001">moe</item>
+                                    <item AppInfo="Mohegan-Montauk-Narragansett" ConceptLink="http://cdb.iso.org/lg/CDB-00138278-001">mof</item>
+                                    <item AppInfo="Mongondow" ConceptLink="http://cdb.iso.org/lg/CDB-00132139-001">mog</item>
+                                    <item AppInfo="Mohawk" ConceptLink="http://cdb.iso.org/lg/CDB-00132138-001">moh</item>
+                                    <item AppInfo="Mboi" ConceptLink="http://cdb.iso.org/lg/CDB-00132137-001">moi</item>
+                                    <item AppInfo="Monzombo" ConceptLink="http://cdb.iso.org/lg/CDB-00132136-001">moj</item>
+                                    <item AppInfo="Morori" ConceptLink="http://cdb.iso.org/lg/CDB-00132135-001">mok</item>
+                                    <item AppInfo="Monimbo" ConceptLink="http://cdb.iso.org/lg/CDB-00138091-001">mom</item>
+                                    <item AppInfo="Mongolian" ConceptLink="http://cdb.iso.org/lg/CDB-00138570-001">mon</item>
+                                    <item AppInfo="Monom" ConceptLink="http://cdb.iso.org/lg/CDB-00132126-001">moo</item>
+                                    <item AppInfo="MopÃ¡n Maya" ConceptLink="http://cdb.iso.org/lg/CDB-00132133-001">mop</item>
+                                    <item AppInfo="Mor" ConceptLink="http://cdb.iso.org/lg/CDB-00132141-001">moq</item>
+                                    <item AppInfo="Moro" ConceptLink="http://cdb.iso.org/lg/CDB-00132131-001">mor</item>
+                                    <item AppInfo="Mossi" ConceptLink="http://cdb.iso.org/lg/CDB-00132130-001">mos</item>
+                                    <item AppInfo="BarÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00132129-001">mot</item>
+                                    <item AppInfo="Mogum" ConceptLink="http://cdb.iso.org/lg/CDB-00132128-001">mou</item>
+                                    <item AppInfo="Mohave" ConceptLink="http://cdb.iso.org/lg/CDB-00132127-001">mov</item>
+                                    <item AppInfo="Moi" ConceptLink="http://cdb.iso.org/lg/CDB-00132149-001">mow</item>
+                                    <item AppInfo="Molima" ConceptLink="http://cdb.iso.org/lg/CDB-00132151-001">mox</item>
+                                    <item AppInfo="Shekkacho" ConceptLink="http://cdb.iso.org/lg/CDB-00132134-001">moy</item>
+                                    <item AppInfo="Mukulu" ConceptLink="http://cdb.iso.org/lg/CDB-00132156-001">moz</item>
+                                    <item AppInfo="Mpoto" ConceptLink="http://cdb.iso.org/lg/CDB-00132155-001">mpa</item>
+                                    <item AppInfo="Mullukmulluk" ConceptLink="http://cdb.iso.org/lg/CDB-00132154-001">mpb</item>
+                                    <item AppInfo="Mangarayi" ConceptLink="http://cdb.iso.org/lg/CDB-00132153-001">mpc</item>
+                                    <item AppInfo="Machinere" ConceptLink="http://cdb.iso.org/lg/CDB-00132152-001">mpd</item>
+                                    <item AppInfo="Majang" ConceptLink="http://cdb.iso.org/lg/CDB-00132142-001">mpe</item>
+                                    <item AppInfo="Marba" ConceptLink="http://cdb.iso.org/lg/CDB-00132150-001">mpg</item>
+                                    <item AppInfo="Maung" ConceptLink="http://cdb.iso.org/lg/CDB-00132158-001">mph</item>
+                                    <item AppInfo="Mpade" ConceptLink="http://cdb.iso.org/lg/CDB-00132148-001">mpi</item>
+                                    <item AppInfo="Martu Wangka" ConceptLink="http://cdb.iso.org/lg/CDB-00132147-001">mpj</item>
+                                    <item AppInfo="Mbara" ConceptLink="http://cdb.iso.org/lg/CDB-00132146-001">mpk</item>
+                                    <item AppInfo="Middle Watut" ConceptLink="http://cdb.iso.org/lg/CDB-00132145-001">mpl</item>
+                                    <item AppInfo="YosondÃºa Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132144-001">mpm</item>
+                                    <item AppInfo="Mindiri" ConceptLink="http://cdb.iso.org/lg/CDB-00132118-001">mpn</item>
+                                    <item AppInfo="Miu" ConceptLink="http://cdb.iso.org/lg/CDB-00132157-001">mpo</item>
+                                    <item AppInfo="Migabac" ConceptLink="http://cdb.iso.org/lg/CDB-00132132-001">mpp</item>
+                                    <item AppInfo="MatÃ­s" ConceptLink="http://cdb.iso.org/lg/CDB-00132108-001">mpq</item>
+                                    <item AppInfo="Vangunu" ConceptLink="http://cdb.iso.org/lg/CDB-00132107-001">mpr</item>
+                                    <item AppInfo="Dadibi" ConceptLink="http://cdb.iso.org/lg/CDB-00132106-001">mps</item>
+                                    <item AppInfo="Mian" ConceptLink="http://cdb.iso.org/lg/CDB-00132105-001">mpt</item>
+                                    <item AppInfo="MakurÃ¡p" ConceptLink="http://cdb.iso.org/lg/CDB-00132104-001">mpu</item>
+                                    <item AppInfo="Mungkip" ConceptLink="http://cdb.iso.org/lg/CDB-00132103-001">mpv</item>
+                                    <item AppInfo="Mapidian" ConceptLink="http://cdb.iso.org/lg/CDB-00132094-001">mpw</item>
+                                    <item AppInfo="Misima-Paneati" ConceptLink="http://cdb.iso.org/lg/CDB-00132101-001">mpx</item>
+                                    <item AppInfo="Mapia" ConceptLink="http://cdb.iso.org/lg/CDB-00132109-001">mpy</item>
+                                    <item AppInfo="Mpi" ConceptLink="http://cdb.iso.org/lg/CDB-00132099-001">mpz</item>
+                                    <item AppInfo="Maba" ConceptLink="http://cdb.iso.org/lg/CDB-00132098-001">mqa</item>
+                                    <item AppInfo="Mbuko" ConceptLink="http://cdb.iso.org/lg/CDB-00132097-001">mqb</item>
+                                    <item AppInfo="Mangole" ConceptLink="http://cdb.iso.org/lg/CDB-00132096-001">mqc</item>
+                                    <item AppInfo="Matepi" ConceptLink="http://cdb.iso.org/lg/CDB-00132116-001">mqe</item>
+                                    <item AppInfo="Momuna" ConceptLink="http://cdb.iso.org/lg/CDB-00132100-001">mqf</item>
+                                    <item AppInfo="Kota Bangun Kutai Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132102-001">mqg</item>
+                                    <item AppInfo="Tlazoyaltepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132124-001">mqh</item>
+                                    <item AppInfo="Mariri" ConceptLink="http://cdb.iso.org/lg/CDB-00132123-001">mqi</item>
+                                    <item AppInfo="Mamasa" ConceptLink="http://cdb.iso.org/lg/CDB-00132122-001">mqj</item>
+                                    <item AppInfo="Rajah Kabunsuwan Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132121-001">mqk</item>
+                                    <item AppInfo="Mbelime" ConceptLink="http://cdb.iso.org/lg/CDB-00132120-001">mql</item>
+                                    <item AppInfo="South Marquesan" ConceptLink="http://cdb.iso.org/lg/CDB-00132119-001">mqm</item>
+                                    <item AppInfo="Moronene" ConceptLink="http://cdb.iso.org/lg/CDB-00132110-001">mqn</item>
+                                    <item AppInfo="Modole" ConceptLink="http://cdb.iso.org/lg/CDB-00132117-001">mqo</item>
+                                    <item AppInfo="Manipa" ConceptLink="http://cdb.iso.org/lg/CDB-00132125-001">mqp</item>
+                                    <item AppInfo="Minokok" ConceptLink="http://cdb.iso.org/lg/CDB-00132115-001">mqq</item>
+                                    <item AppInfo="Mander" ConceptLink="http://cdb.iso.org/lg/CDB-00132114-001">mqr</item>
+                                    <item AppInfo="West Makian" ConceptLink="http://cdb.iso.org/lg/CDB-00132113-001">mqs</item>
+                                    <item AppInfo="Mok" ConceptLink="http://cdb.iso.org/lg/CDB-00132112-001">mqt</item>
+                                    <item AppInfo="Mandari" ConceptLink="http://cdb.iso.org/lg/CDB-00132307-001">mqu</item>
+                                    <item AppInfo="Mosimo" ConceptLink="http://cdb.iso.org/lg/CDB-00132046-001">mqv</item>
+                                    <item AppInfo="Murupi" ConceptLink="http://cdb.iso.org/lg/CDB-00132241-001">mqw</item>
+                                    <item AppInfo="Mamuju" ConceptLink="http://cdb.iso.org/lg/CDB-00132466-001">mqx</item>
+                                    <item AppInfo="Manggarai" ConceptLink="http://cdb.iso.org/lg/CDB-00132465-001">mqy</item>
+                                    <item AppInfo="Malasanga" ConceptLink="http://cdb.iso.org/lg/CDB-00132464-001">mqz</item>
+                                    <item AppInfo="Mlabri" ConceptLink="http://cdb.iso.org/lg/CDB-00132463-001">mra</item>
+                                    <item AppInfo="Marino" ConceptLink="http://cdb.iso.org/lg/CDB-00132462-001">mrb</item>
+                                    <item AppInfo="Maricopa" ConceptLink="http://cdb.iso.org/lg/CDB-00132461-001">mrc</item>
+                                    <item AppInfo="Western Magar" ConceptLink="http://cdb.iso.org/lg/CDB-00132452-001">mrd</item>
+                                    <item AppInfo="Martha's Vineyard Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137924-001">mre</item>
+                                    <item AppInfo="Elseng" ConceptLink="http://cdb.iso.org/lg/CDB-00132459-001">mrf</item>
+                                    <item AppInfo="Miri" ConceptLink="http://cdb.iso.org/lg/CDB-00132467-001">mrg</item>
+                                    <item AppInfo="Mara Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00132457-001">mrh</item>
+                                    <item AppInfo="Maori" ConceptLink="http://cdb.iso.org/lg/CDB-00138567-001">mri</item>
+                                    <item AppInfo="Western Mari" ConceptLink="http://cdb.iso.org/lg/CDB-00132456-001">mrj</item>
+                                    <item AppInfo="Hmwaveke" ConceptLink="http://cdb.iso.org/lg/CDB-00132455-001">mrk</item>
+                                    <item AppInfo="Mortlockese" ConceptLink="http://cdb.iso.org/lg/CDB-00132454-001">mrl</item>
+                                    <item AppInfo="Merlav" ConceptLink="http://cdb.iso.org/lg/CDB-00132453-001">mrm</item>
+                                    <item AppInfo="Cheke Holo" ConceptLink="http://cdb.iso.org/lg/CDB-00132475-001">mrn</item>
+                                    <item AppInfo="Mru" ConceptLink="http://cdb.iso.org/lg/CDB-00132477-001">mro</item>
+                                    <item AppInfo="Morouas" ConceptLink="http://cdb.iso.org/lg/CDB-00132460-001">mrp</item>
+                                    <item AppInfo="North Marquesan" ConceptLink="http://cdb.iso.org/lg/CDB-00132482-001">mrq</item>
+                                    <item AppInfo="Maria" ConceptLink="http://cdb.iso.org/lg/CDB-00132481-001">mrr</item>
+                                    <item AppInfo="Maragus" ConceptLink="http://cdb.iso.org/lg/CDB-00132480-001">mrs</item>
+                                    <item AppInfo="Marghi Central" ConceptLink="http://cdb.iso.org/lg/CDB-00132479-001">mrt</item>
+                                    <item AppInfo="Mono" ConceptLink="http://cdb.iso.org/lg/CDB-00132478-001">mru</item>
+                                    <item AppInfo="Mangareva" ConceptLink="http://cdb.iso.org/lg/CDB-00132468-001">mrv</item>
+                                    <item AppInfo="Maranao" ConceptLink="http://cdb.iso.org/lg/CDB-00132476-001">mrw</item>
+                                    <item AppInfo="Maremgi" ConceptLink="http://cdb.iso.org/lg/CDB-00132484-001">mrx</item>
+                                    <item AppInfo="Karaga Mandaya" ConceptLink="http://cdb.iso.org/lg/CDB-00132474-001">mry</item>
+                                    <item AppInfo="Marind" ConceptLink="http://cdb.iso.org/lg/CDB-00132473-001">mrz</item>
+                                    <item AppInfo="Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00138572-001">msa</item>
+                                    <item AppInfo="Masbatenyo" ConceptLink="http://cdb.iso.org/lg/CDB-00132472-001">msb</item>
+                                    <item AppInfo="Sankaran Maninka" ConceptLink="http://cdb.iso.org/lg/CDB-00132471-001">msc</item>
+                                    <item AppInfo="Yucatec Maya Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132470-001">msd</item>
+                                    <item AppInfo="Musey" ConceptLink="http://cdb.iso.org/lg/CDB-00132444-001">mse</item>
+                                    <item AppInfo="Mekwei" ConceptLink="http://cdb.iso.org/lg/CDB-00132483-001">msf</item>
+                                    <item AppInfo="Moraid" ConceptLink="http://cdb.iso.org/lg/CDB-00132458-001">msg</item>
+                                    <item AppInfo="Masikoro Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00132434-001">msh</item>
+                                    <item AppInfo="Sabah Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00132433-001">msi</item>
+                                    <item AppInfo="Ma" ConceptLink="http://cdb.iso.org/lg/CDB-00132432-001">msj</item>
+                                    <item AppInfo="Mansaka" ConceptLink="http://cdb.iso.org/lg/CDB-00132431-001">msk</item>
+                                    <item AppInfo="Molof" ConceptLink="http://cdb.iso.org/lg/CDB-00132430-001">msl</item>
+                                    <item AppInfo="Agusan Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132429-001">msm</item>
+                                    <item AppInfo="VurÃ«s" ConceptLink="http://cdb.iso.org/lg/CDB-00132420-001">msn</item>
+                                    <item AppInfo="Mombum" ConceptLink="http://cdb.iso.org/lg/CDB-00132427-001">mso</item>
+                                    <item AppInfo="MaritsauÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138087-001">msp</item>
+                                    <item AppInfo="Caac" ConceptLink="http://cdb.iso.org/lg/CDB-00132435-001">msq</item>
+                                    <item AppInfo="Mongolian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132425-001">msr</item>
+                                    <item AppInfo="West Masela" ConceptLink="http://cdb.iso.org/lg/CDB-00132424-001">mss</item>
+                                    <item AppInfo="Cataelano Mandaya" ConceptLink="http://cdb.iso.org/lg/CDB-00132423-001">mst</item>
+                                    <item AppInfo="Musom" ConceptLink="http://cdb.iso.org/lg/CDB-00132422-001">msu</item>
+                                    <item AppInfo="Maslam" ConceptLink="http://cdb.iso.org/lg/CDB-00132442-001">msv</item>
+                                    <item AppInfo="Mansoanka" ConceptLink="http://cdb.iso.org/lg/CDB-00132426-001">msw</item>
+                                    <item AppInfo="Moresada" ConceptLink="http://cdb.iso.org/lg/CDB-00132428-001">msx</item>
+                                    <item AppInfo="Aruamu" ConceptLink="http://cdb.iso.org/lg/CDB-00132450-001">msy</item>
+                                    <item AppInfo="Momare" ConceptLink="http://cdb.iso.org/lg/CDB-00132449-001">msz</item>
+                                    <item AppInfo="Cotabato Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00132448-001">mta</item>
+                                    <item AppInfo="Anyin Morofo" ConceptLink="http://cdb.iso.org/lg/CDB-00132447-001">mtb</item>
+                                    <item AppInfo="Munit" ConceptLink="http://cdb.iso.org/lg/CDB-00132446-001">mtc</item>
+                                    <item AppInfo="Mualang" ConceptLink="http://cdb.iso.org/lg/CDB-00132445-001">mtd</item>
+                                    <item AppInfo="Mono" ConceptLink="http://cdb.iso.org/lg/CDB-00132436-001">mte</item>
+                                    <item AppInfo="Murik" ConceptLink="http://cdb.iso.org/lg/CDB-00135356-001">mtf</item>
+                                    <item AppInfo="Una" ConceptLink="http://cdb.iso.org/lg/CDB-00132451-001">mtg</item>
+                                    <item AppInfo="Munggui" ConceptLink="http://cdb.iso.org/lg/CDB-00134466-001">mth</item>
+                                    <item AppInfo="Maiwa" ConceptLink="http://cdb.iso.org/lg/CDB-00132441-001">mti</item>
+                                    <item AppInfo="Moskona" ConceptLink="http://cdb.iso.org/lg/CDB-00132440-001">mtj</item>
+                                    <item AppInfo="Mbe'" ConceptLink="http://cdb.iso.org/lg/CDB-00132439-001">mtk</item>
+                                    <item AppInfo="Montol" ConceptLink="http://cdb.iso.org/lg/CDB-00132438-001">mtl</item>
+                                    <item AppInfo="Mator" ConceptLink="http://cdb.iso.org/lg/CDB-00138118-001">mtm</item>
+                                    <item AppInfo="Matagalpa" ConceptLink="http://cdb.iso.org/lg/CDB-00138116-001">mtn</item>
+                                    <item AppInfo="Totontepec Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00132437-001">mto</item>
+                                    <item AppInfo="WichÃ­ LhamtÃ©s Nocten" ConceptLink="http://cdb.iso.org/lg/CDB-00132499-001">mtp</item>
+                                    <item AppInfo="Muong" ConceptLink="http://cdb.iso.org/lg/CDB-00132549-001">mtq</item>
+                                    <item AppInfo="Mewari" ConceptLink="http://cdb.iso.org/lg/CDB-00132469-001">mtr</item>
+                                    <item AppInfo="Yora" ConceptLink="http://cdb.iso.org/lg/CDB-00132531-001">mts</item>
+                                    <item AppInfo="Mota" ConceptLink="http://cdb.iso.org/lg/CDB-00132530-001">mtt</item>
+                                    <item AppInfo="Tututepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132529-001">mtu</item>
+                                    <item AppInfo="Asaro'o" ConceptLink="http://cdb.iso.org/lg/CDB-00132528-001">mtv</item>
+                                    <item AppInfo="Magahat" ConceptLink="http://cdb.iso.org/lg/CDB-00132527-001">mtw</item>
+                                    <item AppInfo="TidaÃ¡ Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132518-001">mtx</item>
+                                    <item AppInfo="Nabi" ConceptLink="http://cdb.iso.org/lg/CDB-00132525-001">mty</item>
+                                    <item AppInfo="Mundang" ConceptLink="http://cdb.iso.org/lg/CDB-00132533-001">mua</item>
+                                    <item AppInfo="Mubi" ConceptLink="http://cdb.iso.org/lg/CDB-00132523-001">mub</item>
+                                    <item AppInfo="Mbu'" ConceptLink="http://cdb.iso.org/lg/CDB-00132522-001">muc</item>
+                                    <item AppInfo="Mednyj Aleut" ConceptLink="http://cdb.iso.org/lg/CDB-00132521-001">mud</item>
+                                    <item AppInfo="Media Lengua" ConceptLink="http://cdb.iso.org/lg/CDB-00132520-001">mue</item>
+                                    <item AppInfo="Musgu" ConceptLink="http://cdb.iso.org/lg/CDB-00132519-001">mug</item>
+                                    <item AppInfo="MÃŒndÃŒ" ConceptLink="http://cdb.iso.org/lg/CDB-00132541-001">muh</item>
+                                    <item AppInfo="Musi" ConceptLink="http://cdb.iso.org/lg/CDB-00132543-001">mui</item>
+                                    <item AppInfo="Mabire" ConceptLink="http://cdb.iso.org/lg/CDB-00132526-001">muj</item>
+                                    <item AppInfo="Mugom" ConceptLink="http://cdb.iso.org/lg/CDB-00132548-001">muk</item>
+                                    <item AppInfo="multiple languages" ConceptLink="http://cdb.iso.org/lg/CDB-00130974-001">mul</item>
+                                    <item AppInfo="Maiwala" ConceptLink="http://cdb.iso.org/lg/CDB-00132547-001">mum</item>
+                                    <item AppInfo="Nyong" ConceptLink="http://cdb.iso.org/lg/CDB-00132546-001">muo</item>
+                                    <item AppInfo="Malvi" ConceptLink="http://cdb.iso.org/lg/CDB-00132545-001">mup</item>
+                                    <item AppInfo="Eastern Xiangxi Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00132544-001">muq</item>
+                                    <item AppInfo="Murle" ConceptLink="http://cdb.iso.org/lg/CDB-00132534-001">mur</item>
+                                    <item AppInfo="Creek" ConceptLink="http://cdb.iso.org/lg/CDB-00132542-001">mus</item>
+                                    <item AppInfo="Western Muria" ConceptLink="http://cdb.iso.org/lg/CDB-00132550-001">mut</item>
+                                    <item AppInfo="Yaaku" ConceptLink="http://cdb.iso.org/lg/CDB-00132540-001">muu</item>
+                                    <item AppInfo="Muthuvan" ConceptLink="http://cdb.iso.org/lg/CDB-00132539-001">muv</item>
+                                    <item AppInfo="Bo-Ung" ConceptLink="http://cdb.iso.org/lg/CDB-00132538-001">mux</item>
+                                    <item AppInfo="Muyang" ConceptLink="http://cdb.iso.org/lg/CDB-00132537-001">muy</item>
+                                    <item AppInfo="Mursi" ConceptLink="http://cdb.iso.org/lg/CDB-00132536-001">muz</item>
+                                    <item AppInfo="Manam" ConceptLink="http://cdb.iso.org/lg/CDB-00132535-001">mva</item>
+                                    <item AppInfo="Mattole" ConceptLink="http://cdb.iso.org/lg/CDB-00138023-001">mvb</item>
+                                    <item AppInfo="Mamboru" ConceptLink="http://cdb.iso.org/lg/CDB-00132516-001">mvd</item>
+                                    <item AppInfo="Marwari" ConceptLink="http://cdb.iso.org/lg/CDB-00132491-001">mve</item>
+                                    <item AppInfo="Peripheral Mongolian" ConceptLink="http://cdb.iso.org/lg/CDB-00132524-001">mvf</item>
+                                    <item AppInfo="YucuaÅe Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132498-001">mvg</item>
+                                    <item AppInfo="Mire" ConceptLink="http://cdb.iso.org/lg/CDB-00132497-001">mvh</item>
+                                    <item AppInfo="Miyako" ConceptLink="http://cdb.iso.org/lg/CDB-00132496-001">mvi</item>
+                                    <item AppInfo="Mekmek" ConceptLink="http://cdb.iso.org/lg/CDB-00132495-001">mvk</item>
+                                    <item AppInfo="Mbara" ConceptLink="http://cdb.iso.org/lg/CDB-00138015-001">mvl</item>
+                                    <item AppInfo="Muya" ConceptLink="http://cdb.iso.org/lg/CDB-00132494-001">mvm</item>
+                                    <item AppInfo="Minaveha" ConceptLink="http://cdb.iso.org/lg/CDB-00132485-001">mvn</item>
+                                    <item AppInfo="Marovo" ConceptLink="http://cdb.iso.org/lg/CDB-00132492-001">mvo</item>
+                                    <item AppInfo="Duri" ConceptLink="http://cdb.iso.org/lg/CDB-00132500-001">mvp</item>
+                                    <item AppInfo="Moere" ConceptLink="http://cdb.iso.org/lg/CDB-00132490-001">mvq</item>
+                                    <item AppInfo="Marau" ConceptLink="http://cdb.iso.org/lg/CDB-00132489-001">mvr</item>
+                                    <item AppInfo="Massep" ConceptLink="http://cdb.iso.org/lg/CDB-00132488-001">mvs</item>
+                                    <item AppInfo="Mpotovoro" ConceptLink="http://cdb.iso.org/lg/CDB-00132487-001">mvt</item>
+                                    <item AppInfo="Marfa" ConceptLink="http://cdb.iso.org/lg/CDB-00132486-001">mvu</item>
+                                    <item AppInfo="Tagal Murut" ConceptLink="http://cdb.iso.org/lg/CDB-00132508-001">mvv</item>
+                                    <item AppInfo="Machinga" ConceptLink="http://cdb.iso.org/lg/CDB-00132510-001">mvw</item>
+                                    <item AppInfo="Meoswar" ConceptLink="http://cdb.iso.org/lg/CDB-00132493-001">mvx</item>
+                                    <item AppInfo="Indus Kohistani" ConceptLink="http://cdb.iso.org/lg/CDB-00132515-001">mvy</item>
+                                    <item AppInfo="Mesqan" ConceptLink="http://cdb.iso.org/lg/CDB-00132514-001">mvz</item>
+                                    <item AppInfo="Mwatebu" ConceptLink="http://cdb.iso.org/lg/CDB-00132513-001">mwa</item>
+                                    <item AppInfo="Juwal" ConceptLink="http://cdb.iso.org/lg/CDB-00132512-001">mwb</item>
+                                    <item AppInfo="Are" ConceptLink="http://cdb.iso.org/lg/CDB-00132511-001">mwc</item>
+                                    <item AppInfo="Mudbura" ConceptLink="http://cdb.iso.org/lg/CDB-00132501-001">mwd</item>
+                                    <item AppInfo="Mwera" ConceptLink="http://cdb.iso.org/lg/CDB-00132509-001">mwe</item>
+                                    <item AppInfo="Murrinh-Patha" ConceptLink="http://cdb.iso.org/lg/CDB-00132517-001">mwf</item>
+                                    <item AppInfo="Aiklep" ConceptLink="http://cdb.iso.org/lg/CDB-00132507-001">mwg</item>
+                                    <item AppInfo="Mouk-Aria" ConceptLink="http://cdb.iso.org/lg/CDB-00132506-001">mwh</item>
+                                    <item AppInfo="Labo" ConceptLink="http://cdb.iso.org/lg/CDB-00132505-001">mwi</item>
+                                    <item AppInfo="Maligo" ConceptLink="http://cdb.iso.org/lg/CDB-00132504-001">mwj</item>
+                                    <item AppInfo="Kita Maninkakan" ConceptLink="http://cdb.iso.org/lg/CDB-00132503-001">mwk</item>
+                                    <item AppInfo="Mirandese" ConceptLink="http://cdb.iso.org/lg/CDB-00132404-001">mwl</item>
+                                    <item AppInfo="Sar" ConceptLink="http://cdb.iso.org/lg/CDB-00132532-001">mwm</item>
+                                    <item AppInfo="Nyamwanga" ConceptLink="http://cdb.iso.org/lg/CDB-00132421-001">mwn</item>
+                                    <item AppInfo="Central Maewo" ConceptLink="http://cdb.iso.org/lg/CDB-00132336-001">mwo</item>
+                                    <item AppInfo="Kala Lagaw Ya" ConceptLink="http://cdb.iso.org/lg/CDB-00132335-001">mwp</item>
+                                    <item AppInfo="MÃŒn Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00132334-001">mwq</item>
+                                    <item AppInfo="Marwari" ConceptLink="http://cdb.iso.org/lg/CDB-00130995-001">mwr</item>
+                                    <item AppInfo="Mwimbi-Muthambi" ConceptLink="http://cdb.iso.org/lg/CDB-00132333-001">mws</item>
+                                    <item AppInfo="Moken" ConceptLink="http://cdb.iso.org/lg/CDB-00132332-001">mwt</item>
+                                    <item AppInfo="Mittu" ConceptLink="http://cdb.iso.org/lg/CDB-00138041-001">mwu</item>
+                                    <item AppInfo="Mentawai" ConceptLink="http://cdb.iso.org/lg/CDB-00132331-001">mwv</item>
+                                    <item AppInfo="Hmong Daw" ConceptLink="http://cdb.iso.org/lg/CDB-00132322-001">mww</item>
+                                    <item AppInfo="Mediak" ConceptLink="http://cdb.iso.org/lg/CDB-00132329-001">mwx</item>
+                                    <item AppInfo="Mosiro" ConceptLink="http://cdb.iso.org/lg/CDB-00132337-001">mwy</item>
+                                    <item AppInfo="Moingi" ConceptLink="http://cdb.iso.org/lg/CDB-00132327-001">mwz</item>
+                                    <item AppInfo="Northwest Oaxaca Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132326-001">mxa</item>
+                                    <item AppInfo="TezoatlÃ¡n Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132325-001">mxb</item>
+                                    <item AppInfo="Manyika" ConceptLink="http://cdb.iso.org/lg/CDB-00132324-001">mxc</item>
+                                    <item AppInfo="Modang" ConceptLink="http://cdb.iso.org/lg/CDB-00132323-001">mxd</item>
+                                    <item AppInfo="Mele-Fila" ConceptLink="http://cdb.iso.org/lg/CDB-00132345-001">mxe</item>
+                                    <item AppInfo="Malgbe" ConceptLink="http://cdb.iso.org/lg/CDB-00132347-001">mxf</item>
+                                    <item AppInfo="Mbangala" ConceptLink="http://cdb.iso.org/lg/CDB-00132330-001">mxg</item>
+                                    <item AppInfo="Mvuba" ConceptLink="http://cdb.iso.org/lg/CDB-00132352-001">mxh</item>
+                                    <item AppInfo="Mozarabic" ConceptLink="http://cdb.iso.org/lg/CDB-00138063-001">mxi</item>
+                                    <item AppInfo="Miju-Mishmi" ConceptLink="http://cdb.iso.org/lg/CDB-00132351-001">mxj</item>
+                                    <item AppInfo="Monumbo" ConceptLink="http://cdb.iso.org/lg/CDB-00132350-001">mxk</item>
+                                    <item AppInfo="Maxi Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00132349-001">mxl</item>
+                                    <item AppInfo="Meramera" ConceptLink="http://cdb.iso.org/lg/CDB-00132348-001">mxm</item>
+                                    <item AppInfo="Moi" ConceptLink="http://cdb.iso.org/lg/CDB-00132338-001">mxn</item>
+                                    <item AppInfo="Mbowe" ConceptLink="http://cdb.iso.org/lg/CDB-00132346-001">mxo</item>
+                                    <item AppInfo="Tlahuitoltepec Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00132354-001">mxp</item>
+                                    <item AppInfo="Juquila Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00132344-001">mxq</item>
+                                    <item AppInfo="Murik" ConceptLink="http://cdb.iso.org/lg/CDB-00132343-001">mxr</item>
+                                    <item AppInfo="Huitepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132342-001">mxs</item>
+                                    <item AppInfo="Jamiltepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132341-001">mxt</item>
+                                    <item AppInfo="Mada" ConceptLink="http://cdb.iso.org/lg/CDB-00132340-001">mxu</item>
+                                    <item AppInfo="MetlatÃ³noc Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132314-001">mxv</item>
+                                    <item AppInfo="Namo" ConceptLink="http://cdb.iso.org/lg/CDB-00132353-001">mxw</item>
+                                    <item AppInfo="Mahou" ConceptLink="http://cdb.iso.org/lg/CDB-00132328-001">mxx</item>
+                                    <item AppInfo="Southeastern NochixtlÃ¡n Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132304-001">mxy</item>
+                                    <item AppInfo="Central Masela" ConceptLink="http://cdb.iso.org/lg/CDB-00132303-001">mxz</item>
+                                    <item AppInfo="Myanmar; Burmese" ConceptLink="http://cdb.iso.org/lg/CDB-00138574-001">mya</item>
+                                    <item AppInfo="Mbay" ConceptLink="http://cdb.iso.org/lg/CDB-00132302-001">myb</item>
+                                    <item AppInfo="Mayeka" ConceptLink="http://cdb.iso.org/lg/CDB-00132301-001">myc</item>
+                                    <item AppInfo="Maramba" ConceptLink="http://cdb.iso.org/lg/CDB-00132300-001">myd</item>
+                                    <item AppInfo="Myene" ConceptLink="http://cdb.iso.org/lg/CDB-00132299-001">mye</item>
+                                    <item AppInfo="Bambassi" ConceptLink="http://cdb.iso.org/lg/CDB-00132290-001">myf</item>
+                                    <item AppInfo="Manta" ConceptLink="http://cdb.iso.org/lg/CDB-00132297-001">myg</item>
+                                    <item AppInfo="Makah" ConceptLink="http://cdb.iso.org/lg/CDB-00137933-001">myh</item>
+                                    <item AppInfo="Mina" ConceptLink="http://cdb.iso.org/lg/CDB-00132305-001">myi</item>
+                                    <item AppInfo="Mangayat" ConceptLink="http://cdb.iso.org/lg/CDB-00132295-001">myj</item>
+                                    <item AppInfo="Mamara Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00132294-001">myk</item>
+                                    <item AppInfo="Moma" ConceptLink="http://cdb.iso.org/lg/CDB-00132293-001">myl</item>
+                                    <item AppInfo="Me'en" ConceptLink="http://cdb.iso.org/lg/CDB-00132292-001">mym</item>
+                                    <item AppInfo="Anfillo" ConceptLink="http://cdb.iso.org/lg/CDB-00132312-001">myo</item>
+                                    <item AppInfo="PirahÃ£" ConceptLink="http://cdb.iso.org/lg/CDB-00132296-001">myp</item>
+                                    <item AppInfo="Forest Maninka" ConceptLink="http://cdb.iso.org/lg/CDB-00132298-001">myq</item>
+                                    <item AppInfo="Muniche" ConceptLink="http://cdb.iso.org/lg/CDB-00132320-001">myr</item>
+                                    <item AppInfo="Mesmes" ConceptLink="http://cdb.iso.org/lg/CDB-00137920-001">mys</item>
+                                    <item AppInfo="Sangab Mandaya" ConceptLink="http://cdb.iso.org/lg/CDB-00132319-001">myt</item>
+                                    <item AppInfo="MundurukÃº" ConceptLink="http://cdb.iso.org/lg/CDB-00132318-001">myu</item>
+                                    <item AppInfo="Erzya" ConceptLink="http://cdb.iso.org/lg/CDB-00132317-001">myv</item>
+                                    <item AppInfo="Muyuw" ConceptLink="http://cdb.iso.org/lg/CDB-00132316-001">myw</item>
+                                    <item AppInfo="Masaaba" ConceptLink="http://cdb.iso.org/lg/CDB-00132315-001">myx</item>
+                                    <item AppInfo="Macuna" ConceptLink="http://cdb.iso.org/lg/CDB-00132306-001">myy</item>
+                                    <item AppInfo="Classical Mandaic" ConceptLink="http://cdb.iso.org/lg/CDB-00137864-001">myz</item>
+                                    <item AppInfo="Santa MarÃ­a Zacatepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00132313-001">mza</item>
+                                    <item AppInfo="Tumzabt" ConceptLink="http://cdb.iso.org/lg/CDB-00132321-001">mzb</item>
+                                    <item AppInfo="Madagascar Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132311-001">mzc</item>
+                                    <item AppInfo="Malimba" ConceptLink="http://cdb.iso.org/lg/CDB-00132310-001">mzd</item>
+                                    <item AppInfo="Morawa" ConceptLink="http://cdb.iso.org/lg/CDB-00132309-001">mze</item>
+                                    <item AppInfo="Monastic Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132308-001">mzg</item>
+                                    <item AppInfo="WichÃ­ LhamtÃ©s GÃŒisnay" ConceptLink="http://cdb.iso.org/lg/CDB-00132356-001">mzh</item>
+                                    <item AppInfo="IxcatlÃ¡n Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00132291-001">mzi</item>
+                                    <item AppInfo="Manya" ConceptLink="http://cdb.iso.org/lg/CDB-00132339-001">mzj</item>
+                                    <item AppInfo="Nigeria Mambila" ConceptLink="http://cdb.iso.org/lg/CDB-00132401-001">mzk</item>
+                                    <item AppInfo="MazatlÃ¡n Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00132400-001">mzl</item>
+                                    <item AppInfo="Mumuye" ConceptLink="http://cdb.iso.org/lg/CDB-00132399-001">mzm</item>
+                                    <item AppInfo="Mazanderani" ConceptLink="http://cdb.iso.org/lg/CDB-00132398-001">mzn</item>
+                                    <item AppInfo="Matipuhy" ConceptLink="http://cdb.iso.org/lg/CDB-00138005-001">mzo</item>
+                                    <item AppInfo="Movima" ConceptLink="http://cdb.iso.org/lg/CDB-00132397-001">mzp</item>
+                                    <item AppInfo="Mori Atas" ConceptLink="http://cdb.iso.org/lg/CDB-00132396-001">mzq</item>
+                                    <item AppInfo="MarÃºbo" ConceptLink="http://cdb.iso.org/lg/CDB-00132387-001">mzr</item>
+                                    <item AppInfo="Macanese" ConceptLink="http://cdb.iso.org/lg/CDB-00132394-001">mzs</item>
+                                    <item AppInfo="Mintil" ConceptLink="http://cdb.iso.org/lg/CDB-00132402-001">mzt</item>
+                                    <item AppInfo="Inapang" ConceptLink="http://cdb.iso.org/lg/CDB-00132392-001">mzu</item>
+                                    <item AppInfo="Manza" ConceptLink="http://cdb.iso.org/lg/CDB-00132391-001">mzv</item>
+                                    <item AppInfo="Deg" ConceptLink="http://cdb.iso.org/lg/CDB-00132390-001">mzw</item>
+                                    <item AppInfo="Mawayana" ConceptLink="http://cdb.iso.org/lg/CDB-00132389-001">mzx</item>
+                                    <item AppInfo="Mozambican Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132388-001">mzy</item>
+                                    <item AppInfo="Maiadomu" ConceptLink="http://cdb.iso.org/lg/CDB-00132410-001">mzz</item>
+                                    <item AppInfo="Namla" ConceptLink="http://cdb.iso.org/lg/CDB-00132412-001">naa</item>
+                                    <item AppInfo="Southern NambikuÃ¡ra" ConceptLink="http://cdb.iso.org/lg/CDB-00132395-001">nab</item>
+                                    <item AppInfo="Narak" ConceptLink="http://cdb.iso.org/lg/CDB-00132417-001">nac</item>
+                                    <item AppInfo="Nijadali" ConceptLink="http://cdb.iso.org/lg/CDB-00132416-001">nad</item>
+                                    <item AppInfo="Naka'ela" ConceptLink="http://cdb.iso.org/lg/CDB-00132415-001">nae</item>
+                                    <item AppInfo="Nabak" ConceptLink="http://cdb.iso.org/lg/CDB-00132414-001">naf</item>
+                                    <item AppInfo="Naga Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00132413-001">nag</item>
+                                    <item AppInfo="Nalu" ConceptLink="http://cdb.iso.org/lg/CDB-00132403-001">naj</item>
+                                    <item AppInfo="Nakanai" ConceptLink="http://cdb.iso.org/lg/CDB-00132411-001">nak</item>
+                                    <item AppInfo="Nalik" ConceptLink="http://cdb.iso.org/lg/CDB-00132419-001">nal</item>
+                                    <item AppInfo="Nangikurrunggurr" ConceptLink="http://cdb.iso.org/lg/CDB-00132409-001">nam</item>
+                                    <item AppInfo="Min Nan Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00132408-001">nan</item>
+                                    <item AppInfo="Naaba" ConceptLink="http://cdb.iso.org/lg/CDB-00132407-001">nao</item>
+                                    <item AppInfo="Neapolitan" ConceptLink="http://cdb.iso.org/lg/CDB-00132406-001">nap</item>
+                                    <item AppInfo="Nama" ConceptLink="http://cdb.iso.org/lg/CDB-00132405-001">naq</item>
+                                    <item AppInfo="Iguta" ConceptLink="http://cdb.iso.org/lg/CDB-00132379-001">nar</item>
+                                    <item AppInfo="Naasioi" ConceptLink="http://cdb.iso.org/lg/CDB-00132418-001">nas</item>
+                                    <item AppInfo="Hungworo" ConceptLink="http://cdb.iso.org/lg/CDB-00132393-001">nat</item>
+                                    <item AppInfo="Nauruan" ConceptLink="http://cdb.iso.org/lg/CDB-00138575-001">nau</item>
+                                    <item AppInfo="Navajo; Navaho" ConceptLink="http://cdb.iso.org/lg/CDB-00138584-001">nav</item>
+                                    <item AppInfo="Nawuri" ConceptLink="http://cdb.iso.org/lg/CDB-00132369-001">naw</item>
+                                    <item AppInfo="Nakwi" ConceptLink="http://cdb.iso.org/lg/CDB-00132368-001">nax</item>
+                                    <item AppInfo="Narrinyeri" ConceptLink="http://cdb.iso.org/lg/CDB-00138285-001">nay</item>
+                                    <item AppInfo="Coatepec Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00132367-001">naz</item>
+                                    <item AppInfo="Nyemba" ConceptLink="http://cdb.iso.org/lg/CDB-00132366-001">nba</item>
+                                    <item AppInfo="Ndoe" ConceptLink="http://cdb.iso.org/lg/CDB-00132365-001">nbb</item>
+                                    <item AppInfo="Chang Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00132364-001">nbc</item>
+                                    <item AppInfo="Ngbinda" ConceptLink="http://cdb.iso.org/lg/CDB-00132355-001">nbd</item>
+                                    <item AppInfo="Konyak Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00132362-001">nbe</item>
+                                    <item AppInfo="Naxi" ConceptLink="http://cdb.iso.org/lg/CDB-00132370-001">nbf</item>
+                                    <item AppInfo="Nagarchal" ConceptLink="http://cdb.iso.org/lg/CDB-00132360-001">nbg</item>
+                                    <item AppInfo="Ngamo" ConceptLink="http://cdb.iso.org/lg/CDB-00132359-001">nbh</item>
+                                    <item AppInfo="Mao Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00132358-001">nbi</item>
+                                    <item AppInfo="Ngarinman" ConceptLink="http://cdb.iso.org/lg/CDB-00132357-001">nbj</item>
+                                    <item AppInfo="Nake" ConceptLink="http://cdb.iso.org/lg/CDB-00132377-001">nbk</item>
+                                    <item AppInfo="South Ndebele" ConceptLink="http://cdb.iso.org/lg/CDB-00138583-001">nbl</item>
+                                    <item AppInfo="Ngbaka Ma'bo" ConceptLink="http://cdb.iso.org/lg/CDB-00132361-001">nbm</item>
+                                    <item AppInfo="Kuri" ConceptLink="http://cdb.iso.org/lg/CDB-00132363-001">nbn</item>
+                                    <item AppInfo="Nkukoli" ConceptLink="http://cdb.iso.org/lg/CDB-00132385-001">nbo</item>
+                                    <item AppInfo="Nnam" ConceptLink="http://cdb.iso.org/lg/CDB-00132384-001">nbp</item>
+                                    <item AppInfo="Nggem" ConceptLink="http://cdb.iso.org/lg/CDB-00132383-001">nbq</item>
+                                    <item AppInfo="Numana-Nunku-Gbantu-Numbu" ConceptLink="http://cdb.iso.org/lg/CDB-00132382-001">nbr</item>
+                                    <item AppInfo="Namibian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00132381-001">nbs</item>
+                                    <item AppInfo="Na" ConceptLink="http://cdb.iso.org/lg/CDB-00132380-001">nbt</item>
+                                    <item AppInfo="Rongmei Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00132371-001">nbu</item>
+                                    <item AppInfo="Ngamambo" ConceptLink="http://cdb.iso.org/lg/CDB-00132378-001">nbv</item>
+                                    <item AppInfo="Southern Ngbandi" ConceptLink="http://cdb.iso.org/lg/CDB-00132386-001">nbw</item>
+                                    <item AppInfo="Ngura" ConceptLink="http://cdb.iso.org/lg/CDB-00132376-001">nbx</item>
+                                    <item AppInfo="Ningera" ConceptLink="http://cdb.iso.org/lg/CDB-00132375-001">nby</item>
+                                    <item AppInfo="Iyo" ConceptLink="http://cdb.iso.org/lg/CDB-00132374-001">nca</item>
+                                    <item AppInfo="Central Nicobarese" ConceptLink="http://cdb.iso.org/lg/CDB-00132373-001">ncb</item>
+                                    <item AppInfo="Ponam" ConceptLink="http://cdb.iso.org/lg/CDB-00132372-001">ncc</item>
+                                    <item AppInfo="Nachering" ConceptLink="http://cdb.iso.org/lg/CDB-00134464-001">ncd</item>
+                                    <item AppInfo="Yale" ConceptLink="http://cdb.iso.org/lg/CDB-00135354-001">nce</item>
+                                    <item AppInfo="Notsi" ConceptLink="http://cdb.iso.org/lg/CDB-00137102-001">ncf</item>
+                                    <item AppInfo="Nisga'a" ConceptLink="http://cdb.iso.org/lg/CDB-00137103-001">ncg</item>
+                                    <item AppInfo="Central Huasteca Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137104-001">nch</item>
+                                    <item AppInfo="Classical Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137870-001">nci</item>
+                                    <item AppInfo="Northern Puebla Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137105-001">ncj</item>
+                                    <item AppInfo="Nakara" ConceptLink="http://cdb.iso.org/lg/CDB-00137106-001">nck</item>
+                                    <item AppInfo="MichoacÃ¡n Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137107-001">ncl</item>
+                                    <item AppInfo="Nambo" ConceptLink="http://cdb.iso.org/lg/CDB-00137108-001">ncm</item>
+                                    <item AppInfo="Nauna" ConceptLink="http://cdb.iso.org/lg/CDB-00137109-001">ncn</item>
+                                    <item AppInfo="Sibe" ConceptLink="http://cdb.iso.org/lg/CDB-00137110-001">nco</item>
+                                    <item AppInfo="Ndaktup" ConceptLink="http://cdb.iso.org/lg/CDB-00137123-001">ncp</item>
+                                    <item AppInfo="Ncane" ConceptLink="http://cdb.iso.org/lg/CDB-00137112-001">ncr</item>
+                                    <item AppInfo="Nicaraguan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137101-001">ncs</item>
+                                    <item AppInfo="Chothe Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137114-001">nct</item>
+                                    <item AppInfo="Chumburung" ConceptLink="http://cdb.iso.org/lg/CDB-00137115-001">ncu</item>
+                                    <item AppInfo="Central Puebla Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137116-001">ncx</item>
+                                    <item AppInfo="Natchez" ConceptLink="http://cdb.iso.org/lg/CDB-00138249-001">ncz</item>
+                                    <item AppInfo="Ndasa" ConceptLink="http://cdb.iso.org/lg/CDB-00137117-001">nda</item>
+                                    <item AppInfo="Kenswei Nsei" ConceptLink="http://cdb.iso.org/lg/CDB-00137118-001">ndb</item>
+                                    <item AppInfo="Ndau" ConceptLink="http://cdb.iso.org/lg/CDB-00137119-001">ndc</item>
+                                    <item AppInfo="Nde-Nsele-Nta" ConceptLink="http://cdb.iso.org/lg/CDB-00137120-001">ndd</item>
+                                    <item AppInfo="North Ndebele" ConceptLink="http://cdb.iso.org/lg/CDB-00138577-001">nde</item>
+                                    <item AppInfo="Nadruvian" ConceptLink="http://cdb.iso.org/lg/CDB-00138286-001">ndf</item>
+                                    <item AppInfo="Ndengereko" ConceptLink="http://cdb.iso.org/lg/CDB-00137121-001">ndg</item>
+                                    <item AppInfo="Ndali" ConceptLink="http://cdb.iso.org/lg/CDB-00137090-001">ndh</item>
+                                    <item AppInfo="Samba Leko" ConceptLink="http://cdb.iso.org/lg/CDB-00137113-001">ndi</item>
+                                    <item AppInfo="Ndamba" ConceptLink="http://cdb.iso.org/lg/CDB-00137111-001">ndj</item>
+                                    <item AppInfo="Ndaka" ConceptLink="http://cdb.iso.org/lg/CDB-00137080-001">ndk</item>
+                                    <item AppInfo="Ndolo" ConceptLink="http://cdb.iso.org/lg/CDB-00137081-001">ndl</item>
+                                    <item AppInfo="Ndam" ConceptLink="http://cdb.iso.org/lg/CDB-00137082-001">ndm</item>
+                                    <item AppInfo="Ngundi" ConceptLink="http://cdb.iso.org/lg/CDB-00137083-001">ndn</item>
+                                    <item AppInfo="Ndonga" ConceptLink="http://cdb.iso.org/lg/CDB-00138579-001">ndo</item>
+                                    <item AppInfo="Ndo" ConceptLink="http://cdb.iso.org/lg/CDB-00137084-001">ndp</item>
+                                    <item AppInfo="Ndombe" ConceptLink="http://cdb.iso.org/lg/CDB-00137085-001">ndq</item>
+                                    <item AppInfo="Ndoola" ConceptLink="http://cdb.iso.org/lg/CDB-00137086-001">ndr</item>
+                                    <item AppInfo="Low German; Low Saxon" ConceptLink="http://cdb.iso.org/lg/CDB-00137087-001">nds</item>
+                                    <item AppInfo="Ndunga" ConceptLink="http://cdb.iso.org/lg/CDB-00137100-001">ndt</item>
+                                    <item AppInfo="Dugun" ConceptLink="http://cdb.iso.org/lg/CDB-00137089-001">ndu</item>
+                                    <item AppInfo="Ndut" ConceptLink="http://cdb.iso.org/lg/CDB-00137079-001">ndv</item>
+                                    <item AppInfo="Ndobo" ConceptLink="http://cdb.iso.org/lg/CDB-00137091-001">ndw</item>
+                                    <item AppInfo="Nduga" ConceptLink="http://cdb.iso.org/lg/CDB-00137092-001">ndx</item>
+                                    <item AppInfo="Lutos" ConceptLink="http://cdb.iso.org/lg/CDB-00137093-001">ndy</item>
+                                    <item AppInfo="Ndogo" ConceptLink="http://cdb.iso.org/lg/CDB-00137094-001">ndz</item>
+                                    <item AppInfo="Eastern Ngad'a" ConceptLink="http://cdb.iso.org/lg/CDB-00137095-001">nea</item>
+                                    <item AppInfo="Toura" ConceptLink="http://cdb.iso.org/lg/CDB-00137096-001">neb</item>
+                                    <item AppInfo="Nedebang" ConceptLink="http://cdb.iso.org/lg/CDB-00137097-001">nec</item>
+                                    <item AppInfo="Nde-Gbite" ConceptLink="http://cdb.iso.org/lg/CDB-00137098-001">ned</item>
+                                    <item AppInfo="Kumak" ConceptLink="http://cdb.iso.org/lg/CDB-00137099-001">nee</item>
+                                    <item AppInfo="Nefamese" ConceptLink="http://cdb.iso.org/lg/CDB-00137125-001">nef</item>
+                                    <item AppInfo="Negidal" ConceptLink="http://cdb.iso.org/lg/CDB-00137159-001">neg</item>
+                                    <item AppInfo="Nyenkha" ConceptLink="http://cdb.iso.org/lg/CDB-00137122-001">neh</item>
+                                    <item AppInfo="Neo-Hittite" ConceptLink="http://cdb.iso.org/lg/CDB-00138376-001">nei</item>
+                                    <item AppInfo="Neko" ConceptLink="http://cdb.iso.org/lg/CDB-00137149-001">nej</item>
+                                    <item AppInfo="Neku" ConceptLink="http://cdb.iso.org/lg/CDB-00137150-001">nek</item>
+                                    <item AppInfo="Nemi" ConceptLink="http://cdb.iso.org/lg/CDB-00137151-001">nem</item>
+                                    <item AppInfo="Nengone" ConceptLink="http://cdb.iso.org/lg/CDB-00137152-001">nen</item>
+                                    <item AppInfo="NÃ¡-Meo" ConceptLink="http://cdb.iso.org/lg/CDB-00137153-001">neo</item>
+                                    <item AppInfo="Nepali" ConceptLink="http://cdb.iso.org/lg/CDB-00138578-001">nep</item>
+                                    <item AppInfo="North Central Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00137154-001">neq</item>
+                                    <item AppInfo="Yahadian" ConceptLink="http://cdb.iso.org/lg/CDB-00137155-001">ner</item>
+                                    <item AppInfo="Bhoti Kinnauri" ConceptLink="http://cdb.iso.org/lg/CDB-00137156-001">nes</item>
+                                    <item AppInfo="Nete" ConceptLink="http://cdb.iso.org/lg/CDB-00137169-001">net</item>
+                                    <item AppInfo="Nyaheun" ConceptLink="http://cdb.iso.org/lg/CDB-00137158-001">nev</item>
+                                    <item AppInfo="Nepal Bhasa; Newari" ConceptLink="http://cdb.iso.org/lg/CDB-00137147-001">new</item>
+                                    <item AppInfo="Neme" ConceptLink="http://cdb.iso.org/lg/CDB-00137160-001">nex</item>
+                                    <item AppInfo="Neyo" ConceptLink="http://cdb.iso.org/lg/CDB-00137161-001">ney</item>
+                                    <item AppInfo="Nez Perce" ConceptLink="http://cdb.iso.org/lg/CDB-00137162-001">nez</item>
+                                    <item AppInfo="Dhao" ConceptLink="http://cdb.iso.org/lg/CDB-00137163-001">nfa</item>
+                                    <item AppInfo="Ahwai" ConceptLink="http://cdb.iso.org/lg/CDB-00137164-001">nfd</item>
+                                    <item AppInfo="Ayiwo" ConceptLink="http://cdb.iso.org/lg/CDB-00137165-001">nfl</item>
+                                    <item AppInfo="Nafaanra" ConceptLink="http://cdb.iso.org/lg/CDB-00137166-001">nfr</item>
+                                    <item AppInfo="Mfumte" ConceptLink="http://cdb.iso.org/lg/CDB-00137167-001">nfu</item>
+                                    <item AppInfo="Ngbaka" ConceptLink="http://cdb.iso.org/lg/CDB-00137168-001">nga</item>
+                                    <item AppInfo="Northern Ngbandi" ConceptLink="http://cdb.iso.org/lg/CDB-00137136-001">ngb</item>
+                                    <item AppInfo="Ngombe" ConceptLink="http://cdb.iso.org/lg/CDB-00137134-001">ngc</item>
+                                    <item AppInfo="Ngando" ConceptLink="http://cdb.iso.org/lg/CDB-00137157-001">ngd</item>
+                                    <item AppInfo="Ngemba" ConceptLink="http://cdb.iso.org/lg/CDB-00137126-001">nge</item>
+                                    <item AppInfo="Ngbaka Manza" ConceptLink="http://cdb.iso.org/lg/CDB-00137127-001">ngg</item>
+                                    <item AppInfo="N/u" ConceptLink="http://cdb.iso.org/lg/CDB-00137128-001">ngh</item>
+                                    <item AppInfo="Ngizim" ConceptLink="http://cdb.iso.org/lg/CDB-00137129-001">ngi</item>
+                                    <item AppInfo="Ngie" ConceptLink="http://cdb.iso.org/lg/CDB-00137130-001">ngj</item>
+                                    <item AppInfo="Ngalkbun" ConceptLink="http://cdb.iso.org/lg/CDB-00137131-001">ngk</item>
+                                    <item AppInfo="Lomwe" ConceptLink="http://cdb.iso.org/lg/CDB-00137132-001">ngl</item>
+                                    <item AppInfo="Ngatik Men's Creole" ConceptLink="http://cdb.iso.org/lg/CDB-00137133-001">ngm</item>
+                                    <item AppInfo="Ngwo" ConceptLink="http://cdb.iso.org/lg/CDB-00137146-001">ngn</item>
+                                    <item AppInfo="Ngoni" ConceptLink="http://cdb.iso.org/lg/CDB-00137135-001">ngo</item>
+                                    <item AppInfo="Ngulu" ConceptLink="http://cdb.iso.org/lg/CDB-00137124-001">ngp</item>
+                                    <item AppInfo="Ngurimi" ConceptLink="http://cdb.iso.org/lg/CDB-00137137-001">ngq</item>
+                                    <item AppInfo="Nanggu" ConceptLink="http://cdb.iso.org/lg/CDB-00137138-001">ngr</item>
+                                    <item AppInfo="Gvoko" ConceptLink="http://cdb.iso.org/lg/CDB-00137139-001">ngs</item>
+                                    <item AppInfo="Ngeq" ConceptLink="http://cdb.iso.org/lg/CDB-00137140-001">ngt</item>
+                                    <item AppInfo="Guerrero Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137141-001">ngu</item>
+                                    <item AppInfo="Nagumi" ConceptLink="http://cdb.iso.org/lg/CDB-00138097-001">ngv</item>
+                                    <item AppInfo="Ngwaba" ConceptLink="http://cdb.iso.org/lg/CDB-00137142-001">ngw</item>
+                                    <item AppInfo="Nggwahyi" ConceptLink="http://cdb.iso.org/lg/CDB-00137143-001">ngx</item>
+                                    <item AppInfo="Tibea" ConceptLink="http://cdb.iso.org/lg/CDB-00137144-001">ngy</item>
+                                    <item AppInfo="Ngungwel" ConceptLink="http://cdb.iso.org/lg/CDB-00137145-001">ngz</item>
+                                    <item AppInfo="Nhanda" ConceptLink="http://cdb.iso.org/lg/CDB-00137057-001">nha</item>
+                                    <item AppInfo="Beng" ConceptLink="http://cdb.iso.org/lg/CDB-00136997-001">nhb</item>
+                                    <item AppInfo="Tabasco Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00138031-001">nhc</item>
+                                    <item AppInfo="ChiripÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00137088-001">nhd</item>
+                                    <item AppInfo="Eastern Huasteca Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137012-001">nhe</item>
+                                    <item AppInfo="Nhuwala" ConceptLink="http://cdb.iso.org/lg/CDB-00137013-001">nhf</item>
+                                    <item AppInfo="Tetelcingo Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137014-001">nhg</item>
+                                    <item AppInfo="Nahari" ConceptLink="http://cdb.iso.org/lg/CDB-00137015-001">nhh</item>
+                                    <item AppInfo="ZacatlÃ¡n-AhuacatlÃ¡n-Tepetzintla Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137016-001">nhi</item>
+                                    <item AppInfo="Isthmus-Cosoleacaque Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137017-001">nhk</item>
+                                    <item AppInfo="Morelos Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137018-001">nhm</item>
+                                    <item AppInfo="Central Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137019-001">nhn</item>
+                                    <item AppInfo="Takuu" ConceptLink="http://cdb.iso.org/lg/CDB-00137032-001">nho</item>
+                                    <item AppInfo="Isthmus-Pajapan Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137021-001">nhp</item>
+                                    <item AppInfo="Huaxcaleca Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137010-001">nhq</item>
+                                    <item AppInfo="Naro" ConceptLink="http://cdb.iso.org/lg/CDB-00137023-001">nhr</item>
+                                    <item AppInfo="Ometepec Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137024-001">nht</item>
+                                    <item AppInfo="Noone" ConceptLink="http://cdb.iso.org/lg/CDB-00137025-001">nhu</item>
+                                    <item AppInfo="Temascaltepec Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137026-001">nhv</item>
+                                    <item AppInfo="Western Huasteca Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137027-001">nhw</item>
+                                    <item AppInfo="Isthmus-Mecayapan Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137028-001">nhx</item>
+                                    <item AppInfo="Northern Oaxaca Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137029-001">nhy</item>
+                                    <item AppInfo="Santa MarÃ­a La Alta Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137030-001">nhz</item>
+                                    <item AppInfo="Nias" ConceptLink="http://cdb.iso.org/lg/CDB-00136999-001">nia</item>
+                                    <item AppInfo="Nakama" ConceptLink="http://cdb.iso.org/lg/CDB-00137022-001">nib</item>
+                                    <item AppInfo="Ngandi" ConceptLink="http://cdb.iso.org/lg/CDB-00137980-001">nid</item>
+                                    <item AppInfo="Niellim" ConceptLink="http://cdb.iso.org/lg/CDB-00137020-001">nie</item>
+                                    <item AppInfo="Nek" ConceptLink="http://cdb.iso.org/lg/CDB-00136989-001">nif</item>
+                                    <item AppInfo="Ngalakan" ConceptLink="http://cdb.iso.org/lg/CDB-00136990-001">nig</item>
+                                    <item AppInfo="Nyiha" ConceptLink="http://cdb.iso.org/lg/CDB-00136991-001">nih</item>
+                                    <item AppInfo="Nii" ConceptLink="http://cdb.iso.org/lg/CDB-00136992-001">nii</item>
+                                    <item AppInfo="Ngaju" ConceptLink="http://cdb.iso.org/lg/CDB-00136993-001">nij</item>
+                                    <item AppInfo="Southern Nicobarese" ConceptLink="http://cdb.iso.org/lg/CDB-00136994-001">nik</item>
+                                    <item AppInfo="Nila" ConceptLink="http://cdb.iso.org/lg/CDB-00136995-001">nil</item>
+                                    <item AppInfo="Nilamba" ConceptLink="http://cdb.iso.org/lg/CDB-00136996-001">nim</item>
+                                    <item AppInfo="Ninzo" ConceptLink="http://cdb.iso.org/lg/CDB-00137009-001">nin</item>
+                                    <item AppInfo="Nganasan" ConceptLink="http://cdb.iso.org/lg/CDB-00136998-001">nio</item>
+                                    <item AppInfo="Nandi" ConceptLink="http://cdb.iso.org/lg/CDB-00136988-001">niq</item>
+                                    <item AppInfo="Nimboran" ConceptLink="http://cdb.iso.org/lg/CDB-00137000-001">nir</item>
+                                    <item AppInfo="Nimi" ConceptLink="http://cdb.iso.org/lg/CDB-00137001-001">nis</item>
+                                    <item AppInfo="Southeastern Kolami" ConceptLink="http://cdb.iso.org/lg/CDB-00137002-001">nit</item>
+                                    <item AppInfo="Niuean" ConceptLink="http://cdb.iso.org/lg/CDB-00137003-001">niu</item>
+                                    <item AppInfo="Gilyak" ConceptLink="http://cdb.iso.org/lg/CDB-00137004-001">niv</item>
+                                    <item AppInfo="Nimo" ConceptLink="http://cdb.iso.org/lg/CDB-00137005-001">niw</item>
+                                    <item AppInfo="Hema" ConceptLink="http://cdb.iso.org/lg/CDB-00137006-001">nix</item>
+                                    <item AppInfo="Ngiti" ConceptLink="http://cdb.iso.org/lg/CDB-00137007-001">niy</item>
+                                    <item AppInfo="Ningil" ConceptLink="http://cdb.iso.org/lg/CDB-00137008-001">niz</item>
+                                    <item AppInfo="Nzanyi" ConceptLink="http://cdb.iso.org/lg/CDB-00137034-001">nja</item>
+                                    <item AppInfo="Nocte Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137068-001">njb</item>
+                                    <item AppInfo="Ndonde Hamba" ConceptLink="http://cdb.iso.org/lg/CDB-00137031-001">njd</item>
+                                    <item AppInfo="Lotha Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137058-001">njh</item>
+                                    <item AppInfo="Gudanji" ConceptLink="http://cdb.iso.org/lg/CDB-00137059-001">nji</item>
+                                    <item AppInfo="Njen" ConceptLink="http://cdb.iso.org/lg/CDB-00137060-001">njj</item>
+                                    <item AppInfo="Njalgulgule" ConceptLink="http://cdb.iso.org/lg/CDB-00137061-001">njl</item>
+                                    <item AppInfo="Angami Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137062-001">njm</item>
+                                    <item AppInfo="Liangmai Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137063-001">njn</item>
+                                    <item AppInfo="Ao Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137064-001">njo</item>
+                                    <item AppInfo="Njerep" ConceptLink="http://cdb.iso.org/lg/CDB-00137065-001">njr</item>
+                                    <item AppInfo="Nisa" ConceptLink="http://cdb.iso.org/lg/CDB-00137078-001">njs</item>
+                                    <item AppInfo="Ndyuka-Trio Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00137067-001">njt</item>
+                                    <item AppInfo="Ngadjunmaya" ConceptLink="http://cdb.iso.org/lg/CDB-00137056-001">nju</item>
+                                    <item AppInfo="Kunyi" ConceptLink="http://cdb.iso.org/lg/CDB-00137069-001">njx</item>
+                                    <item AppInfo="Njyem" ConceptLink="http://cdb.iso.org/lg/CDB-00137070-001">njy</item>
+                                    <item AppInfo="Nkoya" ConceptLink="http://cdb.iso.org/lg/CDB-00137071-001">nka</item>
+                                    <item AppInfo="Khoibu Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137072-001">nkb</item>
+                                    <item AppInfo="Nkongho" ConceptLink="http://cdb.iso.org/lg/CDB-00137073-001">nkc</item>
+                                    <item AppInfo="Koireng" ConceptLink="http://cdb.iso.org/lg/CDB-00137074-001">nkd</item>
+                                    <item AppInfo="Duke" ConceptLink="http://cdb.iso.org/lg/CDB-00137075-001">nke</item>
+                                    <item AppInfo="Inpui Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137076-001">nkf</item>
+                                    <item AppInfo="Nekgini" ConceptLink="http://cdb.iso.org/lg/CDB-00137077-001">nkg</item>
+                                    <item AppInfo="Khezha Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137045-001">nkh</item>
+                                    <item AppInfo="Thangal Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137043-001">nki</item>
+                                    <item AppInfo="Nakai" ConceptLink="http://cdb.iso.org/lg/CDB-00137066-001">nkj</item>
+                                    <item AppInfo="Nokuku" ConceptLink="http://cdb.iso.org/lg/CDB-00137035-001">nkk</item>
+                                    <item AppInfo="Namat" ConceptLink="http://cdb.iso.org/lg/CDB-00137036-001">nkm</item>
+                                    <item AppInfo="Nkangala" ConceptLink="http://cdb.iso.org/lg/CDB-00137037-001">nkn</item>
+                                    <item AppInfo="Nkonya" ConceptLink="http://cdb.iso.org/lg/CDB-00137038-001">nko</item>
+                                    <item AppInfo="Niuatoputapu" ConceptLink="http://cdb.iso.org/lg/CDB-00138033-001">nkp</item>
+                                    <item AppInfo="Nukuoro" ConceptLink="http://cdb.iso.org/lg/CDB-00137039-001">nkr</item>
+                                    <item AppInfo="North Asmat" ConceptLink="http://cdb.iso.org/lg/CDB-00137040-001">nks</item>
+                                    <item AppInfo="Nyika" ConceptLink="http://cdb.iso.org/lg/CDB-00137041-001">nkt</item>
+                                    <item AppInfo="Bouna Kulango" ConceptLink="http://cdb.iso.org/lg/CDB-00137042-001">nku</item>
+                                    <item AppInfo="Nyika" ConceptLink="http://cdb.iso.org/lg/CDB-00137055-001">nkv</item>
+                                    <item AppInfo="Nkutu" ConceptLink="http://cdb.iso.org/lg/CDB-00137044-001">nkw</item>
+                                    <item AppInfo="Nkoroo" ConceptLink="http://cdb.iso.org/lg/CDB-00137033-001">nkx</item>
+                                    <item AppInfo="Nkari" ConceptLink="http://cdb.iso.org/lg/CDB-00137046-001">nkz</item>
+                                    <item AppInfo="Ngombale" ConceptLink="http://cdb.iso.org/lg/CDB-00137047-001">nla</item>
+                                    <item AppInfo="Nalca" ConceptLink="http://cdb.iso.org/lg/CDB-00137048-001">nlc</item>
+                                    <item AppInfo="Dutch" ConceptLink="http://cdb.iso.org/lg/CDB-00138580-001">nld</item>
+                                    <item AppInfo="East Nyala" ConceptLink="http://cdb.iso.org/lg/CDB-00137049-001">nle</item>
+                                    <item AppInfo="Gela" ConceptLink="http://cdb.iso.org/lg/CDB-00137050-001">nlg</item>
+                                    <item AppInfo="Grangali" ConceptLink="http://cdb.iso.org/lg/CDB-00137051-001">nli</item>
+                                    <item AppInfo="Nyali" ConceptLink="http://cdb.iso.org/lg/CDB-00137052-001">nlj</item>
+                                    <item AppInfo="Ninia Yali" ConceptLink="http://cdb.iso.org/lg/CDB-00137053-001">nlk</item>
+                                    <item AppInfo="Nihali" ConceptLink="http://cdb.iso.org/lg/CDB-00137054-001">nll</item>
+                                    <item AppInfo="Durango Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137179-001">nln</item>
+                                    <item AppInfo="Ngul" ConceptLink="http://cdb.iso.org/lg/CDB-00137328-001">nlo</item>
+                                    <item AppInfo="Ngarla" ConceptLink="http://cdb.iso.org/lg/CDB-00137148-001">nlr</item>
+                                    <item AppInfo="Nchumbulu" ConceptLink="http://cdb.iso.org/lg/CDB-00137286-001">nlu</item>
+                                    <item AppInfo="Orizaba Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137287-001">nlv</item>
+                                    <item AppInfo="Nahali" ConceptLink="http://cdb.iso.org/lg/CDB-00137288-001">nlx</item>
+                                    <item AppInfo="Nyamal" ConceptLink="http://cdb.iso.org/lg/CDB-00137289-001">nly</item>
+                                    <item AppInfo="NalÃ¶go" ConceptLink="http://cdb.iso.org/lg/CDB-00137290-001">nlz</item>
+                                    <item AppInfo="Maram Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137291-001">nma</item>
+                                    <item AppInfo="Big Nambas" ConceptLink="http://cdb.iso.org/lg/CDB-00137292-001">nmb</item>
+                                    <item AppInfo="Ngam" ConceptLink="http://cdb.iso.org/lg/CDB-00137293-001">nmc</item>
+                                    <item AppInfo="Ndumu" ConceptLink="http://cdb.iso.org/lg/CDB-00137306-001">nmd</item>
+                                    <item AppInfo="Mzieme Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137295-001">nme</item>
+                                    <item AppInfo="Tangkhul Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137284-001">nmf</item>
+                                    <item AppInfo="Kwasio" ConceptLink="http://cdb.iso.org/lg/CDB-00137297-001">nmg</item>
+                                    <item AppInfo="Monsang Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137298-001">nmh</item>
+                                    <item AppInfo="Nyam" ConceptLink="http://cdb.iso.org/lg/CDB-00137299-001">nmi</item>
+                                    <item AppInfo="Ngombe" ConceptLink="http://cdb.iso.org/lg/CDB-00137300-001">nmj</item>
+                                    <item AppInfo="Namakura" ConceptLink="http://cdb.iso.org/lg/CDB-00137301-001">nmk</item>
+                                    <item AppInfo="Ndemli" ConceptLink="http://cdb.iso.org/lg/CDB-00137302-001">nml</item>
+                                    <item AppInfo="Manangba" ConceptLink="http://cdb.iso.org/lg/CDB-00137303-001">nmm</item>
+                                    <item AppInfo="!XÃ³Å" ConceptLink="http://cdb.iso.org/lg/CDB-00137304-001">nmn</item>
+                                    <item AppInfo="Moyon Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137305-001">nmo</item>
+                                    <item AppInfo="Nimanbur" ConceptLink="http://cdb.iso.org/lg/CDB-00137273-001">nmp</item>
+                                    <item AppInfo="Nambya" ConceptLink="http://cdb.iso.org/lg/CDB-00137271-001">nmq</item>
+                                    <item AppInfo="Nimbari" ConceptLink="http://cdb.iso.org/lg/CDB-00137294-001">nmr</item>
+                                    <item AppInfo="Letemboi" ConceptLink="http://cdb.iso.org/lg/CDB-00137263-001">nms</item>
+                                    <item AppInfo="Namonuito" ConceptLink="http://cdb.iso.org/lg/CDB-00137264-001">nmt</item>
+                                    <item AppInfo="Northeast Maidu" ConceptLink="http://cdb.iso.org/lg/CDB-00137265-001">nmu</item>
+                                    <item AppInfo="Ngamini" ConceptLink="http://cdb.iso.org/lg/CDB-00137266-001">nmv</item>
+                                    <item AppInfo="Nimoa" ConceptLink="http://cdb.iso.org/lg/CDB-00137267-001">nmw</item>
+                                    <item AppInfo="Nama" ConceptLink="http://cdb.iso.org/lg/CDB-00137268-001">nmx</item>
+                                    <item AppInfo="Namuyi" ConceptLink="http://cdb.iso.org/lg/CDB-00137269-001">nmy</item>
+                                    <item AppInfo="Nawdm" ConceptLink="http://cdb.iso.org/lg/CDB-00137270-001">nmz</item>
+                                    <item AppInfo="Nyangumarta" ConceptLink="http://cdb.iso.org/lg/CDB-00137283-001">nna</item>
+                                    <item AppInfo="Nande" ConceptLink="http://cdb.iso.org/lg/CDB-00137272-001">nnb</item>
+                                    <item AppInfo="Nancere" ConceptLink="http://cdb.iso.org/lg/CDB-00137261-001">nnc</item>
+                                    <item AppInfo="West Ambae" ConceptLink="http://cdb.iso.org/lg/CDB-00137274-001">nnd</item>
+                                    <item AppInfo="Ngandyera" ConceptLink="http://cdb.iso.org/lg/CDB-00137275-001">nne</item>
+                                    <item AppInfo="Ngaing" ConceptLink="http://cdb.iso.org/lg/CDB-00137276-001">nnf</item>
+                                    <item AppInfo="Maring Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137277-001">nng</item>
+                                    <item AppInfo="Ngiemboon" ConceptLink="http://cdb.iso.org/lg/CDB-00137278-001">nnh</item>
+                                    <item AppInfo="North Nuaulu" ConceptLink="http://cdb.iso.org/lg/CDB-00137279-001">nni</item>
+                                    <item AppInfo="Nyangatom" ConceptLink="http://cdb.iso.org/lg/CDB-00137280-001">nnj</item>
+                                    <item AppInfo="Nankina" ConceptLink="http://cdb.iso.org/lg/CDB-00137281-001">nnk</item>
+                                    <item AppInfo="Northern Rengma Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137308-001">nnl</item>
+                                    <item AppInfo="Namia" ConceptLink="http://cdb.iso.org/lg/CDB-00137262-001">nnm</item>
+                                    <item AppInfo="Ngete" ConceptLink="http://cdb.iso.org/lg/CDB-00137296-001">nnn</item>
+                                    <item AppInfo="Norwegian Nynorsk" ConceptLink="http://cdb.iso.org/lg/CDB-00138581-001">nno</item>
+                                    <item AppInfo="Wancho Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137331-001">nnp</item>
+                                    <item AppInfo="Ngindo" ConceptLink="http://cdb.iso.org/lg/CDB-00137332-001">nnq</item>
+                                    <item AppInfo="Narungga" ConceptLink="http://cdb.iso.org/lg/CDB-00137946-001">nnr</item>
+                                    <item AppInfo="Ningye" ConceptLink="http://cdb.iso.org/lg/CDB-00137333-001">nns</item>
+                                    <item AppInfo="Nanticoke" ConceptLink="http://cdb.iso.org/lg/CDB-00137949-001">nnt</item>
+                                    <item AppInfo="Dwang" ConceptLink="http://cdb.iso.org/lg/CDB-00137334-001">nnu</item>
+                                    <item AppInfo="Nugunu" ConceptLink="http://cdb.iso.org/lg/CDB-00137916-001">nnv</item>
+                                    <item AppInfo="Southern Nuni" ConceptLink="http://cdb.iso.org/lg/CDB-00137335-001">nnw</item>
+                                    <item AppInfo="Ngong" ConceptLink="http://cdb.iso.org/lg/CDB-00137336-001">nnx</item>
+                                    <item AppInfo="Nyangga" ConceptLink="http://cdb.iso.org/lg/CDB-00137337-001">nny</item>
+                                    <item AppInfo="Nda'nda'" ConceptLink="http://cdb.iso.org/lg/CDB-00137338-001">nnz</item>
+                                    <item AppInfo="Woun Meu" ConceptLink="http://cdb.iso.org/lg/CDB-00137339-001">noa</item>
+                                    <item AppInfo="Norwegian BokmÃ¥l" ConceptLink="http://cdb.iso.org/lg/CDB-00138576-001">nob</item>
+                                    <item AppInfo="Nuk" ConceptLink="http://cdb.iso.org/lg/CDB-00137352-001">noc</item>
+                                    <item AppInfo="Northern Thai" ConceptLink="http://cdb.iso.org/lg/CDB-00137341-001">nod</item>
+                                    <item AppInfo="Nimadi" ConceptLink="http://cdb.iso.org/lg/CDB-00137330-001">noe</item>
+                                    <item AppInfo="Nomane" ConceptLink="http://cdb.iso.org/lg/CDB-00137695-001">nof</item>
+                                    <item AppInfo="Nogai" ConceptLink="http://cdb.iso.org/lg/CDB-00137344-001">nog</item>
+                                    <item AppInfo="Nomu" ConceptLink="http://cdb.iso.org/lg/CDB-00137285-001">noh</item>
+                                    <item AppInfo="Noiri" ConceptLink="http://cdb.iso.org/lg/CDB-00137346-001">noi</item>
+                                    <item AppInfo="Nooksack" ConceptLink="http://cdb.iso.org/lg/CDB-00137921-001">nok</item>
+                                    <item AppInfo="NocamÃ¡n" ConceptLink="http://cdb.iso.org/lg/CDB-00137915-001">nom</item>
+                                    <item AppInfo="Old Norse" ConceptLink="http://cdb.iso.org/lg/CDB-00137869-001">non</item>
+                                    <item AppInfo="Nootka" ConceptLink="http://cdb.iso.org/lg/CDB-00137347-001">noo</item>
+                                    <item AppInfo="Numanggang" ConceptLink="http://cdb.iso.org/lg/CDB-00137348-001">nop</item>
+                                    <item AppInfo="Ngongo" ConceptLink="http://cdb.iso.org/lg/CDB-00137349-001">noq</item>
+                                    <item AppInfo="Norwegian" ConceptLink="http://cdb.iso.org/lg/CDB-00138582-001">nor</item>
+                                    <item AppInfo="Eastern Nisu" ConceptLink="http://cdb.iso.org/lg/CDB-00137350-001">nos</item>
+                                    <item AppInfo="Nomatsiguenga" ConceptLink="http://cdb.iso.org/lg/CDB-00137351-001">not</item>
+                                    <item AppInfo="Ewage-Notu" ConceptLink="http://cdb.iso.org/lg/CDB-00137319-001">nou</item>
+                                    <item AppInfo="Novial" ConceptLink="http://cdb.iso.org/lg/CDB-00138347-001">nov</item>
+                                    <item AppInfo="Nyambo" ConceptLink="http://cdb.iso.org/lg/CDB-00137317-001">now</item>
+                                    <item AppInfo="Noy" ConceptLink="http://cdb.iso.org/lg/CDB-00137340-001">noy</item>
+                                    <item AppInfo="Nayi" ConceptLink="http://cdb.iso.org/lg/CDB-00137309-001">noz</item>
+                                    <item AppInfo="Nar Phu" ConceptLink="http://cdb.iso.org/lg/CDB-00137310-001">npa</item>
+                                    <item AppInfo="Nupbikha" ConceptLink="http://cdb.iso.org/lg/CDB-00137311-001">npb</item>
+                                    <item AppInfo="Phom Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137312-001">nph</item>
+                                    <item AppInfo="Southeastern Puebla Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137313-001">npl</item>
+                                    <item AppInfo="Mondropolon" ConceptLink="http://cdb.iso.org/lg/CDB-00137314-001">npn</item>
+                                    <item AppInfo="Pochuri Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137315-001">npo</item>
+                                    <item AppInfo="Nipsan" ConceptLink="http://cdb.iso.org/lg/CDB-00137316-001">nps</item>
+                                    <item AppInfo="Puimei Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137329-001">npu</item>
+                                    <item AppInfo="Napu" ConceptLink="http://cdb.iso.org/lg/CDB-00137318-001">npy</item>
+                                    <item AppInfo="Ede Nago" ConceptLink="http://cdb.iso.org/lg/CDB-00137307-001">nqg</item>
+                                    <item AppInfo="Kura Ede Nago" ConceptLink="http://cdb.iso.org/lg/CDB-00137320-001">nqk</item>
+                                    <item AppInfo="Ndom" ConceptLink="http://cdb.iso.org/lg/CDB-00137321-001">nqm</item>
+                                    <item AppInfo="Nen" ConceptLink="http://cdb.iso.org/lg/CDB-00137322-001">nqn</item>
+                                    <item AppInfo="N'Ko" ConceptLink="http://cdb.iso.org/lg/CDB-00137323-001">nqo</item>
+                                    <item AppInfo="Ngom" ConceptLink="http://cdb.iso.org/lg/CDB-00137324-001">nra</item>
+                                    <item AppInfo="Nara" ConceptLink="http://cdb.iso.org/lg/CDB-00137325-001">nrb</item>
+                                    <item AppInfo="Noric" ConceptLink="http://cdb.iso.org/lg/CDB-00138385-001">nrc</item>
+                                    <item AppInfo="Southern Rengma Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137326-001">nre</item>
+                                    <item AppInfo="Narango" ConceptLink="http://cdb.iso.org/lg/CDB-00137327-001">nrg</item>
+                                    <item AppInfo="Chokri Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137239-001">nri</item>
+                                    <item AppInfo="Ngarluma" ConceptLink="http://cdb.iso.org/lg/CDB-00137342-001">nrl</item>
+                                    <item AppInfo="Narom" ConceptLink="http://cdb.iso.org/lg/CDB-00137282-001">nrm</item>
+                                    <item AppInfo="Norn" ConceptLink="http://cdb.iso.org/lg/CDB-00137998-001">nrn</item>
+                                    <item AppInfo="North Picene" ConceptLink="http://cdb.iso.org/lg/CDB-00138381-001">nrp</item>
+                                    <item AppInfo="Norra" ConceptLink="http://cdb.iso.org/lg/CDB-00137193-001">nrr</item>
+                                    <item AppInfo="Northern Kalapuya" ConceptLink="http://cdb.iso.org/lg/CDB-00137960-001">nrt</item>
+                                    <item AppInfo="Ngurmbur" ConceptLink="http://cdb.iso.org/lg/CDB-00137194-001">nrx</item>
+                                    <item AppInfo="Lala" ConceptLink="http://cdb.iso.org/lg/CDB-00137195-001">nrz</item>
+                                    <item AppInfo="Sangtam Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137196-001">nsa</item>
+                                    <item AppInfo="Nshi" ConceptLink="http://cdb.iso.org/lg/CDB-00137197-001">nsc</item>
+                                    <item AppInfo="Southern Nisu" ConceptLink="http://cdb.iso.org/lg/CDB-00137198-001">nsd</item>
+                                    <item AppInfo="Nsenga" ConceptLink="http://cdb.iso.org/lg/CDB-00137199-001">nse</item>
+                                    <item AppInfo="Ngasa" ConceptLink="http://cdb.iso.org/lg/CDB-00137200-001">nsg</item>
+                                    <item AppInfo="Ngoshie" ConceptLink="http://cdb.iso.org/lg/CDB-00137201-001">nsh</item>
+                                    <item AppInfo="Nigerian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137214-001">nsi</item>
+                                    <item AppInfo="Naskapi" ConceptLink="http://cdb.iso.org/lg/CDB-00137203-001">nsk</item>
+                                    <item AppInfo="Norwegian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137192-001">nsl</item>
+                                    <item AppInfo="Sumi Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137205-001">nsm</item>
+                                    <item AppInfo="Nehan" ConceptLink="http://cdb.iso.org/lg/CDB-00137206-001">nsn</item>
+                                    <item AppInfo="Pedi; Sepedi; Northern Sotho" ConceptLink="http://cdb.iso.org/lg/CDB-00137207-001">nso</item>
+                                    <item AppInfo="Nepalese Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137208-001">nsp</item>
+                                    <item AppInfo="Northern Sierra Miwok" ConceptLink="http://cdb.iso.org/lg/CDB-00137209-001">nsq</item>
+                                    <item AppInfo="Maritime Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137210-001">nsr</item>
+                                    <item AppInfo="Nali" ConceptLink="http://cdb.iso.org/lg/CDB-00137211-001">nss</item>
+                                    <item AppInfo="Tase Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00137212-001">nst</item>
+                                    <item AppInfo="Sierra Negra Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00137181-001">nsu</item>
+                                    <item AppInfo="Southwestern Nisu" ConceptLink="http://cdb.iso.org/lg/CDB-00137204-001">nsv</item>
+                                    <item AppInfo="Navut" ConceptLink="http://cdb.iso.org/lg/CDB-00137202-001">nsw</item>
+                                    <item AppInfo="Nsongo" ConceptLink="http://cdb.iso.org/lg/CDB-00137171-001">nsx</item>
+                                    <item AppInfo="Nasal" ConceptLink="http://cdb.iso.org/lg/CDB-00137172-001">nsy</item>
+                                    <item AppInfo="Nisenan" ConceptLink="http://cdb.iso.org/lg/CDB-00137173-001">nsz</item>
+                                    <item AppInfo="Nathembo" ConceptLink="http://cdb.iso.org/lg/CDB-00137174-001">nte</item>
+                                    <item AppInfo="Natioro" ConceptLink="http://cdb.iso.org/lg/CDB-00137175-001">nti</item>
+                                    <item AppInfo="Ngaanyatjarra" ConceptLink="http://cdb.iso.org/lg/CDB-00137176-001">ntj</item>
+                                    <item AppInfo="Ikoma-Nata-Isenye" ConceptLink="http://cdb.iso.org/lg/CDB-00137177-001">ntk</item>
+                                    <item AppInfo="Nateni" ConceptLink="http://cdb.iso.org/lg/CDB-00137178-001">ntm</item>
+                                    <item AppInfo="Ntomba" ConceptLink="http://cdb.iso.org/lg/CDB-00137191-001">nto</item>
+                                    <item AppInfo="Northern Tepehuan" ConceptLink="http://cdb.iso.org/lg/CDB-00137180-001">ntp</item>
+                                    <item AppInfo="Delo" ConceptLink="http://cdb.iso.org/lg/CDB-00137170-001">ntr</item>
+                                    <item AppInfo="Natagaimas" ConceptLink="http://cdb.iso.org/lg/CDB-00138297-001">nts</item>
+                                    <item AppInfo="NatÃŒgu" ConceptLink="http://cdb.iso.org/lg/CDB-00137182-001">ntu</item>
+                                    <item AppInfo="Nottoway" ConceptLink="http://cdb.iso.org/lg/CDB-00138300-001">ntw</item>
+                                    <item AppInfo="Mantsi" ConceptLink="http://cdb.iso.org/lg/CDB-00137183-001">nty</item>
+                                    <item AppInfo="Natanzi" ConceptLink="http://cdb.iso.org/lg/CDB-00137184-001">ntz</item>
+                                    <item AppInfo="Yuaga" ConceptLink="http://cdb.iso.org/lg/CDB-00137185-001">nua</item>
+                                    <item AppInfo="Nukuini" ConceptLink="http://cdb.iso.org/lg/CDB-00137982-001">nuc</item>
+                                    <item AppInfo="Ngala" ConceptLink="http://cdb.iso.org/lg/CDB-00131513-001">nud</item>
+                                    <item AppInfo="Ngundu" ConceptLink="http://cdb.iso.org/lg/CDB-00131521-001">nue</item>
+                                    <item AppInfo="Nusu" ConceptLink="http://cdb.iso.org/lg/CDB-00131511-001">nuf</item>
+                                    <item AppInfo="Nungali" ConceptLink="http://cdb.iso.org/lg/CDB-00131510-001">nug</item>
+                                    <item AppInfo="Ndunda" ConceptLink="http://cdb.iso.org/lg/CDB-00131509-001">nuh</item>
+                                    <item AppInfo="Ngumbi" ConceptLink="http://cdb.iso.org/lg/CDB-00131508-001">nui</item>
+                                    <item AppInfo="Nyole" ConceptLink="http://cdb.iso.org/lg/CDB-00131528-001">nuj</item>
+                                    <item AppInfo="Nusa Laut" ConceptLink="http://cdb.iso.org/lg/CDB-00131512-001">nul</item>
+                                    <item AppInfo="Niuafo'ou" ConceptLink="http://cdb.iso.org/lg/CDB-00131514-001">num</item>
+                                    <item AppInfo="Nung" ConceptLink="http://cdb.iso.org/lg/CDB-00131536-001">nun</item>
+                                    <item AppInfo="NguÃŽn" ConceptLink="http://cdb.iso.org/lg/CDB-00131535-001">nuo</item>
+                                    <item AppInfo="Nupe-Nupe-Tako" ConceptLink="http://cdb.iso.org/lg/CDB-00131534-001">nup</item>
+                                    <item AppInfo="Nukumanu" ConceptLink="http://cdb.iso.org/lg/CDB-00131533-001">nuq</item>
+                                    <item AppInfo="Nukuria" ConceptLink="http://cdb.iso.org/lg/CDB-00131532-001">nur</item>
+                                    <item AppInfo="Nuer" ConceptLink="http://cdb.iso.org/lg/CDB-00131531-001">nus</item>
+                                    <item AppInfo="Nung" ConceptLink="http://cdb.iso.org/lg/CDB-00131522-001">nut</item>
+                                    <item AppInfo="Ngbundu" ConceptLink="http://cdb.iso.org/lg/CDB-00131529-001">nuu</item>
+                                    <item AppInfo="Northern Nuni" ConceptLink="http://cdb.iso.org/lg/CDB-00131537-001">nuv</item>
+                                    <item AppInfo="Nguluwan" ConceptLink="http://cdb.iso.org/lg/CDB-00131527-001">nuw</item>
+                                    <item AppInfo="Mehek" ConceptLink="http://cdb.iso.org/lg/CDB-00131526-001">nux</item>
+                                    <item AppInfo="Nunggubuyu" ConceptLink="http://cdb.iso.org/lg/CDB-00131525-001">nuy</item>
+                                    <item AppInfo="Tlamacazapa Nahuatl" ConceptLink="http://cdb.iso.org/lg/CDB-00131524-001">nuz</item>
+                                    <item AppInfo="Nasarian" ConceptLink="http://cdb.iso.org/lg/CDB-00131572-001">nvh</item>
+                                    <item AppInfo="Namiae" ConceptLink="http://cdb.iso.org/lg/CDB-00131507-001">nvm</item>
+                                    <item AppInfo="Nawathinehena" ConceptLink="http://cdb.iso.org/lg/CDB-00138019-001">nwa</item>
+                                    <item AppInfo="Nyabwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131555-001">nwb</item>
+                                    <item AppInfo="Classical Newari; Old Newari; Classical Nepal Bhasa" ConceptLink="http://cdb.iso.org/lg/CDB-00137883-001">nwc</item>
+                                    <item AppInfo="Ngwe" ConceptLink="http://cdb.iso.org/lg/CDB-00131617-001">nwe</item>
+                                    <item AppInfo="Southwest Tanna" ConceptLink="http://cdb.iso.org/lg/CDB-00131616-001">nwi</item>
+                                    <item AppInfo="Nyamusa-Molo" ConceptLink="http://cdb.iso.org/lg/CDB-00131615-001">nwm</item>
+                                    <item AppInfo="Nawaru" ConceptLink="http://cdb.iso.org/lg/CDB-00131614-001">nwr</item>
+                                    <item AppInfo="Middle Newar" ConceptLink="http://cdb.iso.org/lg/CDB-00137881-001">nwx</item>
+                                    <item AppInfo="Nottoway-Meherrin" ConceptLink="http://cdb.iso.org/lg/CDB-00138035-001">nwy</item>
+                                    <item AppInfo="Nauete" ConceptLink="http://cdb.iso.org/lg/CDB-00131613-001">nxa</item>
+                                    <item AppInfo="Ngando" ConceptLink="http://cdb.iso.org/lg/CDB-00131612-001">nxd</item>
+                                    <item AppInfo="Nage" ConceptLink="http://cdb.iso.org/lg/CDB-00131603-001">nxe</item>
+                                    <item AppInfo="Ngad'a" ConceptLink="http://cdb.iso.org/lg/CDB-00131610-001">nxg</item>
+                                    <item AppInfo="Nindi" ConceptLink="http://cdb.iso.org/lg/CDB-00131618-001">nxi</item>
+                                    <item AppInfo="South Nuaulu" ConceptLink="http://cdb.iso.org/lg/CDB-00131608-001">nxl</item>
+                                    <item AppInfo="Numidian" ConceptLink="http://cdb.iso.org/lg/CDB-00138442-001">nxm</item>
+                                    <item AppInfo="Ngawun" ConceptLink="http://cdb.iso.org/lg/CDB-00131607-001">nxn</item>
+                                    <item AppInfo="Ninggerum" ConceptLink="http://cdb.iso.org/lg/CDB-00131606-001">nxr</item>
+                                    <item AppInfo="Narau" ConceptLink="http://cdb.iso.org/lg/CDB-00131605-001">nxu</item>
+                                    <item AppInfo="Nafri" ConceptLink="http://cdb.iso.org/lg/CDB-00131604-001">nxx</item>
+                                    <item AppInfo="Chichewa; Chewa; Nyanja" ConceptLink="http://cdb.iso.org/lg/CDB-00138585-001">nya</item>
+                                    <item AppInfo="Nyangbo" ConceptLink="http://cdb.iso.org/lg/CDB-00131626-001">nyb</item>
+                                    <item AppInfo="Nyanga-li" ConceptLink="http://cdb.iso.org/lg/CDB-00131628-001">nyc</item>
+                                    <item AppInfo="Nyore" ConceptLink="http://cdb.iso.org/lg/CDB-00131611-001">nyd</item>
+                                    <item AppInfo="Nyengo" ConceptLink="http://cdb.iso.org/lg/CDB-00131633-001">nye</item>
+                                    <item AppInfo="Giryama" ConceptLink="http://cdb.iso.org/lg/CDB-00131632-001">nyf</item>
+                                    <item AppInfo="Nyindu" ConceptLink="http://cdb.iso.org/lg/CDB-00131631-001">nyg</item>
+                                    <item AppInfo="Nyigina" ConceptLink="http://cdb.iso.org/lg/CDB-00131630-001">nyh</item>
+                                    <item AppInfo="Ama" ConceptLink="http://cdb.iso.org/lg/CDB-00131629-001">nyi</item>
+                                    <item AppInfo="Nyanga" ConceptLink="http://cdb.iso.org/lg/CDB-00131619-001">nyj</item>
+                                    <item AppInfo="Nyaneka" ConceptLink="http://cdb.iso.org/lg/CDB-00131627-001">nyk</item>
+                                    <item AppInfo="Nyeu" ConceptLink="http://cdb.iso.org/lg/CDB-00131635-001">nyl</item>
+                                    <item AppInfo="Nyamwezi" ConceptLink="http://cdb.iso.org/lg/CDB-00131625-001">nym</item>
+                                    <item AppInfo="Nyankole" ConceptLink="http://cdb.iso.org/lg/CDB-00131624-001">nyn</item>
+                                    <item AppInfo="Nyoro" ConceptLink="http://cdb.iso.org/lg/CDB-00131623-001">nyo</item>
+                                    <item AppInfo="Nyang'i" ConceptLink="http://cdb.iso.org/lg/CDB-00138094-001">nyp</item>
+                                    <item AppInfo="Nayini" ConceptLink="http://cdb.iso.org/lg/CDB-00131622-001">nyq</item>
+                                    <item AppInfo="Nyiha" ConceptLink="http://cdb.iso.org/lg/CDB-00131621-001">nyr</item>
+                                    <item AppInfo="Nyunga" ConceptLink="http://cdb.iso.org/lg/CDB-00138096-001">nys</item>
+                                    <item AppInfo="Nyawaygi" ConceptLink="http://cdb.iso.org/lg/CDB-00131595-001">nyt</item>
+                                    <item AppInfo="Nyungwe" ConceptLink="http://cdb.iso.org/lg/CDB-00131634-001">nyu</item>
+                                    <item AppInfo="Nyulnyul" ConceptLink="http://cdb.iso.org/lg/CDB-00131609-001">nyv</item>
+                                    <item AppInfo="Nyaw" ConceptLink="http://cdb.iso.org/lg/CDB-00131585-001">nyw</item>
+                                    <item AppInfo="Nganyaywana" ConceptLink="http://cdb.iso.org/lg/CDB-00137929-001">nyx</item>
+                                    <item AppInfo="Nyakyusa-Ngonde" ConceptLink="http://cdb.iso.org/lg/CDB-00131584-001">nyy</item>
+                                    <item AppInfo="Tigon Mbembe" ConceptLink="http://cdb.iso.org/lg/CDB-00131583-001">nza</item>
+                                    <item AppInfo="Njebi" ConceptLink="http://cdb.iso.org/lg/CDB-00131582-001">nzb</item>
+                                    <item AppInfo="Nzima" ConceptLink="http://cdb.iso.org/lg/CDB-00131581-001">nzi</item>
+                                    <item AppInfo="Nzakara" ConceptLink="http://cdb.iso.org/lg/CDB-00131580-001">nzk</item>
+                                    <item AppInfo="Zeme Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00131571-001">nzm</item>
+                                    <item AppInfo="New Zealand Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00131578-001">nzs</item>
+                                    <item AppInfo="Teke-Nzikou" ConceptLink="http://cdb.iso.org/lg/CDB-00131586-001">nzu</item>
+                                    <item AppInfo="Nzakambay" ConceptLink="http://cdb.iso.org/lg/CDB-00131576-001">nzy</item>
+                                    <item AppInfo="Orok" ConceptLink="http://cdb.iso.org/lg/CDB-00131575-001">oaa</item>
+                                    <item AppInfo="Oroch" ConceptLink="http://cdb.iso.org/lg/CDB-00131574-001">oac</item>
+                                    <item AppInfo="Old Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00138402-001">oar</item>
+                                    <item AppInfo="Old Avar" ConceptLink="http://cdb.iso.org/lg/CDB-00137897-001">oav</item>
+                                    <item AppInfo="ObispeÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00137927-001">obi</item>
+                                    <item AppInfo="Oblo" ConceptLink="http://cdb.iso.org/lg/CDB-00131573-001">obl</item>
+                                    <item AppInfo="Moabite" ConceptLink="http://cdb.iso.org/lg/CDB-00138401-001">obm</item>
+                                    <item AppInfo="Obo Manobo" ConceptLink="http://cdb.iso.org/lg/CDB-00131593-001">obo</item>
+                                    <item AppInfo="Old Burmese" ConceptLink="http://cdb.iso.org/lg/CDB-00137910-001">obr</item>
+                                    <item AppInfo="Old Breton" ConceptLink="http://cdb.iso.org/lg/CDB-00137913-001">obt</item>
+                                    <item AppInfo="Obulom" ConceptLink="http://cdb.iso.org/lg/CDB-00131577-001">obu</item>
+                                    <item AppInfo="Ocaina" ConceptLink="http://cdb.iso.org/lg/CDB-00131579-001">oca</item>
+                                    <item AppInfo="Old Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00138399-001">och</item>
+                                    <item AppInfo="Occitan; ProvenÃ§al" ConceptLink="http://cdb.iso.org/lg/CDB-00138586-001">oci</item>
+                                    <item AppInfo="Old Cornish" ConceptLink="http://cdb.iso.org/lg/CDB-00137893-001">oco</item>
+                                    <item AppInfo="Atzingo Matlatzinca" ConceptLink="http://cdb.iso.org/lg/CDB-00131601-001">ocu</item>
+                                    <item AppInfo="Odut" ConceptLink="http://cdb.iso.org/lg/CDB-00131600-001">oda</item>
+                                    <item AppInfo="Od" ConceptLink="http://cdb.iso.org/lg/CDB-00131599-001">odk</item>
+                                    <item AppInfo="Old Dutch" ConceptLink="http://cdb.iso.org/lg/CDB-00137882-001">odt</item>
+                                    <item AppInfo="Odual" ConceptLink="http://cdb.iso.org/lg/CDB-00131598-001">odu</item>
+                                    <item AppInfo="Ofo" ConceptLink="http://cdb.iso.org/lg/CDB-00138011-001">ofo</item>
+                                    <item AppInfo="Old Frisian" ConceptLink="http://cdb.iso.org/lg/CDB-00137888-001">ofs</item>
+                                    <item AppInfo="Efutop" ConceptLink="http://cdb.iso.org/lg/CDB-00131597-001">ofu</item>
+                                    <item AppInfo="Ogbia" ConceptLink="http://cdb.iso.org/lg/CDB-00131596-001">ogb</item>
+                                    <item AppInfo="Ogbah" ConceptLink="http://cdb.iso.org/lg/CDB-00131587-001">ogc</item>
+                                    <item AppInfo="Old Georgian" ConceptLink="http://cdb.iso.org/lg/CDB-00137892-001">oge</item>
+                                    <item AppInfo="Ogbogolo" ConceptLink="http://cdb.iso.org/lg/CDB-00131594-001">ogg</item>
+                                    <item AppInfo="Khana" ConceptLink="http://cdb.iso.org/lg/CDB-00131602-001">ogo</item>
+                                    <item AppInfo="Ogbronuagum" ConceptLink="http://cdb.iso.org/lg/CDB-00131592-001">ogu</item>
+                                    <item AppInfo="Old Hittite" ConceptLink="http://cdb.iso.org/lg/CDB-00138390-001">oht</item>
+                                    <item AppInfo="Old Hungarian" ConceptLink="http://cdb.iso.org/lg/CDB-00137896-001">ohu</item>
+                                    <item AppInfo="Oirata" ConceptLink="http://cdb.iso.org/lg/CDB-00131591-001">oia</item>
+                                    <item AppInfo="Inebu One" ConceptLink="http://cdb.iso.org/lg/CDB-00131590-001">oin</item>
+                                    <item AppInfo="Northwestern Ojibwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131589-001">ojb</item>
+                                    <item AppInfo="Central Ojibwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131588-001">ojc</item>
+                                    <item AppInfo="Eastern Ojibwa" ConceptLink="http://cdb.iso.org/lg/CDB-00131813-001">ojg</item>
+                                    <item AppInfo="Ojibwa" ConceptLink="http://cdb.iso.org/lg/CDB-00138587-001">oji</item>
+                                    <item AppInfo="Old Japanese" ConceptLink="http://cdb.iso.org/lg/CDB-00137885-001">ojp</item>
+                                    <item AppInfo="Severn Ojibwa" ConceptLink="http://cdb.iso.org/lg/CDB-00132010-001">ojs</item>
+                                    <item AppInfo="Ontong Java" ConceptLink="http://cdb.iso.org/lg/CDB-00137186-001">ojv</item>
+                                    <item AppInfo="Western Ojibwa" ConceptLink="http://cdb.iso.org/lg/CDB-00137187-001">ojw</item>
+                                    <item AppInfo="Okanagan" ConceptLink="http://cdb.iso.org/lg/CDB-00137188-001">oka</item>
+                                    <item AppInfo="Okobo" ConceptLink="http://cdb.iso.org/lg/CDB-00137189-001">okb</item>
+                                    <item AppInfo="Okodia" ConceptLink="http://cdb.iso.org/lg/CDB-00137190-001">okd</item>
+                                    <item AppInfo="Okpe" ConceptLink="http://cdb.iso.org/lg/CDB-00137216-001">oke</item>
+                                    <item AppInfo="Koresh-e Rostam" ConceptLink="http://cdb.iso.org/lg/CDB-00137250-001">okh</item>
+                                    <item AppInfo="Okiek" ConceptLink="http://cdb.iso.org/lg/CDB-00137213-001">oki</item>
+                                    <item AppInfo="Oko-Juwoi" ConceptLink="http://cdb.iso.org/lg/CDB-00138259-001">okj</item>
+                                    <item AppInfo="Kwamtim One" ConceptLink="http://cdb.iso.org/lg/CDB-00137240-001">okk</item>
+                                    <item AppInfo="Old Kentish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00138262-001">okl</item>
+                                    <item AppInfo="Middle Korean" ConceptLink="http://cdb.iso.org/lg/CDB-00137866-001">okm</item>
+                                    <item AppInfo="Oki-No-Erabu" ConceptLink="http://cdb.iso.org/lg/CDB-00137241-001">okn</item>
+                                    <item AppInfo="Old Korean" ConceptLink="http://cdb.iso.org/lg/CDB-00137880-001">oko</item>
+                                    <item AppInfo="Kirike" ConceptLink="http://cdb.iso.org/lg/CDB-00137242-001">okr</item>
+                                    <item AppInfo="Oko-Eni-Osayen" ConceptLink="http://cdb.iso.org/lg/CDB-00137243-001">oks</item>
+                                    <item AppInfo="Oku" ConceptLink="http://cdb.iso.org/lg/CDB-00137244-001">oku</item>
+                                    <item AppInfo="Orokaiva" ConceptLink="http://cdb.iso.org/lg/CDB-00137245-001">okv</item>
+                                    <item AppInfo="Okpe" ConceptLink="http://cdb.iso.org/lg/CDB-00137246-001">okx</item>
+                                    <item AppInfo="Walungge" ConceptLink="http://cdb.iso.org/lg/CDB-00137247-001">ola</item>
+                                    <item AppInfo="Mochi" ConceptLink="http://cdb.iso.org/lg/CDB-00137260-001">old</item>
+                                    <item AppInfo="Olekha" ConceptLink="http://cdb.iso.org/lg/CDB-00137249-001">ole</item>
+                                    <item AppInfo="Oloma" ConceptLink="http://cdb.iso.org/lg/CDB-00137238-001">olm</item>
+                                    <item AppInfo="Livvi" ConceptLink="http://cdb.iso.org/lg/CDB-00137251-001">olo</item>
+                                    <item AppInfo="Olrat" ConceptLink="http://cdb.iso.org/lg/CDB-00137252-001">olr</item>
+                                    <item AppInfo="Omaha-Ponca" ConceptLink="http://cdb.iso.org/lg/CDB-00137253-001">oma</item>
+                                    <item AppInfo="East Ambae" ConceptLink="http://cdb.iso.org/lg/CDB-00137254-001">omb</item>
+                                    <item AppInfo="Mochica" ConceptLink="http://cdb.iso.org/lg/CDB-00138338-001">omc</item>
+                                    <item AppInfo="Omejes" ConceptLink="http://cdb.iso.org/lg/CDB-00138339-001">ome</item>
+                                    <item AppInfo="Omagua" ConceptLink="http://cdb.iso.org/lg/CDB-00137255-001">omg</item>
+                                    <item AppInfo="Omi" ConceptLink="http://cdb.iso.org/lg/CDB-00137256-001">omi</item>
+                                    <item AppInfo="Omok" ConceptLink="http://cdb.iso.org/lg/CDB-00138342-001">omk</item>
+                                    <item AppInfo="Ombo" ConceptLink="http://cdb.iso.org/lg/CDB-00137257-001">oml</item>
+                                    <item AppInfo="Minoan" ConceptLink="http://cdb.iso.org/lg/CDB-00138434-001">omn</item>
+                                    <item AppInfo="Utarmbung" ConceptLink="http://cdb.iso.org/lg/CDB-00137258-001">omo</item>
+                                    <item AppInfo="Old Manipuri" ConceptLink="http://cdb.iso.org/lg/CDB-00137859-001">omp</item>
+                                    <item AppInfo="Old Marathi" ConceptLink="http://cdb.iso.org/lg/CDB-00137868-001">omr</item>
+                                    <item AppInfo="Omotik" ConceptLink="http://cdb.iso.org/lg/CDB-00137259-001">omt</item>
+                                    <item AppInfo="Omurano" ConceptLink="http://cdb.iso.org/lg/CDB-00138311-001">omu</item>
+                                    <item AppInfo="South Tairora" ConceptLink="http://cdb.iso.org/lg/CDB-00137227-001">omw</item>
+                                    <item AppInfo="Old Mon" ConceptLink="http://cdb.iso.org/lg/CDB-00137873-001">omx</item>
+                                    <item AppInfo="Ona" ConceptLink="http://cdb.iso.org/lg/CDB-00137225-001">ona</item>
+                                    <item AppInfo="Lingao" ConceptLink="http://cdb.iso.org/lg/CDB-00137248-001">onb</item>
+                                    <item AppInfo="Oneida" ConceptLink="http://cdb.iso.org/lg/CDB-00137217-001">one</item>
+                                    <item AppInfo="Olo" ConceptLink="http://cdb.iso.org/lg/CDB-00137218-001">ong</item>
+                                    <item AppInfo="Onin" ConceptLink="http://cdb.iso.org/lg/CDB-00137219-001">oni</item>
+                                    <item AppInfo="Onjob" ConceptLink="http://cdb.iso.org/lg/CDB-00137220-001">onj</item>
+                                    <item AppInfo="Kabore One" ConceptLink="http://cdb.iso.org/lg/CDB-00137221-001">onk</item>
+                                    <item AppInfo="Onobasulu" ConceptLink="http://cdb.iso.org/lg/CDB-00137222-001">onn</item>
+                                    <item AppInfo="Onondaga" ConceptLink="http://cdb.iso.org/lg/CDB-00137223-001">ono</item>
+                                    <item AppInfo="Sartang" ConceptLink="http://cdb.iso.org/lg/CDB-00137224-001">onp</item>
+                                    <item AppInfo="Northern One" ConceptLink="http://cdb.iso.org/lg/CDB-00137237-001">onr</item>
+                                    <item AppInfo="Ono" ConceptLink="http://cdb.iso.org/lg/CDB-00137226-001">ons</item>
+                                    <item AppInfo="Ontenu" ConceptLink="http://cdb.iso.org/lg/CDB-00137215-001">ont</item>
+                                    <item AppInfo="Unua" ConceptLink="http://cdb.iso.org/lg/CDB-00137228-001">onu</item>
+                                    <item AppInfo="Old Nubian" ConceptLink="http://cdb.iso.org/lg/CDB-00137878-001">onw</item>
+                                    <item AppInfo="Onin Based Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00137229-001">onx</item>
+                                    <item AppInfo="Tohono O'odham" ConceptLink="http://cdb.iso.org/lg/CDB-00137230-001">ood</item>
+                                    <item AppInfo="Ong" ConceptLink="http://cdb.iso.org/lg/CDB-00137231-001">oog</item>
+                                    <item AppInfo="Ãnge" ConceptLink="http://cdb.iso.org/lg/CDB-00137232-001">oon</item>
+                                    <item AppInfo="Oorlams" ConceptLink="http://cdb.iso.org/lg/CDB-00137233-001">oor</item>
+                                    <item AppInfo="Old Ossetic" ConceptLink="http://cdb.iso.org/lg/CDB-00138456-001">oos</item>
+                                    <item AppInfo="Okpamheri" ConceptLink="http://cdb.iso.org/lg/CDB-00137234-001">opa</item>
+                                    <item AppInfo="Kopkaka" ConceptLink="http://cdb.iso.org/lg/CDB-00137235-001">opk</item>
+                                    <item AppInfo="Oksapmin" ConceptLink="http://cdb.iso.org/lg/CDB-00137236-001">opm</item>
+                                    <item AppInfo="Opao" ConceptLink="http://cdb.iso.org/lg/CDB-00136920-001">opo</item>
+                                    <item AppInfo="Opata" ConceptLink="http://cdb.iso.org/lg/CDB-00136646-001">opt</item>
+                                    <item AppInfo="OfayÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00137011-001">opy</item>
+                                    <item AppInfo="Oroha" ConceptLink="http://cdb.iso.org/lg/CDB-00136738-001">ora</item>
+                                    <item AppInfo="Orma" ConceptLink="http://cdb.iso.org/lg/CDB-00136739-001">orc</item>
+                                    <item AppInfo="OrejÃ³n" ConceptLink="http://cdb.iso.org/lg/CDB-00136740-001">ore</item>
+                                    <item AppInfo="Oring" ConceptLink="http://cdb.iso.org/lg/CDB-00136741-001">org</item>
+                                    <item AppInfo="Oroqen" ConceptLink="http://cdb.iso.org/lg/CDB-00136742-001">orh</item>
+                                    <item AppInfo="Oriya" ConceptLink="http://cdb.iso.org/lg/CDB-00138589-001">ori</item>
+                                    <item AppInfo="Oromo; Afan Oromo; Galla" ConceptLink="http://cdb.iso.org/lg/CDB-00138588-001">orm</item>
+                                    <item AppInfo="Orang Kanaq" ConceptLink="http://cdb.iso.org/lg/CDB-00136743-001">orn</item>
+                                    <item AppInfo="Orokolo" ConceptLink="http://cdb.iso.org/lg/CDB-00136744-001">oro</item>
+                                    <item AppInfo="Oruma" ConceptLink="http://cdb.iso.org/lg/CDB-00136745-001">orr</item>
+                                    <item AppInfo="Orang Seletar" ConceptLink="http://cdb.iso.org/lg/CDB-00136758-001">ors</item>
+                                    <item AppInfo="Adivasi Oriya" ConceptLink="http://cdb.iso.org/lg/CDB-00136747-001">ort</item>
+                                    <item AppInfo="Ormuri" ConceptLink="http://cdb.iso.org/lg/CDB-00136736-001">oru</item>
+                                    <item AppInfo="Old Russian" ConceptLink="http://cdb.iso.org/lg/CDB-00137854-001">orv</item>
+                                    <item AppInfo="Oro Win" ConceptLink="http://cdb.iso.org/lg/CDB-00136749-001">orw</item>
+                                    <item AppInfo="Oro" ConceptLink="http://cdb.iso.org/lg/CDB-00136750-001">orx</item>
+                                    <item AppInfo="Ormu" ConceptLink="http://cdb.iso.org/lg/CDB-00136751-001">orz</item>
+                                    <item AppInfo="Osage" ConceptLink="http://cdb.iso.org/lg/CDB-00136752-001">osa</item>
+                                    <item AppInfo="Oscan" ConceptLink="http://cdb.iso.org/lg/CDB-00138388-001">osc</item>
+                                    <item AppInfo="Osing" ConceptLink="http://cdb.iso.org/lg/CDB-00136753-001">osi</item>
+                                    <item AppInfo="Ososo" ConceptLink="http://cdb.iso.org/lg/CDB-00136754-001">oso</item>
+                                    <item AppInfo="Old Spanish" ConceptLink="http://cdb.iso.org/lg/CDB-00137858-001">osp</item>
+                                    <item AppInfo="Ossetian; Ossetic" ConceptLink="http://cdb.iso.org/lg/CDB-00138590-001">oss</item>
+                                    <item AppInfo="Osatu" ConceptLink="http://cdb.iso.org/lg/CDB-00136755-001">ost</item>
+                                    <item AppInfo="Southern One" ConceptLink="http://cdb.iso.org/lg/CDB-00136756-001">osu</item>
+                                    <item AppInfo="Old Saxon" ConceptLink="http://cdb.iso.org/lg/CDB-00137852-001">osx</item>
+                                    <item AppInfo="Ottoman Turkish" ConceptLink="http://cdb.iso.org/lg/CDB-00137853-001">ota</item>
+                                    <item AppInfo="Old Tibetan" ConceptLink="http://cdb.iso.org/lg/CDB-00137856-001">otb</item>
+                                    <item AppInfo="Ot Danum" ConceptLink="http://cdb.iso.org/lg/CDB-00136725-001">otd</item>
+                                    <item AppInfo="Mezquital Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136748-001">ote</item>
+                                    <item AppInfo="Oti" ConceptLink="http://cdb.iso.org/lg/CDB-00138241-001">oti</item>
+                                    <item AppInfo="Old Turkish" ConceptLink="http://cdb.iso.org/lg/CDB-00137857-001">otk</item>
+                                    <item AppInfo="Tilapa Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136746-001">otl</item>
+                                    <item AppInfo="Eastern Highland Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136715-001">otm</item>
+                                    <item AppInfo="Tenango Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136716-001">otn</item>
+                                    <item AppInfo="QuerÃ©taro Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136717-001">otq</item>
+                                    <item AppInfo="Otoro" ConceptLink="http://cdb.iso.org/lg/CDB-00136718-001">otr</item>
+                                    <item AppInfo="Estado de MÃ©xico Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136719-001">ots</item>
+                                    <item AppInfo="Temoaya Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136720-001">ott</item>
+                                    <item AppInfo="Otuke" ConceptLink="http://cdb.iso.org/lg/CDB-00138206-001">otu</item>
+                                    <item AppInfo="Ottawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136721-001">otw</item>
+                                    <item AppInfo="Texcatepec Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136722-001">otx</item>
+                                    <item AppInfo="Old Tamil" ConceptLink="http://cdb.iso.org/lg/CDB-00138406-001">oty</item>
+                                    <item AppInfo="Ixtenco Otomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136735-001">otz</item>
+                                    <item AppInfo="Tagargrent" ConceptLink="http://cdb.iso.org/lg/CDB-00136724-001">oua</item>
+                                    <item AppInfo="Glio-Oubi" ConceptLink="http://cdb.iso.org/lg/CDB-00136714-001">oub</item>
+                                    <item AppInfo="Ounge" ConceptLink="http://cdb.iso.org/lg/CDB-00136726-001">oue</item>
+                                    <item AppInfo="Old Uighur" ConceptLink="http://cdb.iso.org/lg/CDB-00137909-001">oui</item>
+                                    <item AppInfo="Ouma" ConceptLink="http://cdb.iso.org/lg/CDB-00138150-001">oum</item>
+                                    <item AppInfo="!O!ung" ConceptLink="http://cdb.iso.org/lg/CDB-00136727-001">oun</item>
+                                    <item AppInfo="Owiniga" ConceptLink="http://cdb.iso.org/lg/CDB-00136728-001">owi</item>
+                                    <item AppInfo="Old Welsh" ConceptLink="http://cdb.iso.org/lg/CDB-00137886-001">owl</item>
+                                    <item AppInfo="Oy" ConceptLink="http://cdb.iso.org/lg/CDB-00136729-001">oyb</item>
+                                    <item AppInfo="Oyda" ConceptLink="http://cdb.iso.org/lg/CDB-00136730-001">oyd</item>
+                                    <item AppInfo="Wayampi" ConceptLink="http://cdb.iso.org/lg/CDB-00136731-001">oym</item>
+                                    <item AppInfo="Oya'oya" ConceptLink="http://cdb.iso.org/lg/CDB-00136732-001">oyy</item>
+                                    <item AppInfo="Koonzime" ConceptLink="http://cdb.iso.org/lg/CDB-00136733-001">ozm</item>
+                                    <item AppInfo="ParecÃ­s" ConceptLink="http://cdb.iso.org/lg/CDB-00136734-001">pab</item>
+                                    <item AppInfo="Pacoh" ConceptLink="http://cdb.iso.org/lg/CDB-00136760-001">pac</item>
+                                    <item AppInfo="PaumarÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00136794-001">pad</item>
+                                    <item AppInfo="Pagibete" ConceptLink="http://cdb.iso.org/lg/CDB-00136757-001">pae</item>
+                                    <item AppInfo="ParanawÃ¡t" ConceptLink="http://cdb.iso.org/lg/CDB-00138160-001">paf</item>
+                                    <item AppInfo="Pangasinan" ConceptLink="http://cdb.iso.org/lg/CDB-00136784-001">pag</item>
+                                    <item AppInfo="Tenharim" ConceptLink="http://cdb.iso.org/lg/CDB-00136785-001">pah</item>
+                                    <item AppInfo="Pe" ConceptLink="http://cdb.iso.org/lg/CDB-00136786-001">pai</item>
+                                    <item AppInfo="ParakanÃ£" ConceptLink="http://cdb.iso.org/lg/CDB-00136787-001">pak</item>
+                                    <item AppInfo="Pahlavi" ConceptLink="http://cdb.iso.org/lg/CDB-00138400-001">pal</item>
+                                    <item AppInfo="Pampanga; Kapampangan" ConceptLink="http://cdb.iso.org/lg/CDB-00136788-001">pam</item>
+                                    <item AppInfo="Punjabi; Panjabi" ConceptLink="http://cdb.iso.org/lg/CDB-00138591-001">pan</item>
+                                    <item AppInfo="Northern Paiute" ConceptLink="http://cdb.iso.org/lg/CDB-00136789-001">pao</item>
+                                    <item AppInfo="Papiamento" ConceptLink="http://cdb.iso.org/lg/CDB-00136790-001">pap</item>
+                                    <item AppInfo="Parya" ConceptLink="http://cdb.iso.org/lg/CDB-00136791-001">paq</item>
+                                    <item AppInfo="Panamint" ConceptLink="http://cdb.iso.org/lg/CDB-00136804-001">par</item>
+                                    <item AppInfo="Papasena" ConceptLink="http://cdb.iso.org/lg/CDB-00136793-001">pas</item>
+                                    <item AppInfo="Papitalai" ConceptLink="http://cdb.iso.org/lg/CDB-00136782-001">pat</item>
+                                    <item AppInfo="Palauan" ConceptLink="http://cdb.iso.org/lg/CDB-00136795-001">pau</item>
+                                    <item AppInfo="PakaÃ¡snovos" ConceptLink="http://cdb.iso.org/lg/CDB-00136796-001">pav</item>
+                                    <item AppInfo="Pawnee" ConceptLink="http://cdb.iso.org/lg/CDB-00136797-001">paw</item>
+                                    <item AppInfo="PankararÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00138326-001">pax</item>
+                                    <item AppInfo="Pech" ConceptLink="http://cdb.iso.org/lg/CDB-00136798-001">pay</item>
+                                    <item AppInfo="PankararÃº" ConceptLink="http://cdb.iso.org/lg/CDB-00138313-001">paz</item>
+                                    <item AppInfo="PÃ¡ez" ConceptLink="http://cdb.iso.org/lg/CDB-00136799-001">pbb</item>
+                                    <item AppInfo="Patamona" ConceptLink="http://cdb.iso.org/lg/CDB-00136800-001">pbc</item>
+                                    <item AppInfo="Mezontla Popoloca" ConceptLink="http://cdb.iso.org/lg/CDB-00136801-001">pbe</item>
+                                    <item AppInfo="Coyotepec Popoloca" ConceptLink="http://cdb.iso.org/lg/CDB-00136802-001">pbf</item>
+                                    <item AppInfo="Paraujano" ConceptLink="http://cdb.iso.org/lg/CDB-00138345-001">pbg</item>
+                                    <item AppInfo="E'Åapa Woromaipu" ConceptLink="http://cdb.iso.org/lg/CDB-00136803-001">pbh</item>
+                                    <item AppInfo="Parkwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136771-001">pbi</item>
+                                    <item AppInfo="Mak" ConceptLink="http://cdb.iso.org/lg/CDB-00136769-001">pbl</item>
+                                    <item AppInfo="Kpasam" ConceptLink="http://cdb.iso.org/lg/CDB-00136792-001">pbn</item>
+                                    <item AppInfo="Papel" ConceptLink="http://cdb.iso.org/lg/CDB-00136761-001">pbo</item>
+                                    <item AppInfo="Badyara" ConceptLink="http://cdb.iso.org/lg/CDB-00136762-001">pbp</item>
+                                    <item AppInfo="Pangwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136763-001">pbr</item>
+                                    <item AppInfo="Central Pame" ConceptLink="http://cdb.iso.org/lg/CDB-00136764-001">pbs</item>
+                                    <item AppInfo="Southern Pashto" ConceptLink="http://cdb.iso.org/lg/CDB-00136765-001">pbt</item>
+                                    <item AppInfo="Northern Pashto" ConceptLink="http://cdb.iso.org/lg/CDB-00136766-001">pbu</item>
+                                    <item AppInfo="Pnar" ConceptLink="http://cdb.iso.org/lg/CDB-00136767-001">pbv</item>
+                                    <item AppInfo="Pyu" ConceptLink="http://cdb.iso.org/lg/CDB-00136768-001">pby</item>
+                                    <item AppInfo="Palu" ConceptLink="http://cdb.iso.org/lg/CDB-00136781-001">pbz</item>
+                                    <item AppInfo="Santa InÃ©s Ahuatempan Popoloca" ConceptLink="http://cdb.iso.org/lg/CDB-00136770-001">pca</item>
+                                    <item AppInfo="Pear" ConceptLink="http://cdb.iso.org/lg/CDB-00136759-001">pcb</item>
+                                    <item AppInfo="Bouyei" ConceptLink="http://cdb.iso.org/lg/CDB-00136772-001">pcc</item>
+                                    <item AppInfo="Picard" ConceptLink="http://cdb.iso.org/lg/CDB-00136773-001">pcd</item>
+                                    <item AppInfo="Ruching Palaung" ConceptLink="http://cdb.iso.org/lg/CDB-00136774-001">pce</item>
+                                    <item AppInfo="Paliyan" ConceptLink="http://cdb.iso.org/lg/CDB-00136775-001">pcf</item>
+                                    <item AppInfo="Paniya" ConceptLink="http://cdb.iso.org/lg/CDB-00136776-001">pcg</item>
+                                    <item AppInfo="Pardhan" ConceptLink="http://cdb.iso.org/lg/CDB-00136777-001">pch</item>
+                                    <item AppInfo="Duruwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136778-001">pci</item>
+                                    <item AppInfo="Parenga" ConceptLink="http://cdb.iso.org/lg/CDB-00136779-001">pcj</item>
+                                    <item AppInfo="Paite Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00136780-001">pck</item>
+                                    <item AppInfo="Pardhi" ConceptLink="http://cdb.iso.org/lg/CDB-00136692-001">pcl</item>
+                                    <item AppInfo="Nigerian Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00136632-001">pcm</item>
+                                    <item AppInfo="Piti" ConceptLink="http://cdb.iso.org/lg/CDB-00136723-001">pcn</item>
+                                    <item AppInfo="Pacahuara" ConceptLink="http://cdb.iso.org/lg/CDB-00136647-001">pcp</item>
+                                    <item AppInfo="Panang" ConceptLink="http://cdb.iso.org/lg/CDB-00136648-001">pcr</item>
+                                    <item AppInfo="Pyapun" ConceptLink="http://cdb.iso.org/lg/CDB-00136649-001">pcw</item>
+                                    <item AppInfo="Anam" ConceptLink="http://cdb.iso.org/lg/CDB-00136650-001">pda</item>
+                                    <item AppInfo="Pennsylvania German" ConceptLink="http://cdb.iso.org/lg/CDB-00136651-001">pdc</item>
+                                    <item AppInfo="Pa Di" ConceptLink="http://cdb.iso.org/lg/CDB-00136652-001">pdi</item>
+                                    <item AppInfo="Podena" ConceptLink="http://cdb.iso.org/lg/CDB-00136653-001">pdn</item>
+                                    <item AppInfo="Padoe" ConceptLink="http://cdb.iso.org/lg/CDB-00136654-001">pdo</item>
+                                    <item AppInfo="Plautdietsch" ConceptLink="http://cdb.iso.org/lg/CDB-00136667-001">pdt</item>
+                                    <item AppInfo="Kayan" ConceptLink="http://cdb.iso.org/lg/CDB-00136656-001">pdu</item>
+                                    <item AppInfo="Peranakan Indonesian" ConceptLink="http://cdb.iso.org/lg/CDB-00136645-001">pea</item>
+                                    <item AppInfo="Eastern Pomo" ConceptLink="http://cdb.iso.org/lg/CDB-00138301-001">peb</item>
+                                    <item AppInfo="Mala" ConceptLink="http://cdb.iso.org/lg/CDB-00136658-001">ped</item>
+                                    <item AppInfo="Taje" ConceptLink="http://cdb.iso.org/lg/CDB-00136659-001">pee</item>
+                                    <item AppInfo="Northeastern Pomo" ConceptLink="http://cdb.iso.org/lg/CDB-00138284-001">pef</item>
+                                    <item AppInfo="Pengo" ConceptLink="http://cdb.iso.org/lg/CDB-00136660-001">peg</item>
+                                    <item AppInfo="Bonan" ConceptLink="http://cdb.iso.org/lg/CDB-00136661-001">peh</item>
+                                    <item AppInfo="Chichimeca-Jonaz" ConceptLink="http://cdb.iso.org/lg/CDB-00136662-001">pei</item>
+                                    <item AppInfo="Northern Pomo" ConceptLink="http://cdb.iso.org/lg/CDB-00138277-001">pej</item>
+                                    <item AppInfo="Penchal" ConceptLink="http://cdb.iso.org/lg/CDB-00136663-001">pek</item>
+                                    <item AppInfo="Pekal" ConceptLink="http://cdb.iso.org/lg/CDB-00136664-001">pel</item>
+                                    <item AppInfo="Phende" ConceptLink="http://cdb.iso.org/lg/CDB-00136665-001">pem</item>
+                                    <item AppInfo="Old Persian" ConceptLink="http://cdb.iso.org/lg/CDB-00137902-001">peo</item>
+                                    <item AppInfo="Kunja" ConceptLink="http://cdb.iso.org/lg/CDB-00136634-001">pep</item>
+                                    <item AppInfo="Southern Pomo" ConceptLink="http://cdb.iso.org/lg/CDB-00136657-001">peq</item>
+                                    <item AppInfo="Western Farsi" ConceptLink="http://cdb.iso.org/lg/CDB-00136655-001">pes</item>
+                                    <item AppInfo="PÃ©mono" ConceptLink="http://cdb.iso.org/lg/CDB-00136624-001">pev</item>
+                                    <item AppInfo="Petats" ConceptLink="http://cdb.iso.org/lg/CDB-00136625-001">pex</item>
+                                    <item AppInfo="Petjo" ConceptLink="http://cdb.iso.org/lg/CDB-00136626-001">pey</item>
+                                    <item AppInfo="Eastern Penan" ConceptLink="http://cdb.iso.org/lg/CDB-00136627-001">pez</item>
+                                    <item AppInfo="PÃ¡Ã¡fang" ConceptLink="http://cdb.iso.org/lg/CDB-00136628-001">pfa</item>
+                                    <item AppInfo="Peere" ConceptLink="http://cdb.iso.org/lg/CDB-00136629-001">pfe</item>
+                                    <item AppInfo="Pfaelzisch" ConceptLink="http://cdb.iso.org/lg/CDB-00136630-001">pfl</item>
+                                    <item AppInfo="Sudanese Creole Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00136631-001">pga</item>
+                                    <item AppInfo="Pangwali" ConceptLink="http://cdb.iso.org/lg/CDB-00136644-001">pgg</item>
+                                    <item AppInfo="Pagi" ConceptLink="http://cdb.iso.org/lg/CDB-00136633-001">pgi</item>
+                                    <item AppInfo="Rerep" ConceptLink="http://cdb.iso.org/lg/CDB-00136623-001">pgk</item>
+                                    <item AppInfo="Paelignian" ConceptLink="http://cdb.iso.org/lg/CDB-00138393-001">pgn</item>
+                                    <item AppInfo="Pangseng" ConceptLink="http://cdb.iso.org/lg/CDB-00136635-001">pgs</item>
+                                    <item AppInfo="Pagu" ConceptLink="http://cdb.iso.org/lg/CDB-00136636-001">pgu</item>
+                                    <item AppInfo="Pongyong" ConceptLink="http://cdb.iso.org/lg/CDB-00136637-001">pgy</item>
+                                    <item AppInfo="Pa-Hng" ConceptLink="http://cdb.iso.org/lg/CDB-00136638-001">pha</item>
+                                    <item AppInfo="Phudagi" ConceptLink="http://cdb.iso.org/lg/CDB-00136639-001">phd</item>
+                                    <item AppInfo="Phuong" ConceptLink="http://cdb.iso.org/lg/CDB-00136640-001">phg</item>
+                                    <item AppInfo="Phukha" ConceptLink="http://cdb.iso.org/lg/CDB-00136641-001">phh</item>
+                                    <item AppInfo="Phake" ConceptLink="http://cdb.iso.org/lg/CDB-00136642-001">phk</item>
+                                    <item AppInfo="Phalura" ConceptLink="http://cdb.iso.org/lg/CDB-00136643-001">phl</item>
+                                    <item AppInfo="Phimbi" ConceptLink="http://cdb.iso.org/lg/CDB-00136669-001">phm</item>
+                                    <item AppInfo="Phoenician" ConceptLink="http://cdb.iso.org/lg/CDB-00138394-001">phn</item>
+                                    <item AppInfo="Phunoi" ConceptLink="http://cdb.iso.org/lg/CDB-00136703-001">pho</item>
+                                    <item AppInfo="Phana'" ConceptLink="http://cdb.iso.org/lg/CDB-00136666-001">phq</item>
+                                    <item AppInfo="Pahari-Potwari" ConceptLink="http://cdb.iso.org/lg/CDB-00136693-001">phr</item>
+                                    <item AppInfo="Phu Thai" ConceptLink="http://cdb.iso.org/lg/CDB-00136694-001">pht</item>
+                                    <item AppInfo="Phuan" ConceptLink="http://cdb.iso.org/lg/CDB-00136695-001">phu</item>
+                                    <item AppInfo="Pahlavani" ConceptLink="http://cdb.iso.org/lg/CDB-00136696-001">phv</item>
+                                    <item AppInfo="Phangduwali" ConceptLink="http://cdb.iso.org/lg/CDB-00136697-001">phw</item>
+                                    <item AppInfo="Pima Bajo" ConceptLink="http://cdb.iso.org/lg/CDB-00136698-001">pia</item>
+                                    <item AppInfo="Yine" ConceptLink="http://cdb.iso.org/lg/CDB-00136699-001">pib</item>
+                                    <item AppInfo="Pinji" ConceptLink="http://cdb.iso.org/lg/CDB-00136700-001">pic</item>
+                                    <item AppInfo="Piaroa" ConceptLink="http://cdb.iso.org/lg/CDB-00136713-001">pid</item>
+                                    <item AppInfo="Piro" ConceptLink="http://cdb.iso.org/lg/CDB-00137994-001">pie</item>
+                                    <item AppInfo="Pingelapese" ConceptLink="http://cdb.iso.org/lg/CDB-00136702-001">pif</item>
+                                    <item AppInfo="Pisabo" ConceptLink="http://cdb.iso.org/lg/CDB-00136691-001">pig</item>
+                                    <item AppInfo="Pitcairn-Norfolk" ConceptLink="http://cdb.iso.org/lg/CDB-00136704-001">pih</item>
+                                    <item AppInfo="Pini" ConceptLink="http://cdb.iso.org/lg/CDB-00136705-001">pii</item>
+                                    <item AppInfo="Pijao" ConceptLink="http://cdb.iso.org/lg/CDB-00137917-001">pij</item>
+                                    <item AppInfo="Yom" ConceptLink="http://cdb.iso.org/lg/CDB-00136706-001">pil</item>
+                                    <item AppInfo="Powhatan" ConceptLink="http://cdb.iso.org/lg/CDB-00137926-001">pim</item>
+                                    <item AppInfo="Piame" ConceptLink="http://cdb.iso.org/lg/CDB-00136707-001">pin</item>
+                                    <item AppInfo="Piapoco" ConceptLink="http://cdb.iso.org/lg/CDB-00136708-001">pio</item>
+                                    <item AppInfo="Pero" ConceptLink="http://cdb.iso.org/lg/CDB-00136709-001">pip</item>
+                                    <item AppInfo="Piratapuyo" ConceptLink="http://cdb.iso.org/lg/CDB-00136710-001">pir</item>
+                                    <item AppInfo="Pijin" ConceptLink="http://cdb.iso.org/lg/CDB-00136711-001">pis</item>
+                                    <item AppInfo="Pitta Pitta" ConceptLink="http://cdb.iso.org/lg/CDB-00136712-001">pit</item>
+                                    <item AppInfo="Pintupi-Luritja" ConceptLink="http://cdb.iso.org/lg/CDB-00136680-001">piu</item>
+                                    <item AppInfo="Pileni" ConceptLink="http://cdb.iso.org/lg/CDB-00136678-001">piv</item>
+                                    <item AppInfo="Pimbwe" ConceptLink="http://cdb.iso.org/lg/CDB-00136701-001">piw</item>
+                                    <item AppInfo="Piu" ConceptLink="http://cdb.iso.org/lg/CDB-00136670-001">pix</item>
+                                    <item AppInfo="Piya-Kwonci" ConceptLink="http://cdb.iso.org/lg/CDB-00136671-001">piy</item>
+                                    <item AppInfo="Pije" ConceptLink="http://cdb.iso.org/lg/CDB-00136672-001">piz</item>
+                                    <item AppInfo="Pitjantjatjara" ConceptLink="http://cdb.iso.org/lg/CDB-00136673-001">pjt</item>
+                                    <item AppInfo="ArdhamÄgadhÄ« PrÄkrit" ConceptLink="http://cdb.iso.org/lg/CDB-00137884-001">pka</item>
+                                    <item AppInfo="Pokomo" ConceptLink="http://cdb.iso.org/lg/CDB-00136674-001">pkb</item>
+                                    <item AppInfo="Paekche" ConceptLink="http://cdb.iso.org/lg/CDB-00137942-001">pkc</item>
+                                    <item AppInfo="Pak-Tong" ConceptLink="http://cdb.iso.org/lg/CDB-00136675-001">pkg</item>
+                                    <item AppInfo="Pankhu" ConceptLink="http://cdb.iso.org/lg/CDB-00136676-001">pkh</item>
+                                    <item AppInfo="Pakanha" ConceptLink="http://cdb.iso.org/lg/CDB-00136677-001">pkn</item>
+                                    <item AppInfo="PÃ¶koot" ConceptLink="http://cdb.iso.org/lg/CDB-00136690-001">pko</item>
+                                    <item AppInfo="Pukapuka" ConceptLink="http://cdb.iso.org/lg/CDB-00136679-001">pkp</item>
+                                    <item AppInfo="Attapady Kurumba" ConceptLink="http://cdb.iso.org/lg/CDB-00136668-001">pkr</item>
+                                    <item AppInfo="Pakistan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136681-001">pks</item>
+                                    <item AppInfo="Maleng" ConceptLink="http://cdb.iso.org/lg/CDB-00136682-001">pkt</item>
+                                    <item AppInfo="Paku" ConceptLink="http://cdb.iso.org/lg/CDB-00136683-001">pku</item>
+                                    <item AppInfo="Miani" ConceptLink="http://cdb.iso.org/lg/CDB-00136684-001">pla</item>
+                                    <item AppInfo="Polonombauk" ConceptLink="http://cdb.iso.org/lg/CDB-00136685-001">plb</item>
+                                    <item AppInfo="Central Palawano" ConceptLink="http://cdb.iso.org/lg/CDB-00136686-001">plc</item>
+                                    <item AppInfo="Polari" ConceptLink="http://cdb.iso.org/lg/CDB-00136687-001">pld</item>
+                                    <item AppInfo="Palu'e" ConceptLink="http://cdb.iso.org/lg/CDB-00136688-001">ple</item>
+                                    <item AppInfo="PilagÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00136689-001">plg</item>
+                                    <item AppInfo="Paulohi" ConceptLink="http://cdb.iso.org/lg/CDB-00136814-001">plh</item>
+                                    <item AppInfo="Pali" ConceptLink="http://cdb.iso.org/lg/CDB-00138592-001">pli</item>
+                                    <item AppInfo="Polci" ConceptLink="http://cdb.iso.org/lg/CDB-00136963-001">plj</item>
+                                    <item AppInfo="Kohistani Shina" ConceptLink="http://cdb.iso.org/lg/CDB-00136783-001">plk</item>
+                                    <item AppInfo="Shwe Palaung" ConceptLink="http://cdb.iso.org/lg/CDB-00136921-001">pll</item>
+                                    <item AppInfo="Palenquero" ConceptLink="http://cdb.iso.org/lg/CDB-00136922-001">pln</item>
+                                    <item AppInfo="Oluta Popoluca" ConceptLink="http://cdb.iso.org/lg/CDB-00136923-001">plo</item>
+                                    <item AppInfo="Palpa" ConceptLink="http://cdb.iso.org/lg/CDB-00136924-001">plp</item>
+                                    <item AppInfo="Palaic" ConceptLink="http://cdb.iso.org/lg/CDB-00138460-001">plq</item>
+                                    <item AppInfo="Palaka Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00136925-001">plr</item>
+                                    <item AppInfo="San Marcos Tlalcoyalco Popoloca" ConceptLink="http://cdb.iso.org/lg/CDB-00136926-001">pls</item>
+                                    <item AppInfo="Plateau Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00136927-001">plt</item>
+                                    <item AppInfo="PalikÃºr" ConceptLink="http://cdb.iso.org/lg/CDB-00136928-001">plu</item>
+                                    <item AppInfo="Southwest Palawano" ConceptLink="http://cdb.iso.org/lg/CDB-00136941-001">plv</item>
+                                    <item AppInfo="Brooke's Point Palawano" ConceptLink="http://cdb.iso.org/lg/CDB-00136930-001">plw</item>
+                                    <item AppInfo="Bolyu" ConceptLink="http://cdb.iso.org/lg/CDB-00136919-001">ply</item>
+                                    <item AppInfo="Paluan" ConceptLink="http://cdb.iso.org/lg/CDB-00136932-001">plz</item>
+                                    <item AppInfo="Paama" ConceptLink="http://cdb.iso.org/lg/CDB-00136933-001">pma</item>
+                                    <item AppInfo="Pambia" ConceptLink="http://cdb.iso.org/lg/CDB-00136934-001">pmb</item>
+                                    <item AppInfo="Palumata" ConceptLink="http://cdb.iso.org/lg/CDB-00138124-001">pmc</item>
+                                    <item AppInfo="Pwaamei" ConceptLink="http://cdb.iso.org/lg/CDB-00136935-001">pme</item>
+                                    <item AppInfo="Pamona" ConceptLink="http://cdb.iso.org/lg/CDB-00136936-001">pmf</item>
+                                    <item AppInfo="MÄhÄrÄá¹£á¹­ri PrÄkrit" ConceptLink="http://cdb.iso.org/lg/CDB-00137887-001">pmh</item>
+                                    <item AppInfo="Northern Pumi" ConceptLink="http://cdb.iso.org/lg/CDB-00136937-001">pmi</item>
+                                    <item AppInfo="Southern Pumi" ConceptLink="http://cdb.iso.org/lg/CDB-00136938-001">pmj</item>
+                                    <item AppInfo="Pamlico" ConceptLink="http://cdb.iso.org/lg/CDB-00138112-001">pmk</item>
+                                    <item AppInfo="Lingua Franca" ConceptLink="http://cdb.iso.org/lg/CDB-00138107-001">pml</item>
+                                    <item AppInfo="Pomo" ConceptLink="http://cdb.iso.org/lg/CDB-00136939-001">pmm</item>
+                                    <item AppInfo="Pam" ConceptLink="http://cdb.iso.org/lg/CDB-00136940-001">pmn</item>
+                                    <item AppInfo="Pom" ConceptLink="http://cdb.iso.org/lg/CDB-00136908-001">pmo</item>
+                                    <item AppInfo="Northern Pame" ConceptLink="http://cdb.iso.org/lg/CDB-00136906-001">pmq</item>
+                                    <item AppInfo="Paynamar" ConceptLink="http://cdb.iso.org/lg/CDB-00136929-001">pmr</item>
+                                    <item AppInfo="Piemontese" ConceptLink="http://cdb.iso.org/lg/CDB-00136898-001">pms</item>
+                                    <item AppInfo="Tuamotuan" ConceptLink="http://cdb.iso.org/lg/CDB-00136899-001">pmt</item>
+                                    <item AppInfo="Mirpur Panjabi" ConceptLink="http://cdb.iso.org/lg/CDB-00136900-001">pmu</item>
+                                    <item AppInfo="Plains Miwok" ConceptLink="http://cdb.iso.org/lg/CDB-00136901-001">pmw</item>
+                                    <item AppInfo="Poumei Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00136902-001">pmx</item>
+                                    <item AppInfo="Papuan Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00136903-001">pmy</item>
+                                    <item AppInfo="Southern Pame" ConceptLink="http://cdb.iso.org/lg/CDB-00138025-001">pmz</item>
+                                    <item AppInfo="Punan Bah-Biau" ConceptLink="http://cdb.iso.org/lg/CDB-00136904-001">pna</item>
+                                    <item AppInfo="Western Panjabi" ConceptLink="http://cdb.iso.org/lg/CDB-00136905-001">pnb</item>
+                                    <item AppInfo="Pannei" ConceptLink="http://cdb.iso.org/lg/CDB-00136918-001">pnc</item>
+                                    <item AppInfo="Western Penan" ConceptLink="http://cdb.iso.org/lg/CDB-00136907-001">pne</item>
+                                    <item AppInfo="Pongu" ConceptLink="http://cdb.iso.org/lg/CDB-00136896-001">png</item>
+                                    <item AppInfo="Penrhyn" ConceptLink="http://cdb.iso.org/lg/CDB-00136909-001">pnh</item>
+                                    <item AppInfo="Aoheng" ConceptLink="http://cdb.iso.org/lg/CDB-00136910-001">pni</item>
+                                    <item AppInfo="Punan Batu 1" ConceptLink="http://cdb.iso.org/lg/CDB-00136911-001">pnm</item>
+                                    <item AppInfo="Pinai-Hagahai" ConceptLink="http://cdb.iso.org/lg/CDB-00136912-001">pnn</item>
+                                    <item AppInfo="Panobo" ConceptLink="http://cdb.iso.org/lg/CDB-00138055-001">pno</item>
+                                    <item AppInfo="Pancana" ConceptLink="http://cdb.iso.org/lg/CDB-00136913-001">pnp</item>
+                                    <item AppInfo="Pana" ConceptLink="http://cdb.iso.org/lg/CDB-00136914-001">pnq</item>
+                                    <item AppInfo="Panim" ConceptLink="http://cdb.iso.org/lg/CDB-00136915-001">pnr</item>
+                                    <item AppInfo="Ponosakan" ConceptLink="http://cdb.iso.org/lg/CDB-00136916-001">pns</item>
+                                    <item AppInfo="Pontic" ConceptLink="http://cdb.iso.org/lg/CDB-00136943-001">pnt</item>
+                                    <item AppInfo="Jiongnai Bunu" ConceptLink="http://cdb.iso.org/lg/CDB-00136897-001">pnu</item>
+                                    <item AppInfo="Pinigura" ConceptLink="http://cdb.iso.org/lg/CDB-00136931-001">pnv</item>
+                                    <item AppInfo="Panytyima" ConceptLink="http://cdb.iso.org/lg/CDB-00136966-001">pnw</item>
+                                    <item AppInfo="Phong-Kniang" ConceptLink="http://cdb.iso.org/lg/CDB-00136967-001">pnx</item>
+                                    <item AppInfo="Pinyin" ConceptLink="http://cdb.iso.org/lg/CDB-00136968-001">pny</item>
+                                    <item AppInfo="Pana" ConceptLink="http://cdb.iso.org/lg/CDB-00136969-001">pnz</item>
+                                    <item AppInfo="Poqomam" ConceptLink="http://cdb.iso.org/lg/CDB-00136970-001">poc</item>
+                                    <item AppInfo="Ponares" ConceptLink="http://cdb.iso.org/lg/CDB-00138060-001">pod</item>
+                                    <item AppInfo="San Juan Atzingo Popoloca" ConceptLink="http://cdb.iso.org/lg/CDB-00136971-001">poe</item>
+                                    <item AppInfo="Poke" ConceptLink="http://cdb.iso.org/lg/CDB-00136972-001">pof</item>
+                                    <item AppInfo="PotiguÃ¡ra" ConceptLink="http://cdb.iso.org/lg/CDB-00138058-001">pog</item>
+                                    <item AppInfo="Poqomchi'" ConceptLink="http://cdb.iso.org/lg/CDB-00136973-001">poh</item>
+                                    <item AppInfo="Highland Popoluca" ConceptLink="http://cdb.iso.org/lg/CDB-00136974-001">poi</item>
+                                    <item AppInfo="PokangÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00136987-001">pok</item>
+                                    <item AppInfo="Polish" ConceptLink="http://cdb.iso.org/lg/CDB-00138593-001">pol</item>
+                                    <item AppInfo="Southeastern Pomo" ConceptLink="http://cdb.iso.org/lg/CDB-00136976-001">pom</item>
+                                    <item AppInfo="Pohnpeian" ConceptLink="http://cdb.iso.org/lg/CDB-00136965-001">pon</item>
+                                    <item AppInfo="Central Pomo" ConceptLink="http://cdb.iso.org/lg/CDB-00136978-001">poo</item>
+                                    <item AppInfo="Pwapwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136979-001">pop</item>
+                                    <item AppInfo="Texistepec Popoluca" ConceptLink="http://cdb.iso.org/lg/CDB-00136980-001">poq</item>
+                                    <item AppInfo="Portuguese" ConceptLink="http://cdb.iso.org/lg/CDB-00138595-001">por</item>
+                                    <item AppInfo="Sayula Popoluca" ConceptLink="http://cdb.iso.org/lg/CDB-00136981-001">pos</item>
+                                    <item AppInfo="Potawatomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136982-001">pot</item>
+                                    <item AppInfo="Upper Guinea Crioulo" ConceptLink="http://cdb.iso.org/lg/CDB-00136983-001">pov</item>
+                                    <item AppInfo="San Felipe Otlaltepec Popoloca" ConceptLink="http://cdb.iso.org/lg/CDB-00136984-001">pow</item>
+                                    <item AppInfo="Polabian" ConceptLink="http://cdb.iso.org/lg/CDB-00138052-001">pox</item>
+                                    <item AppInfo="Pogolo" ConceptLink="http://cdb.iso.org/lg/CDB-00136985-001">poy</item>
+                                    <item AppInfo="Pao" ConceptLink="http://cdb.iso.org/lg/CDB-00136986-001">ppa</item>
+                                    <item AppInfo="Papi" ConceptLink="http://cdb.iso.org/lg/CDB-00136954-001">ppe</item>
+                                    <item AppInfo="Paipai" ConceptLink="http://cdb.iso.org/lg/CDB-00136952-001">ppi</item>
+                                    <item AppInfo="Uma" ConceptLink="http://cdb.iso.org/lg/CDB-00136975-001">ppk</item>
+                                    <item AppInfo="Pipil" ConceptLink="http://cdb.iso.org/lg/CDB-00136944-001">ppl</item>
+                                    <item AppInfo="Papuma" ConceptLink="http://cdb.iso.org/lg/CDB-00136945-001">ppm</item>
+                                    <item AppInfo="Papapana" ConceptLink="http://cdb.iso.org/lg/CDB-00136946-001">ppn</item>
+                                    <item AppInfo="Folopa" ConceptLink="http://cdb.iso.org/lg/CDB-00136947-001">ppo</item>
+                                    <item AppInfo="Pelende" ConceptLink="http://cdb.iso.org/lg/CDB-00136948-001">ppp</item>
+                                    <item AppInfo="Pei" ConceptLink="http://cdb.iso.org/lg/CDB-00136949-001">ppq</item>
+                                    <item AppInfo="Piru" ConceptLink="http://cdb.iso.org/lg/CDB-00136950-001">ppr</item>
+                                    <item AppInfo="San LuÃ­s Temalacayuca Popoloca" ConceptLink="http://cdb.iso.org/lg/CDB-00136951-001">pps</item>
+                                    <item AppInfo="Pare" ConceptLink="http://cdb.iso.org/lg/CDB-00136964-001">ppt</item>
+                                    <item AppInfo="Papora" ConceptLink="http://cdb.iso.org/lg/CDB-00138065-001">ppu</item>
+                                    <item AppInfo="Pa'a" ConceptLink="http://cdb.iso.org/lg/CDB-00136953-001">pqa</item>
+                                    <item AppInfo="Malecite-Passamaquoddy" ConceptLink="http://cdb.iso.org/lg/CDB-00136942-001">pqm</item>
+                                    <item AppInfo="Lua'" ConceptLink="http://cdb.iso.org/lg/CDB-00136955-001">prb</item>
+                                    <item AppInfo="Parachi" ConceptLink="http://cdb.iso.org/lg/CDB-00136956-001">prc</item>
+                                    <item AppInfo="Parsi-Dari" ConceptLink="http://cdb.iso.org/lg/CDB-00136957-001">prd</item>
+                                    <item AppInfo="Principense" ConceptLink="http://cdb.iso.org/lg/CDB-00136958-001">pre</item>
+                                    <item AppInfo="Prussian" ConceptLink="http://cdb.iso.org/lg/CDB-00138039-001">prg</item>
+                                    <item AppInfo="Porohanon" ConceptLink="http://cdb.iso.org/lg/CDB-00136959-001">prh</item>
+                                    <item AppInfo="PaicÃ®" ConceptLink="http://cdb.iso.org/lg/CDB-00136960-001">pri</item>
+                                    <item AppInfo="Parauk" ConceptLink="http://cdb.iso.org/lg/CDB-00136961-001">prk</item>
+                                    <item AppInfo="Peruvian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136962-001">prl</item>
+                                    <item AppInfo="Kibiri" ConceptLink="http://cdb.iso.org/lg/CDB-00136874-001">prm</item>
+                                    <item AppInfo="Prasuni" ConceptLink="http://cdb.iso.org/lg/CDB-00136977-001">prn</item>
+                                    <item AppInfo="Old ProvenÃ§al" ConceptLink="http://cdb.iso.org/lg/CDB-00137905-001">pro</item>
+                                    <item AppInfo="Parsi" ConceptLink="http://cdb.iso.org/lg/CDB-00136917-001">prp</item>
+                                    <item AppInfo="AshÃ©ninka PerenÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00136828-001">prq</item>
+                                    <item AppInfo="Puri" ConceptLink="http://cdb.iso.org/lg/CDB-00138105-001">prr</item>
+                                    <item AppInfo="Dari" ConceptLink="http://cdb.iso.org/lg/CDB-00136829-001">prs</item>
+                                    <item AppInfo="Phai" ConceptLink="http://cdb.iso.org/lg/CDB-00136830-001">prt</item>
+                                    <item AppInfo="Puragi" ConceptLink="http://cdb.iso.org/lg/CDB-00136831-001">pru</item>
+                                    <item AppInfo="Parawen" ConceptLink="http://cdb.iso.org/lg/CDB-00136832-001">prw</item>
+                                    <item AppInfo="Purik" ConceptLink="http://cdb.iso.org/lg/CDB-00136833-001">prx</item>
+                                    <item AppInfo="Pray 3" ConceptLink="http://cdb.iso.org/lg/CDB-00136834-001">pry</item>
+                                    <item AppInfo="Providencia Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136835-001">prz</item>
+                                    <item AppInfo="Asue Awyu" ConceptLink="http://cdb.iso.org/lg/CDB-00136836-001">psa</item>
+                                    <item AppInfo="Persian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136849-001">psc</item>
+                                    <item AppInfo="Plains Indian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136838-001">psd</item>
+                                    <item AppInfo="Central Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00136827-001">pse</item>
+                                    <item AppInfo="Penang Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136840-001">psg</item>
+                                    <item AppInfo="Southwest Pashayi" ConceptLink="http://cdb.iso.org/lg/CDB-00136841-001">psh</item>
+                                    <item AppInfo="Southeast Pashayi" ConceptLink="http://cdb.iso.org/lg/CDB-00136842-001">psi</item>
+                                    <item AppInfo="Puerto Rican Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136843-001">psl</item>
+                                    <item AppInfo="Pauserna" ConceptLink="http://cdb.iso.org/lg/CDB-00137948-001">psm</item>
+                                    <item AppInfo="Panasuan" ConceptLink="http://cdb.iso.org/lg/CDB-00136844-001">psn</item>
+                                    <item AppInfo="Polish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136845-001">pso</item>
+                                    <item AppInfo="Philippine Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136846-001">psp</item>
+                                    <item AppInfo="Pasi" ConceptLink="http://cdb.iso.org/lg/CDB-00136847-001">psq</item>
+                                    <item AppInfo="Portuguese Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136816-001">psr</item>
+                                    <item AppInfo="Kaulong" ConceptLink="http://cdb.iso.org/lg/CDB-00136839-001">pss</item>
+                                    <item AppInfo="Central Pashto" ConceptLink="http://cdb.iso.org/lg/CDB-00136837-001">pst</item>
+                                    <item AppInfo="Sauraseni PrÄkrit" ConceptLink="http://cdb.iso.org/lg/CDB-00137904-001">psu</item>
+                                    <item AppInfo="Port Sandwich" ConceptLink="http://cdb.iso.org/lg/CDB-00136806-001">psw</item>
+                                    <item AppInfo="Piscataway" ConceptLink="http://cdb.iso.org/lg/CDB-00137952-001">psy</item>
+                                    <item AppInfo="Pai Tavytera" ConceptLink="http://cdb.iso.org/lg/CDB-00136807-001">pta</item>
+                                    <item AppInfo="PataxÃ³ HÃ£-Ha-HÃ£e" ConceptLink="http://cdb.iso.org/lg/CDB-00137985-001">pth</item>
+                                    <item AppInfo="Pintiini" ConceptLink="http://cdb.iso.org/lg/CDB-00136808-001">pti</item>
+                                    <item AppInfo="Patani" ConceptLink="http://cdb.iso.org/lg/CDB-00136809-001">ptn</item>
+                                    <item AppInfo="Zo'Ã©" ConceptLink="http://cdb.iso.org/lg/CDB-00136810-001">pto</item>
+                                    <item AppInfo="Patep" ConceptLink="http://cdb.iso.org/lg/CDB-00136811-001">ptp</item>
+                                    <item AppInfo="Piamatsina" ConceptLink="http://cdb.iso.org/lg/CDB-00136812-001">ptr</item>
+                                    <item AppInfo="Enrekang" ConceptLink="http://cdb.iso.org/lg/CDB-00136813-001">ptt</item>
+                                    <item AppInfo="Bambam" ConceptLink="http://cdb.iso.org/lg/CDB-00136826-001">ptu</item>
+                                    <item AppInfo="Port Vato" ConceptLink="http://cdb.iso.org/lg/CDB-00136815-001">ptv</item>
+                                    <item AppInfo="Pentlatch" ConceptLink="http://cdb.iso.org/lg/CDB-00137999-001">ptw</item>
+                                    <item AppInfo="Pathiya" ConceptLink="http://cdb.iso.org/lg/CDB-00136805-001">pty</item>
+                                    <item AppInfo="Western Highland Purepecha" ConceptLink="http://cdb.iso.org/lg/CDB-00136817-001">pua</item>
+                                    <item AppInfo="Purum" ConceptLink="http://cdb.iso.org/lg/CDB-00136818-001">pub</item>
+                                    <item AppInfo="Punan Merap" ConceptLink="http://cdb.iso.org/lg/CDB-00136819-001">puc</item>
+                                    <item AppInfo="Punan Aput" ConceptLink="http://cdb.iso.org/lg/CDB-00136820-001">pud</item>
+                                    <item AppInfo="Puelche" ConceptLink="http://cdb.iso.org/lg/CDB-00136821-001">pue</item>
+                                    <item AppInfo="Punan Merah" ConceptLink="http://cdb.iso.org/lg/CDB-00136822-001">puf</item>
+                                    <item AppInfo="Phuie" ConceptLink="http://cdb.iso.org/lg/CDB-00136823-001">pug</item>
+                                    <item AppInfo="Puinave" ConceptLink="http://cdb.iso.org/lg/CDB-00136824-001">pui</item>
+                                    <item AppInfo="Punan Tubu" ConceptLink="http://cdb.iso.org/lg/CDB-00136825-001">puj</item>
+                                    <item AppInfo="Pu Ko" ConceptLink="http://cdb.iso.org/lg/CDB-00136851-001">puk</item>
+                                    <item AppInfo="Puma" ConceptLink="http://cdb.iso.org/lg/CDB-00136885-001">pum</item>
+                                    <item AppInfo="Puoc" ConceptLink="http://cdb.iso.org/lg/CDB-00136848-001">puo</item>
+                                    <item AppInfo="Pulabu" ConceptLink="http://cdb.iso.org/lg/CDB-00136875-001">pup</item>
+                                    <item AppInfo="Puquina" ConceptLink="http://cdb.iso.org/lg/CDB-00137973-001">puq</item>
+                                    <item AppInfo="PuruborÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00136876-001">pur</item>
+                                    <item AppInfo="Pashto; Pushto" ConceptLink="http://cdb.iso.org/lg/CDB-00138594-001">pus</item>
+                                    <item AppInfo="Putoh" ConceptLink="http://cdb.iso.org/lg/CDB-00136877-001">put</item>
+                                    <item AppInfo="Punu" ConceptLink="http://cdb.iso.org/lg/CDB-00136878-001">puu</item>
+                                    <item AppInfo="Puluwatese" ConceptLink="http://cdb.iso.org/lg/CDB-00136879-001">puw</item>
+                                    <item AppInfo="Puare" ConceptLink="http://cdb.iso.org/lg/CDB-00136880-001">pux</item>
+                                    <item AppInfo="PurisimeÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00137976-001">puy</item>
+                                    <item AppInfo="Purum Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00136881-001">puz</item>
+                                    <item AppInfo="Pawaia" ConceptLink="http://cdb.iso.org/lg/CDB-00136882-001">pwa</item>
+                                    <item AppInfo="Panawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136895-001">pwb</item>
+                                    <item AppInfo="Gapapaiwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136884-001">pwg</item>
+                                    <item AppInfo="Molbog" ConceptLink="http://cdb.iso.org/lg/CDB-00136873-001">pwm</item>
+                                    <item AppInfo="Paiwan" ConceptLink="http://cdb.iso.org/lg/CDB-00136886-001">pwn</item>
+                                    <item AppInfo="Pwo Western Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00136887-001">pwo</item>
+                                    <item AppInfo="Powari" ConceptLink="http://cdb.iso.org/lg/CDB-00136888-001">pwr</item>
+                                    <item AppInfo="Pwo Northern Karen" ConceptLink="http://cdb.iso.org/lg/CDB-00136889-001">pww</item>
+                                    <item AppInfo="Quetzaltepec Mixe" ConceptLink="http://cdb.iso.org/lg/CDB-00136890-001">pxm</item>
+                                    <item AppInfo="Pye Krumen" ConceptLink="http://cdb.iso.org/lg/CDB-00136891-001">pye</item>
+                                    <item AppInfo="Fyam" ConceptLink="http://cdb.iso.org/lg/CDB-00136892-001">pym</item>
+                                    <item AppInfo="PoyanÃ¡wa" ConceptLink="http://cdb.iso.org/lg/CDB-00136893-001">pyn</item>
+                                    <item AppInfo="Puyuma" ConceptLink="http://cdb.iso.org/lg/CDB-00136894-001">pyu</item>
+                                    <item AppInfo="Pyu" ConceptLink="http://cdb.iso.org/lg/CDB-00138371-001">pyx</item>
+                                    <item AppInfo="Pyen" ConceptLink="http://cdb.iso.org/lg/CDB-00136862-001">pyy</item>
+                                    <item AppInfo="Para Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00136860-001">pzn</item>
+                                    <item AppInfo="Quapaw" ConceptLink="http://cdb.iso.org/lg/CDB-00136883-001">qua</item>
+                                    <item AppInfo="Huallaga HuÃ¡nuco Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136852-001">qub</item>
+                                    <item AppInfo="K'iche'" ConceptLink="http://cdb.iso.org/lg/CDB-00136853-001">quc</item>
+                                    <item AppInfo="CalderÃ³n Highland Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00136854-001">qud</item>
+                                    <item AppInfo="Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00138596-001">que</item>
+                                    <item AppInfo="Lambayeque Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136855-001">quf</item>
+                                    <item AppInfo="Chimborazo Highland Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00136856-001">qug</item>
+                                    <item AppInfo="South Bolivian Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136857-001">quh</item>
+                                    <item AppInfo="Quileute" ConceptLink="http://cdb.iso.org/lg/CDB-00136858-001">qui</item>
+                                    <item AppInfo="Chachapoyas Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136859-001">quk</item>
+                                    <item AppInfo="North Bolivian Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136872-001">qul</item>
+                                    <item AppInfo="Sipacapense" ConceptLink="http://cdb.iso.org/lg/CDB-00136861-001">qum</item>
+                                    <item AppInfo="Quinault" ConceptLink="http://cdb.iso.org/lg/CDB-00138208-001">qun</item>
+                                    <item AppInfo="Southern Pastaza Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136850-001">qup</item>
+                                    <item AppInfo="Quinqui" ConceptLink="http://cdb.iso.org/lg/CDB-00136863-001">quq</item>
+                                    <item AppInfo="Yanahuanca Pasco Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136864-001">qur</item>
+                                    <item AppInfo="Santiago del Estero Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00136865-001">qus</item>
+                                    <item AppInfo="Sacapulteco" ConceptLink="http://cdb.iso.org/lg/CDB-00136866-001">quv</item>
+                                    <item AppInfo="Tena Lowland Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00136867-001">quw</item>
+                                    <item AppInfo="Yauyos Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136868-001">qux</item>
+                                    <item AppInfo="Ayacucho Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136869-001">quy</item>
+                                    <item AppInfo="Cusco Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136870-001">quz</item>
+                                    <item AppInfo="Ambo-Pasco Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136871-001">qva</item>
+                                    <item AppInfo="Cajamarca Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00136737-001">qvc</item>
+                                    <item AppInfo="Eastern ApurÃ­mac Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137684-001">qve</item>
+                                    <item AppInfo="HuamalÃ­es-Dos de Mayo HuÃ¡nuco Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137685-001">qvh</item>
+                                    <item AppInfo="Imbabura Highland Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00137686-001">qvi</item>
+                                    <item AppInfo="Loja Highland Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00137687-001">qvj</item>
+                                    <item AppInfo="Cajatambo North Lima Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137688-001">qvl</item>
+                                    <item AppInfo="Margos-Yarowilca-Lauricocha Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137698-001">qvm</item>
+                                    <item AppInfo="North JunÃ­n Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137690-001">qvn</item>
+                                    <item AppInfo="Napo Lowland Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137683-001">qvo</item>
+                                    <item AppInfo="Pacaraos Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137692-001">qvp</item>
+                                    <item AppInfo="San MartÃ­n Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137693-001">qvs</item>
+                                    <item AppInfo="Huaylla Wanca Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137694-001">qvw</item>
+                                    <item AppInfo="Queyu" ConceptLink="http://cdb.iso.org/lg/CDB-00137691-001">qvy</item>
+                                    <item AppInfo="Northern Pastaza Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00137689-001">qvz</item>
+                                    <item AppInfo="Corongo Ancash Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137681-001">qwa</item>
+                                    <item AppInfo="Classical Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137906-001">qwc</item>
+                                    <item AppInfo="Huaylas Ancash Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137677-001">qwh</item>
+                                    <item AppInfo="Kuman" ConceptLink="http://cdb.iso.org/lg/CDB-00138261-001">qwm</item>
+                                    <item AppInfo="Sihuas Ancash Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137669-001">qws</item>
+                                    <item AppInfo="Kwalhioqua-Tlatskanai" ConceptLink="http://cdb.iso.org/lg/CDB-00138248-001">qwt</item>
+                                    <item AppInfo="ChiquiÃ¡n Ancash Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137697-001">qxa</item>
+                                    <item AppInfo="Chincha Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137717-001">qxc</item>
+                                    <item AppInfo="Panao HuÃ¡nuco Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137719-001">qxh</item>
+                                    <item AppInfo="Salasaca Highland Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00137715-001">qxl</item>
+                                    <item AppInfo="Northern Conchucos Ancash Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137724-001">qxn</item>
+                                    <item AppInfo="Southern Conchucos Ancash Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137727-001">qxo</item>
+                                    <item AppInfo="Puno Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137728-001">qxp</item>
+                                    <item AppInfo="Qashqa'i" ConceptLink="http://cdb.iso.org/lg/CDB-00137729-001">qxq</item>
+                                    <item AppInfo="CaÅar Highland Quichua" ConceptLink="http://cdb.iso.org/lg/CDB-00137705-001">qxr</item>
+                                    <item AppInfo="Southern Qiang" ConceptLink="http://cdb.iso.org/lg/CDB-00137721-001">qxs</item>
+                                    <item AppInfo="Santa Ana de Tusi Pasco Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137714-001">qxt</item>
+                                    <item AppInfo="Arequipa-La UniÃ³n Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137706-001">qxu</item>
+                                    <item AppInfo="Jauja Wanca Quechua" ConceptLink="http://cdb.iso.org/lg/CDB-00137699-001">qxw</item>
+                                    <item AppInfo="Quenya" ConceptLink="http://cdb.iso.org/lg/CDB-00138352-001">qya</item>
+                                    <item AppInfo="Quiripi" ConceptLink="http://cdb.iso.org/lg/CDB-00137970-001">qyp</item>
+                                    <item AppInfo="Dungmali" ConceptLink="http://cdb.iso.org/lg/CDB-00137682-001">raa</item>
+                                    <item AppInfo="Camling" ConceptLink="http://cdb.iso.org/lg/CDB-00137636-001">rab</item>
+                                    <item AppInfo="Rasawa" ConceptLink="http://cdb.iso.org/lg/CDB-00137630-001">rac</item>
+                                    <item AppInfo="Rade" ConceptLink="http://cdb.iso.org/lg/CDB-00137631-001">rad</item>
+                                    <item AppInfo="Western Meohang" ConceptLink="http://cdb.iso.org/lg/CDB-00137632-001">raf</item>
+                                    <item AppInfo="Logooli" ConceptLink="http://cdb.iso.org/lg/CDB-00137606-001">rag</item>
+                                    <item AppInfo="Rabha" ConceptLink="http://cdb.iso.org/lg/CDB-00137627-001">rah</item>
+                                    <item AppInfo="Ramoaaina" ConceptLink="http://cdb.iso.org/lg/CDB-00137617-001">rai</item>
+                                    <item AppInfo="Rajasthani" ConceptLink="http://cdb.iso.org/lg/CDB-00130990-001">raj</item>
+                                    <item AppInfo="Tulu-Bohuai" ConceptLink="http://cdb.iso.org/lg/CDB-00137616-001">rak</item>
+                                    <item AppInfo="Ralte" ConceptLink="http://cdb.iso.org/lg/CDB-00137615-001">ral</item>
+                                    <item AppInfo="Canela" ConceptLink="http://cdb.iso.org/lg/CDB-00137613-001">ram</item>
+                                    <item AppInfo="Riantana" ConceptLink="http://cdb.iso.org/lg/CDB-00137612-001">ran</item>
+                                    <item AppInfo="Rao" ConceptLink="http://cdb.iso.org/lg/CDB-00137611-001">rao</item>
+                                    <item AppInfo="Rapanui" ConceptLink="http://cdb.iso.org/lg/CDB-00137608-001">rap</item>
+                                    <item AppInfo="Saam" ConceptLink="http://cdb.iso.org/lg/CDB-00137620-001">raq</item>
+                                    <item AppInfo="Rarotongan; Cook Islands Maori" ConceptLink="http://cdb.iso.org/lg/CDB-00137654-001">rar</item>
+                                    <item AppInfo="Tegali" ConceptLink="http://cdb.iso.org/lg/CDB-00137656-001">ras</item>
+                                    <item AppInfo="Razajerdi" ConceptLink="http://cdb.iso.org/lg/CDB-00137657-001">rat</item>
+                                    <item AppInfo="Raute" ConceptLink="http://cdb.iso.org/lg/CDB-00137659-001">rau</item>
+                                    <item AppInfo="Sampang" ConceptLink="http://cdb.iso.org/lg/CDB-00137652-001">rav</item>
+                                    <item AppInfo="Rawang" ConceptLink="http://cdb.iso.org/lg/CDB-00137663-001">raw</item>
+                                    <item AppInfo="Rang" ConceptLink="http://cdb.iso.org/lg/CDB-00137664-001">rax</item>
+                                    <item AppInfo="Rapa" ConceptLink="http://cdb.iso.org/lg/CDB-00137665-001">ray</item>
+                                    <item AppInfo="Rahambuu" ConceptLink="http://cdb.iso.org/lg/CDB-00137637-001">raz</item>
+                                    <item AppInfo="Rumai Palaung" ConceptLink="http://cdb.iso.org/lg/CDB-00137649-001">rbb</item>
+                                    <item AppInfo="RÃ©union Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00137713-001">rcf</item>
+                                    <item AppInfo="Rudbari" ConceptLink="http://cdb.iso.org/lg/CDB-00137646-001">rdb</item>
+                                    <item AppInfo="Rerau" ConceptLink="http://cdb.iso.org/lg/CDB-00137645-001">rea</item>
+                                    <item AppInfo="Rembong" ConceptLink="http://cdb.iso.org/lg/CDB-00137643-001">reb</item>
+                                    <item AppInfo="Rejang Kayan" ConceptLink="http://cdb.iso.org/lg/CDB-00137642-001">ree</item>
+                                    <item AppInfo="Kara" ConceptLink="http://cdb.iso.org/lg/CDB-00137641-001">reg</item>
+                                    <item AppInfo="Reli" ConceptLink="http://cdb.iso.org/lg/CDB-00137638-001">rei</item>
+                                    <item AppInfo="Rejang" ConceptLink="http://cdb.iso.org/lg/CDB-00137607-001">rej</item>
+                                    <item AppInfo="Rendille" ConceptLink="http://cdb.iso.org/lg/CDB-00137810-001">rel</item>
+                                    <item AppInfo="Remo" ConceptLink="http://cdb.iso.org/lg/CDB-00138030-001">rem</item>
+                                    <item AppInfo="Rengao" ConceptLink="http://cdb.iso.org/lg/CDB-00137813-001">ren</item>
+                                    <item AppInfo="Rer Bare" ConceptLink="http://cdb.iso.org/lg/CDB-00138028-001">rer</item>
+                                    <item AppInfo="Reshe" ConceptLink="http://cdb.iso.org/lg/CDB-00137815-001">res</item>
+                                    <item AppInfo="Retta" ConceptLink="http://cdb.iso.org/lg/CDB-00137808-001">ret</item>
+                                    <item AppInfo="Reyesano" ConceptLink="http://cdb.iso.org/lg/CDB-00137818-001">rey</item>
+                                    <item AppInfo="Roria" ConceptLink="http://cdb.iso.org/lg/CDB-00137821-001">rga</item>
+                                    <item AppInfo="Romano-Greek" ConceptLink="http://cdb.iso.org/lg/CDB-00137822-001">rge</item>
+                                    <item AppInfo="Rangkas" ConceptLink="http://cdb.iso.org/lg/CDB-00138026-001">rgk</item>
+                                    <item AppInfo="Romagnol" ConceptLink="http://cdb.iso.org/lg/CDB-00137798-001">rgn</item>
+                                    <item AppInfo="ResÃ­garo" ConceptLink="http://cdb.iso.org/lg/CDB-00137814-001">rgr</item>
+                                    <item AppInfo="Southern Roglai" ConceptLink="http://cdb.iso.org/lg/CDB-00137797-001">rgs</item>
+                                    <item AppInfo="Ringgou" ConceptLink="http://cdb.iso.org/lg/CDB-00137807-001">rgu</item>
+                                    <item AppInfo="Rohingya" ConceptLink="http://cdb.iso.org/lg/CDB-00137792-001">rhg</item>
+                                    <item AppInfo="Yahang" ConceptLink="http://cdb.iso.org/lg/CDB-00137801-001">rhp</item>
+                                    <item AppInfo="Riang" ConceptLink="http://cdb.iso.org/lg/CDB-00137802-001">ria</item>
+                                    <item AppInfo="Rien" ConceptLink="http://cdb.iso.org/lg/CDB-00137803-001">rie</item>
+                                    <item AppInfo="Tarifit" ConceptLink="http://cdb.iso.org/lg/CDB-00137804-001">rif</item>
+                                    <item AppInfo="Riang" ConceptLink="http://cdb.iso.org/lg/CDB-00137816-001">ril</item>
+                                    <item AppInfo="Nyaturu" ConceptLink="http://cdb.iso.org/lg/CDB-00137848-001">rim</item>
+                                    <item AppInfo="Nungu" ConceptLink="http://cdb.iso.org/lg/CDB-00137847-001">rin</item>
+                                    <item AppInfo="Ribun" ConceptLink="http://cdb.iso.org/lg/CDB-00137846-001">rir</item>
+                                    <item AppInfo="Ritarungo" ConceptLink="http://cdb.iso.org/lg/CDB-00137843-001">rit</item>
+                                    <item AppInfo="Riung" ConceptLink="http://cdb.iso.org/lg/CDB-00137842-001">riu</item>
+                                    <item AppInfo="Rajong" ConceptLink="http://cdb.iso.org/lg/CDB-00137828-001">rjg</item>
+                                    <item AppInfo="Raji" ConceptLink="http://cdb.iso.org/lg/CDB-00137827-001">rji</item>
+                                    <item AppInfo="Rajbanshi" ConceptLink="http://cdb.iso.org/lg/CDB-00137826-001">rjs</item>
+                                    <item AppInfo="Kraol" ConceptLink="http://cdb.iso.org/lg/CDB-00137825-001">rka</item>
+                                    <item AppInfo="Rikbaktsa" ConceptLink="http://cdb.iso.org/lg/CDB-00137840-001">rkb</item>
+                                    <item AppInfo="Rakahanga-Manihiki" ConceptLink="http://cdb.iso.org/lg/CDB-00137793-001">rkh</item>
+                                    <item AppInfo="Rakhine" ConceptLink="http://cdb.iso.org/lg/CDB-00137758-001">rki</item>
+                                    <item AppInfo="Marka" ConceptLink="http://cdb.iso.org/lg/CDB-00137756-001">rkm</item>
+                                    <item AppInfo="Rangpuri" ConceptLink="http://cdb.iso.org/lg/CDB-00137754-001">rkt</item>
+                                    <item AppInfo="Rama" ConceptLink="http://cdb.iso.org/lg/CDB-00137752-001">rma</item>
+                                    <item AppInfo="Rembarunga" ConceptLink="http://cdb.iso.org/lg/CDB-00137749-001">rmb</item>
+                                    <item AppInfo="Carpathian Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137759-001">rmc</item>
+                                    <item AppInfo="Traveller Danish" ConceptLink="http://cdb.iso.org/lg/CDB-00137731-001">rmd</item>
+                                    <item AppInfo="Angloromani" ConceptLink="http://cdb.iso.org/lg/CDB-00137743-001">rme</item>
+                                    <item AppInfo="Kalo Finnish Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137742-001">rmf</item>
+                                    <item AppInfo="Traveller Norwegian" ConceptLink="http://cdb.iso.org/lg/CDB-00137741-001">rmg</item>
+                                    <item AppInfo="Murkim" ConceptLink="http://cdb.iso.org/lg/CDB-00137740-001">rmh</item>
+                                    <item AppInfo="Lomavren" ConceptLink="http://cdb.iso.org/lg/CDB-00137739-001">rmi</item>
+                                    <item AppInfo="Romkun" ConceptLink="http://cdb.iso.org/lg/CDB-00137737-001">rmk</item>
+                                    <item AppInfo="Baltic Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137735-001">rml</item>
+                                    <item AppInfo="Roma" ConceptLink="http://cdb.iso.org/lg/CDB-00137732-001">rmm</item>
+                                    <item AppInfo="Balkan Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137775-001">rmn</item>
+                                    <item AppInfo="Sinte Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137746-001">rmo</item>
+                                    <item AppInfo="Rempi" ConceptLink="http://cdb.iso.org/lg/CDB-00137778-001">rmp</item>
+                                    <item AppInfo="CalÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00137779-001">rmr</item>
+                                    <item AppInfo="Romanian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137785-001">rms</item>
+                                    <item AppInfo="Domari" ConceptLink="http://cdb.iso.org/lg/CDB-00137761-001">rmt</item>
+                                    <item AppInfo="Tavringer Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137784-001">rmu</item>
+                                    <item AppInfo="Romanova" ConceptLink="http://cdb.iso.org/lg/CDB-00138359-001">rmv</item>
+                                    <item AppInfo="Welsh Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137768-001">rmw</item>
+                                    <item AppInfo="Romam" ConceptLink="http://cdb.iso.org/lg/CDB-00137766-001">rmx</item>
+                                    <item AppInfo="Vlax Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00137762-001">rmy</item>
+                                    <item AppInfo="Marma" ConceptLink="http://cdb.iso.org/lg/CDB-00137757-001">rmz</item>
+                                    <item AppInfo="Runa" ConceptLink="http://cdb.iso.org/lg/CDB-00138067-001">rna</item>
+                                    <item AppInfo="Ruund" ConceptLink="http://cdb.iso.org/lg/CDB-00137773-001">rnd</item>
+                                    <item AppInfo="Ronga" ConceptLink="http://cdb.iso.org/lg/CDB-00137845-001">rng</item>
+                                    <item AppInfo="Ranglong" ConceptLink="http://cdb.iso.org/lg/CDB-00137796-001">rnl</item>
+                                    <item AppInfo="Roon" ConceptLink="http://cdb.iso.org/lg/CDB-00137795-001">rnn</item>
+                                    <item AppInfo="Rongpo" ConceptLink="http://cdb.iso.org/lg/CDB-00137434-001">rnp</item>
+                                    <item AppInfo="Rungwa" ConceptLink="http://cdb.iso.org/lg/CDB-00137559-001">rnw</item>
+                                    <item AppInfo="Tae'" ConceptLink="http://cdb.iso.org/lg/CDB-00137650-001">rob</item>
+                                    <item AppInfo="Cacgia Roglai" ConceptLink="http://cdb.iso.org/lg/CDB-00137429-001">roc</item>
+                                    <item AppInfo="Rogo" ConceptLink="http://cdb.iso.org/lg/CDB-00137426-001">rod</item>
+                                    <item AppInfo="Ronji" ConceptLink="http://cdb.iso.org/lg/CDB-00137425-001">roe</item>
+                                    <item AppInfo="Rombo" ConceptLink="http://cdb.iso.org/lg/CDB-00137423-001">rof</item>
+                                    <item AppInfo="Northern Roglai" ConceptLink="http://cdb.iso.org/lg/CDB-00137421-001">rog</item>
+                                    <item AppInfo="Romansh" ConceptLink="http://cdb.iso.org/lg/CDB-00138597-001">roh</item>
+                                    <item AppInfo="Romblomanon" ConceptLink="http://cdb.iso.org/lg/CDB-00137419-001">rol</item>
+                                    <item AppInfo="Romany; Romani" ConceptLink="http://cdb.iso.org/lg/CDB-00130986-001">rom</item>
+                                    <item AppInfo="Romanian; Moldavian; Moldovan" ConceptLink="http://cdb.iso.org/lg/CDB-00138599-001">ron</item>
+                                    <item AppInfo="Rotokas" ConceptLink="http://cdb.iso.org/lg/CDB-00137445-001">roo</item>
+                                    <item AppInfo="Kriol" ConceptLink="http://cdb.iso.org/lg/CDB-00137467-001">rop</item>
+                                    <item AppInfo="Rongga" ConceptLink="http://cdb.iso.org/lg/CDB-00137468-001">ror</item>
+                                    <item AppInfo="Runga" ConceptLink="http://cdb.iso.org/lg/CDB-00137478-001">rou</item>
+                                    <item AppInfo="Dela-Oenale" ConceptLink="http://cdb.iso.org/lg/CDB-00137463-001">row</item>
+                                    <item AppInfo="Repanbitip" ConceptLink="http://cdb.iso.org/lg/CDB-00137472-001">rpn</item>
+                                    <item AppInfo="Rapting" ConceptLink="http://cdb.iso.org/lg/CDB-00137475-001">rpt</item>
+                                    <item AppInfo="Ririo" ConceptLink="http://cdb.iso.org/lg/CDB-00137455-001">rri</item>
+                                    <item AppInfo="Waima" ConceptLink="http://cdb.iso.org/lg/CDB-00137469-001">rro</item>
+                                    <item AppInfo="Romano-Serbian" ConceptLink="http://cdb.iso.org/lg/CDB-00137452-001">rsb</item>
+                                    <item AppInfo="Rennellese Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137462-001">rsi</item>
+                                    <item AppInfo="Russian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137458-001">rsl</item>
+                                    <item AppInfo="Ratahan" ConceptLink="http://cdb.iso.org/lg/CDB-00137461-001">rth</item>
+                                    <item AppInfo="Rotuman" ConceptLink="http://cdb.iso.org/lg/CDB-00137370-001">rtm</item>
+                                    <item AppInfo="Rathawi" ConceptLink="http://cdb.iso.org/lg/CDB-00137371-001">rtw</item>
+                                    <item AppInfo="Gungu" ConceptLink="http://cdb.iso.org/lg/CDB-00137378-001">rub</item>
+                                    <item AppInfo="Ruuli" ConceptLink="http://cdb.iso.org/lg/CDB-00137379-001">ruc</item>
+                                    <item AppInfo="Rusyn" ConceptLink="http://cdb.iso.org/lg/CDB-00137381-001">rue</item>
+                                    <item AppInfo="Luguru" ConceptLink="http://cdb.iso.org/lg/CDB-00137376-001">ruf</item>
+                                    <item AppInfo="Roviana" ConceptLink="http://cdb.iso.org/lg/CDB-00137365-001">rug</item>
+                                    <item AppInfo="Ruga" ConceptLink="http://cdb.iso.org/lg/CDB-00137364-001">ruh</item>
+                                    <item AppInfo="Rufiji" ConceptLink="http://cdb.iso.org/lg/CDB-00137363-001">rui</item>
+                                    <item AppInfo="Che" ConceptLink="http://cdb.iso.org/lg/CDB-00137361-001">ruk</item>
+                                    <item AppInfo="Kirundi; Rundi" ConceptLink="http://cdb.iso.org/lg/CDB-00138598-001">run</item>
+                                    <item AppInfo="Istro Romanian" ConceptLink="http://cdb.iso.org/lg/CDB-00137354-001">ruo</item>
+                                    <item AppInfo="Aromanian; Arumanian; Macedo-Romanian" ConceptLink="http://cdb.iso.org/lg/CDB-00137385-001">rup</item>
+                                    <item AppInfo="Megleno Romanian" ConceptLink="http://cdb.iso.org/lg/CDB-00137408-001">ruq</item>
+                                    <item AppInfo="Russian" ConceptLink="http://cdb.iso.org/lg/CDB-00138600-001">rus</item>
+                                    <item AppInfo="Rutul" ConceptLink="http://cdb.iso.org/lg/CDB-00137403-001">rut</item>
+                                    <item AppInfo="Lanas Lobu" ConceptLink="http://cdb.iso.org/lg/CDB-00137407-001">ruu</item>
+                                    <item AppInfo="Mala" ConceptLink="http://cdb.iso.org/lg/CDB-00137400-001">ruy</item>
+                                    <item AppInfo="Ruma" ConceptLink="http://cdb.iso.org/lg/CDB-00137412-001">ruz</item>
+                                    <item AppInfo="Rawo" ConceptLink="http://cdb.iso.org/lg/CDB-00137392-001">rwa</item>
+                                    <item AppInfo="Rwa" ConceptLink="http://cdb.iso.org/lg/CDB-00137386-001">rwk</item>
+                                    <item AppInfo="Amba" ConceptLink="http://cdb.iso.org/lg/CDB-00137388-001">rwm</item>
+                                    <item AppInfo="Rawa" ConceptLink="http://cdb.iso.org/lg/CDB-00137399-001">rwo</item>
+                                    <item AppInfo="Marwari" ConceptLink="http://cdb.iso.org/lg/CDB-00137384-001">rwr</item>
+                                    <item AppInfo="Northern Amami-Oshima" ConceptLink="http://cdb.iso.org/lg/CDB-00137393-001">ryn</item>
+                                    <item AppInfo="Yaeyama" ConceptLink="http://cdb.iso.org/lg/CDB-00137394-001">rys</item>
+                                    <item AppInfo="Central Okinawan" ConceptLink="http://cdb.iso.org/lg/CDB-00137398-001">ryu</item>
+                                    <item AppInfo="Saba" ConceptLink="http://cdb.iso.org/lg/CDB-00137464-001">saa</item>
+                                    <item AppInfo="Buglere" ConceptLink="http://cdb.iso.org/lg/CDB-00137561-001">sab</item>
+                                    <item AppInfo="Meskwaki" ConceptLink="http://cdb.iso.org/lg/CDB-00137562-001">sac</item>
+                                    <item AppInfo="Sandawe" ConceptLink="http://cdb.iso.org/lg/CDB-00137568-001">sad</item>
+                                    <item AppInfo="SabanÄ" ConceptLink="http://cdb.iso.org/lg/CDB-00137570-001">sae</item>
+                                    <item AppInfo="Safaliba" ConceptLink="http://cdb.iso.org/lg/CDB-00137571-001">saf</item>
+                                    <item AppInfo="Sango; Sangho" ConceptLink="http://cdb.iso.org/lg/CDB-00138606-001">sag</item>
+                                    <item AppInfo="Yakut" ConceptLink="http://cdb.iso.org/lg/CDB-00137564-001">sah</item>
+                                    <item AppInfo="Sahu" ConceptLink="http://cdb.iso.org/lg/CDB-00137544-001">saj</item>
+                                    <item AppInfo="Sake" ConceptLink="http://cdb.iso.org/lg/CDB-00137545-001">sak</item>
+                                    <item AppInfo="Samaritan Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00138251-001">sam</item>
+                                    <item AppInfo="Sanskrit" ConceptLink="http://cdb.iso.org/lg/CDB-00138602-001">san</item>
+                                    <item AppInfo="Sause" ConceptLink="http://cdb.iso.org/lg/CDB-00137557-001">sao</item>
+                                    <item AppInfo="SanapanÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00137542-001">sap</item>
+                                    <item AppInfo="Samburu" ConceptLink="http://cdb.iso.org/lg/CDB-00137551-001">saq</item>
+                                    <item AppInfo="Saraveca" ConceptLink="http://cdb.iso.org/lg/CDB-00138254-001">sar</item>
+                                    <item AppInfo="Sasak" ConceptLink="http://cdb.iso.org/lg/CDB-00137555-001">sas</item>
+                                    <item AppInfo="Santali" ConceptLink="http://cdb.iso.org/lg/CDB-00137575-001">sat</item>
+                                    <item AppInfo="Saleman" ConceptLink="http://cdb.iso.org/lg/CDB-00137591-001">sau</item>
+                                    <item AppInfo="Saafi-Saafi" ConceptLink="http://cdb.iso.org/lg/CDB-00137592-001">sav</item>
+                                    <item AppInfo="Sawi" ConceptLink="http://cdb.iso.org/lg/CDB-00137593-001">saw</item>
+                                    <item AppInfo="Sa" ConceptLink="http://cdb.iso.org/lg/CDB-00137594-001">sax</item>
+                                    <item AppInfo="Saya" ConceptLink="http://cdb.iso.org/lg/CDB-00137595-001">say</item>
+                                    <item AppInfo="Saurashtra" ConceptLink="http://cdb.iso.org/lg/CDB-00137600-001">saz</item>
+                                    <item AppInfo="Ngambay" ConceptLink="http://cdb.iso.org/lg/CDB-00137601-001">sba</item>
+                                    <item AppInfo="Simbo" ConceptLink="http://cdb.iso.org/lg/CDB-00137602-001">sbb</item>
+                                    <item AppInfo="Kele" ConceptLink="http://cdb.iso.org/lg/CDB-00137604-001">sbc</item>
+                                    <item AppInfo="Southern Samo" ConceptLink="http://cdb.iso.org/lg/CDB-00137596-001">sbd</item>
+                                    <item AppInfo="Saliba" ConceptLink="http://cdb.iso.org/lg/CDB-00137576-001">sbe</item>
+                                    <item AppInfo="Shabo" ConceptLink="http://cdb.iso.org/lg/CDB-00137577-001">sbf</item>
+                                    <item AppInfo="Seget" ConceptLink="http://cdb.iso.org/lg/CDB-00137579-001">sbg</item>
+                                    <item AppInfo="Sori-Harengan" ConceptLink="http://cdb.iso.org/lg/CDB-00137589-001">sbh</item>
+                                    <item AppInfo="Seti" ConceptLink="http://cdb.iso.org/lg/CDB-00137581-001">sbi</item>
+                                    <item AppInfo="Surbakhal" ConceptLink="http://cdb.iso.org/lg/CDB-00137585-001">sbj</item>
+                                    <item AppInfo="Safwa" ConceptLink="http://cdb.iso.org/lg/CDB-00137586-001">sbk</item>
+                                    <item AppInfo="Botolan Sambal" ConceptLink="http://cdb.iso.org/lg/CDB-00137598-001">sbl</item>
+                                    <item AppInfo="Sagala" ConceptLink="http://cdb.iso.org/lg/CDB-00137556-001">sbm</item>
+                                    <item AppInfo="Sindhi Bhil" ConceptLink="http://cdb.iso.org/lg/CDB-00137495-001">sbn</item>
+                                    <item AppInfo="SabÃŒm" ConceptLink="http://cdb.iso.org/lg/CDB-00137498-001">sbo</item>
+                                    <item AppInfo="Sangu" ConceptLink="http://cdb.iso.org/lg/CDB-00137499-001">sbp</item>
+                                    <item AppInfo="Sileibi" ConceptLink="http://cdb.iso.org/lg/CDB-00137501-001">sbq</item>
+                                    <item AppInfo="Sembakung Murut" ConceptLink="http://cdb.iso.org/lg/CDB-00137494-001">sbr</item>
+                                    <item AppInfo="Subiya" ConceptLink="http://cdb.iso.org/lg/CDB-00137503-001">sbs</item>
+                                    <item AppInfo="Kimki" ConceptLink="http://cdb.iso.org/lg/CDB-00137504-001">sbt</item>
+                                    <item AppInfo="Stod Bhoti" ConceptLink="http://cdb.iso.org/lg/CDB-00137506-001">sbu</item>
+                                    <item AppInfo="Sabine" ConceptLink="http://cdb.iso.org/lg/CDB-00138389-001">sbv</item>
+                                    <item AppInfo="Simba" ConceptLink="http://cdb.iso.org/lg/CDB-00137479-001">sbw</item>
+                                    <item AppInfo="Seberuang" ConceptLink="http://cdb.iso.org/lg/CDB-00137500-001">sbx</item>
+                                    <item AppInfo="Soli" ConceptLink="http://cdb.iso.org/lg/CDB-00137490-001">sby</item>
+                                    <item AppInfo="Sara Kaba" ConceptLink="http://cdb.iso.org/lg/CDB-00137489-001">sbz</item>
+                                    <item AppInfo="Sansu" ConceptLink="http://cdb.iso.org/lg/CDB-00137488-001">sca</item>
+                                    <item AppInfo="Chut" ConceptLink="http://cdb.iso.org/lg/CDB-00137487-001">scb</item>
+                                    <item AppInfo="Dongxiang" ConceptLink="http://cdb.iso.org/lg/CDB-00137485-001">sce</item>
+                                    <item AppInfo="San Miguel Creole French" ConceptLink="http://cdb.iso.org/lg/CDB-00137482-001">scf</item>
+                                    <item AppInfo="Sanggau" ConceptLink="http://cdb.iso.org/lg/CDB-00137481-001">scg</item>
+                                    <item AppInfo="Sakachep" ConceptLink="http://cdb.iso.org/lg/CDB-00137511-001">sch</item>
+                                    <item AppInfo="Sri Lankan Creole Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00137534-001">sci</item>
+                                    <item AppInfo="Sadri" ConceptLink="http://cdb.iso.org/lg/CDB-00137528-001">sck</item>
+                                    <item AppInfo="Shina" ConceptLink="http://cdb.iso.org/lg/CDB-00137529-001">scl</item>
+                                    <item AppInfo="Sicilian" ConceptLink="http://cdb.iso.org/lg/CDB-00137535-001">scn</item>
+                                    <item AppInfo="Lowlands Scots; Scots; Lallans" ConceptLink="http://cdb.iso.org/lg/CDB-00137532-001">sco</item>
+                                    <item AppInfo="Helambu Sherpa" ConceptLink="http://cdb.iso.org/lg/CDB-00137512-001">scp</item>
+                                    <item AppInfo="Sa'och" ConceptLink="http://cdb.iso.org/lg/CDB-00137513-001">scq</item>
+                                    <item AppInfo="North Slavey" ConceptLink="http://cdb.iso.org/lg/CDB-00137525-001">scs</item>
+                                    <item AppInfo="Shumcho" ConceptLink="http://cdb.iso.org/lg/CDB-00137519-001">scu</item>
+                                    <item AppInfo="Sheni" ConceptLink="http://cdb.iso.org/lg/CDB-00137443-001">scv</item>
+                                    <item AppInfo="Sha" ConceptLink="http://cdb.iso.org/lg/CDB-00137524-001">scw</item>
+                                    <item AppInfo="Sicel" ConceptLink="http://cdb.iso.org/lg/CDB-00138444-001">scx</item>
+                                    <item AppInfo="Toraja-Sa'dan" ConceptLink="http://cdb.iso.org/lg/CDB-00137523-001">sda</item>
+                                    <item AppInfo="Shabak" ConceptLink="http://cdb.iso.org/lg/CDB-00137522-001">sdb</item>
+                                    <item AppInfo="Sassarese Sardinian" ConceptLink="http://cdb.iso.org/lg/CDB-00137521-001">sdc</item>
+                                    <item AppInfo="Surubu" ConceptLink="http://cdb.iso.org/lg/CDB-00137520-001">sde</item>
+                                    <item AppInfo="Sarli" ConceptLink="http://cdb.iso.org/lg/CDB-00137510-001">sdf</item>
+                                    <item AppInfo="Savi" ConceptLink="http://cdb.iso.org/lg/CDB-00137517-001">sdg</item>
+                                    <item AppInfo="Southern Kurdish" ConceptLink="http://cdb.iso.org/lg/CDB-00137515-001">sdh</item>
+                                    <item AppInfo="Suundi" ConceptLink="http://cdb.iso.org/lg/CDB-00137514-001">sdj</item>
+                                    <item AppInfo="Sos Kundi" ConceptLink="http://cdb.iso.org/lg/CDB-00137516-001">sdk</item>
+                                    <item AppInfo="Saudi Arabian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137518-001">sdl</item>
+                                    <item AppInfo="Semandang" ConceptLink="http://cdb.iso.org/lg/CDB-00137540-001">sdm</item>
+                                    <item AppInfo="Gallurese Sardinian" ConceptLink="http://cdb.iso.org/lg/CDB-00137539-001">sdn</item>
+                                    <item AppInfo="Bukar-Sadung Bidayuh" ConceptLink="http://cdb.iso.org/lg/CDB-00137538-001">sdo</item>
+                                    <item AppInfo="Sherdukpen" ConceptLink="http://cdb.iso.org/lg/CDB-00137537-001">sdp</item>
+                                    <item AppInfo="Oraon Sadri" ConceptLink="http://cdb.iso.org/lg/CDB-00137536-001">sdr</item>
+                                    <item AppInfo="Sened" ConceptLink="http://cdb.iso.org/lg/CDB-00138183-001">sds</item>
+                                    <item AppInfo="Shuadit" ConceptLink="http://cdb.iso.org/lg/CDB-00138182-001">sdt</item>
+                                    <item AppInfo="Sarudu" ConceptLink="http://cdb.iso.org/lg/CDB-00137526-001">sdu</item>
+                                    <item AppInfo="Sibu Melanau" ConceptLink="http://cdb.iso.org/lg/CDB-00137533-001">sdx</item>
+                                    <item AppInfo="Sallands" ConceptLink="http://cdb.iso.org/lg/CDB-00137541-001">sdz</item>
+                                    <item AppInfo="Semai" ConceptLink="http://cdb.iso.org/lg/CDB-00137531-001">sea</item>
+                                    <item AppInfo="Shempire Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137530-001">seb</item>
+                                    <item AppInfo="Sechelt" ConceptLink="http://cdb.iso.org/lg/CDB-00137508-001">sec</item>
+                                    <item AppInfo="Sedang" ConceptLink="http://cdb.iso.org/lg/CDB-00137480-001">sed</item>
+                                    <item AppInfo="Seneca" ConceptLink="http://cdb.iso.org/lg/CDB-00137483-001">see</item>
+                                    <item AppInfo="Cebaara Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137484-001">sef</item>
+                                    <item AppInfo="Segeju" ConceptLink="http://cdb.iso.org/lg/CDB-00137486-001">seg</item>
+                                    <item AppInfo="Sena" ConceptLink="http://cdb.iso.org/lg/CDB-00137491-001">seh</item>
+                                    <item AppInfo="Seri" ConceptLink="http://cdb.iso.org/lg/CDB-00137492-001">sei</item>
+                                    <item AppInfo="Sene" ConceptLink="http://cdb.iso.org/lg/CDB-00137502-001">sej</item>
+                                    <item AppInfo="Sekani" ConceptLink="http://cdb.iso.org/lg/CDB-00137507-001">sek</item>
+                                    <item AppInfo="Selkup" ConceptLink="http://cdb.iso.org/lg/CDB-00137505-001">sel</item>
+                                    <item AppInfo="NanerigÃ© SÃ©noufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137509-001">sen</item>
+                                    <item AppInfo="Suarmin" ConceptLink="http://cdb.iso.org/lg/CDB-00137497-001">seo</item>
+                                    <item AppInfo="SÄcÄtÃ© SÃ©noufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137496-001">sep</item>
+                                    <item AppInfo="Senara SÃ©noufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137527-001">seq</item>
+                                    <item AppInfo="Serrano" ConceptLink="http://cdb.iso.org/lg/CDB-00137587-001">ser</item>
+                                    <item AppInfo="Koyraboro Senni Songhai" ConceptLink="http://cdb.iso.org/lg/CDB-00137584-001">ses</item>
+                                    <item AppInfo="Sentani" ConceptLink="http://cdb.iso.org/lg/CDB-00137583-001">set</item>
+                                    <item AppInfo="Serui-Laut" ConceptLink="http://cdb.iso.org/lg/CDB-00137574-001">seu</item>
+                                    <item AppInfo="Nyarafolo Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137578-001">sev</item>
+                                    <item AppInfo="Sewa Bay" ConceptLink="http://cdb.iso.org/lg/CDB-00137580-001">sew</item>
+                                    <item AppInfo="Secoya" ConceptLink="http://cdb.iso.org/lg/CDB-00137582-001">sey</item>
+                                    <item AppInfo="Senthang Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00137603-001">sez</item>
+                                    <item AppInfo="Langue des signes de Belgique Francophone" ConceptLink="http://cdb.iso.org/lg/CDB-00137599-001">sfb</item>
+                                    <item AppInfo="Small Flowery Miao" ConceptLink="http://cdb.iso.org/lg/CDB-00137590-001">sfm</item>
+                                    <item AppInfo="South African Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137597-001">sfs</item>
+                                    <item AppInfo="Sehwi" ConceptLink="http://cdb.iso.org/lg/CDB-00137605-001">sfw</item>
+                                    <item AppInfo="Old Irish" ConceptLink="http://cdb.iso.org/lg/CDB-00137867-001">sga</item>
+                                    <item AppInfo="Mag-Anchi Ayta" ConceptLink="http://cdb.iso.org/lg/CDB-00137566-001">sgb</item>
+                                    <item AppInfo="Kipsigis" ConceptLink="http://cdb.iso.org/lg/CDB-00137543-001">sgc</item>
+                                    <item AppInfo="Segai" ConceptLink="http://cdb.iso.org/lg/CDB-00137554-001">sge</item>
+                                    <item AppInfo="Swiss-German Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137553-001">sgg</item>
+                                    <item AppInfo="Shughni" ConceptLink="http://cdb.iso.org/lg/CDB-00137552-001">sgh</item>
+                                    <item AppInfo="Suga" ConceptLink="http://cdb.iso.org/lg/CDB-00137549-001">sgi</item>
+                                    <item AppInfo="Sangkong" ConceptLink="http://cdb.iso.org/lg/CDB-00137547-001">sgk</item>
+                                    <item AppInfo="Sanglechi-Ishkashimi" ConceptLink="http://cdb.iso.org/lg/CDB-00137546-001">sgl</item>
+                                    <item AppInfo="Singa" ConceptLink="http://cdb.iso.org/lg/CDB-00138298-001">sgm</item>
+                                    <item AppInfo="Songa" ConceptLink="http://cdb.iso.org/lg/CDB-00137548-001">sgo</item>
+                                    <item AppInfo="Singpho" ConceptLink="http://cdb.iso.org/lg/CDB-00137550-001">sgp</item>
+                                    <item AppInfo="Sangisari" ConceptLink="http://cdb.iso.org/lg/CDB-00137572-001">sgr</item>
+                                    <item AppInfo="Brokpake" ConceptLink="http://cdb.iso.org/lg/CDB-00137569-001">sgt</item>
+                                    <item AppInfo="Salas" ConceptLink="http://cdb.iso.org/lg/CDB-00137567-001">sgu</item>
+                                    <item AppInfo="Sebat Bet Gurage" ConceptLink="http://cdb.iso.org/lg/CDB-00137558-001">sgw</item>
+                                    <item AppInfo="Sierra Leone Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137565-001">sgx</item>
+                                    <item AppInfo="Sursurunga" ConceptLink="http://cdb.iso.org/lg/CDB-00137573-001">sgz</item>
+                                    <item AppInfo="Shall-Zwall" ConceptLink="http://cdb.iso.org/lg/CDB-00137563-001">sha</item>
+                                    <item AppInfo="Ninam" ConceptLink="http://cdb.iso.org/lg/CDB-00137560-001">shb</item>
+                                    <item AppInfo="Sonde" ConceptLink="http://cdb.iso.org/lg/CDB-00137588-001">shc</item>
+                                    <item AppInfo="Sheko" ConceptLink="http://cdb.iso.org/lg/CDB-00137493-001">she</item>
+                                    <item AppInfo="Shua" ConceptLink="http://cdb.iso.org/lg/CDB-00137397-001">shg</item>
+                                    <item AppInfo="Shoshoni" ConceptLink="http://cdb.iso.org/lg/CDB-00137396-001">shh</item>
+                                    <item AppInfo="Tachelhit" ConceptLink="http://cdb.iso.org/lg/CDB-00137395-001">shi</item>
+                                    <item AppInfo="Shatt" ConceptLink="http://cdb.iso.org/lg/CDB-00137391-001">shj</item>
+                                    <item AppInfo="Shilluk" ConceptLink="http://cdb.iso.org/lg/CDB-00137389-001">shk</item>
+                                    <item AppInfo="Shendu" ConceptLink="http://cdb.iso.org/lg/CDB-00137387-001">shl</item>
+                                    <item AppInfo="Shahrudi" ConceptLink="http://cdb.iso.org/lg/CDB-00137406-001">shm</item>
+                                    <item AppInfo="Shan" ConceptLink="http://cdb.iso.org/lg/CDB-00137390-001">shn</item>
+                                    <item AppInfo="Shanga" ConceptLink="http://cdb.iso.org/lg/CDB-00137414-001">sho</item>
+                                    <item AppInfo="Shipibo-Conibo" ConceptLink="http://cdb.iso.org/lg/CDB-00137413-001">shp</item>
+                                    <item AppInfo="Sala" ConceptLink="http://cdb.iso.org/lg/CDB-00137411-001">shq</item>
+                                    <item AppInfo="Shi" ConceptLink="http://cdb.iso.org/lg/CDB-00137410-001">shr</item>
+                                    <item AppInfo="Shuswap" ConceptLink="http://cdb.iso.org/lg/CDB-00137409-001">shs</item>
+                                    <item AppInfo="Shasta" ConceptLink="http://cdb.iso.org/lg/CDB-00137966-001">sht</item>
+                                    <item AppInfo="Chadian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00137415-001">shu</item>
+                                    <item AppInfo="Shehri" ConceptLink="http://cdb.iso.org/lg/CDB-00137405-001">shv</item>
+                                    <item AppInfo="Shwai" ConceptLink="http://cdb.iso.org/lg/CDB-00137404-001">shw</item>
+                                    <item AppInfo="She" ConceptLink="http://cdb.iso.org/lg/CDB-00137402-001">shx</item>
+                                    <item AppInfo="Tachawit" ConceptLink="http://cdb.iso.org/lg/CDB-00137382-001">shy</item>
+                                    <item AppInfo="Syenara Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137355-001">shz</item>
+                                    <item AppInfo="Akkala Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137356-001">sia</item>
+                                    <item AppInfo="Sebop" ConceptLink="http://cdb.iso.org/lg/CDB-00137357-001">sib</item>
+                                    <item AppInfo="Sidamo" ConceptLink="http://cdb.iso.org/lg/CDB-00137358-001">sid</item>
+                                    <item AppInfo="Simaa" ConceptLink="http://cdb.iso.org/lg/CDB-00137359-001">sie</item>
+                                    <item AppInfo="Siamou" ConceptLink="http://cdb.iso.org/lg/CDB-00137360-001">sif</item>
+                                    <item AppInfo="Paasaal" ConceptLink="http://cdb.iso.org/lg/CDB-00137362-001">sig</item>
+                                    <item AppInfo="Zire" ConceptLink="http://cdb.iso.org/lg/CDB-00137366-001">sih</item>
+                                    <item AppInfo="Shom Peng" ConceptLink="http://cdb.iso.org/lg/CDB-00137374-001">sii</item>
+                                    <item AppInfo="Numbami" ConceptLink="http://cdb.iso.org/lg/CDB-00137353-001">sij</item>
+                                    <item AppInfo="Sikiana" ConceptLink="http://cdb.iso.org/lg/CDB-00137380-001">sik</item>
+                                    <item AppInfo="Tumulung Sisaala" ConceptLink="http://cdb.iso.org/lg/CDB-00137377-001">sil</item>
+                                    <item AppInfo="Mende" ConceptLink="http://cdb.iso.org/lg/CDB-00137368-001">sim</item>
+                                    <item AppInfo="Sinhala; Sinhalese; Singhalese" ConceptLink="http://cdb.iso.org/lg/CDB-00138608-001">sin</item>
+                                    <item AppInfo="Sikkimese" ConceptLink="http://cdb.iso.org/lg/CDB-00137375-001">sip</item>
+                                    <item AppInfo="Sonia" ConceptLink="http://cdb.iso.org/lg/CDB-00137383-001">siq</item>
+                                    <item AppInfo="Siri" ConceptLink="http://cdb.iso.org/lg/CDB-00137373-001">sir</item>
+                                    <item AppInfo="Siuslaw" ConceptLink="http://cdb.iso.org/lg/CDB-00137922-001">sis</item>
+                                    <item AppInfo="Sinagen" ConceptLink="http://cdb.iso.org/lg/CDB-00137372-001">siu</item>
+                                    <item AppInfo="Sumariup" ConceptLink="http://cdb.iso.org/lg/CDB-00137430-001">siv</item>
+                                    <item AppInfo="Siwai" ConceptLink="http://cdb.iso.org/lg/CDB-00137367-001">siw</item>
+                                    <item AppInfo="Sumau" ConceptLink="http://cdb.iso.org/lg/CDB-00137401-001">six</item>
+                                    <item AppInfo="Sivandi" ConceptLink="http://cdb.iso.org/lg/CDB-00137460-001">siy</item>
+                                    <item AppInfo="Siwi" ConceptLink="http://cdb.iso.org/lg/CDB-00137459-001">siz</item>
+                                    <item AppInfo="Epena" ConceptLink="http://cdb.iso.org/lg/CDB-00137457-001">sja</item>
+                                    <item AppInfo="Sajau Basap" ConceptLink="http://cdb.iso.org/lg/CDB-00137456-001">sjb</item>
+                                    <item AppInfo="Kildin Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137447-001">sjd</item>
+                                    <item AppInfo="Pite Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137454-001">sje</item>
+                                    <item AppInfo="Assangori" ConceptLink="http://cdb.iso.org/lg/CDB-00137451-001">sjg</item>
+                                    <item AppInfo="Kemi Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137950-001">sjk</item>
+                                    <item AppInfo="Sajalong" ConceptLink="http://cdb.iso.org/lg/CDB-00137450-001">sjl</item>
+                                    <item AppInfo="Mapun" ConceptLink="http://cdb.iso.org/lg/CDB-00137449-001">sjm</item>
+                                    <item AppInfo="Sindarin" ConceptLink="http://cdb.iso.org/lg/CDB-00138355-001">sjn</item>
+                                    <item AppInfo="Xibe" ConceptLink="http://cdb.iso.org/lg/CDB-00137453-001">sjo</item>
+                                    <item AppInfo="Surjapuri" ConceptLink="http://cdb.iso.org/lg/CDB-00137477-001">sjp</item>
+                                    <item AppInfo="Siar-Lak" ConceptLink="http://cdb.iso.org/lg/CDB-00137476-001">sjr</item>
+                                    <item AppInfo="Senhaja De Srair" ConceptLink="http://cdb.iso.org/lg/CDB-00137935-001">sjs</item>
+                                    <item AppInfo="Ter Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137474-001">sjt</item>
+                                    <item AppInfo="Ume Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137473-001">sju</item>
+                                    <item AppInfo="Shawnee" ConceptLink="http://cdb.iso.org/lg/CDB-00137470-001">sjw</item>
+                                    <item AppInfo="Skagit" ConceptLink="http://cdb.iso.org/lg/CDB-00137466-001">ska</item>
+                                    <item AppInfo="Saek" ConceptLink="http://cdb.iso.org/lg/CDB-00137465-001">skb</item>
+                                    <item AppInfo="Sauk" ConceptLink="http://cdb.iso.org/lg/CDB-00137471-001">skc</item>
+                                    <item AppInfo="Southern Sierra Miwok" ConceptLink="http://cdb.iso.org/lg/CDB-00137448-001">skd</item>
+                                    <item AppInfo="Seke" ConceptLink="http://cdb.iso.org/lg/CDB-00137417-001">ske</item>
+                                    <item AppInfo="SakirabiÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00137418-001">skf</item>
+                                    <item AppInfo="Sakalava Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00137420-001">skg</item>
+                                    <item AppInfo="Sikule" ConceptLink="http://cdb.iso.org/lg/CDB-00137422-001">skh</item>
+                                    <item AppInfo="Sika" ConceptLink="http://cdb.iso.org/lg/CDB-00137424-001">ski</item>
+                                    <item AppInfo="Seke" ConceptLink="http://cdb.iso.org/lg/CDB-00137427-001">skj</item>
+                                    <item AppInfo="Sok" ConceptLink="http://cdb.iso.org/lg/CDB-00137428-001">skk</item>
+                                    <item AppInfo="Sakam" ConceptLink="http://cdb.iso.org/lg/CDB-00137437-001">skm</item>
+                                    <item AppInfo="Kolibugan Subanon" ConceptLink="http://cdb.iso.org/lg/CDB-00137439-001">skn</item>
+                                    <item AppInfo="Seko Tengah" ConceptLink="http://cdb.iso.org/lg/CDB-00137416-001">sko</item>
+                                    <item AppInfo="Sekapan" ConceptLink="http://cdb.iso.org/lg/CDB-00137444-001">skp</item>
+                                    <item AppInfo="Sininkere" ConceptLink="http://cdb.iso.org/lg/CDB-00137442-001">skq</item>
+                                    <item AppInfo="Seraiki" ConceptLink="http://cdb.iso.org/lg/CDB-00137440-001">skr</item>
+                                    <item AppInfo="Maia" ConceptLink="http://cdb.iso.org/lg/CDB-00137431-001">sks</item>
+                                    <item AppInfo="Sakata" ConceptLink="http://cdb.iso.org/lg/CDB-00137438-001">skt</item>
+                                    <item AppInfo="Sakao" ConceptLink="http://cdb.iso.org/lg/CDB-00137446-001">sku</item>
+                                    <item AppInfo="Skou" ConceptLink="http://cdb.iso.org/lg/CDB-00137436-001">skv</item>
+                                    <item AppInfo="Skepi Creole Dutch" ConceptLink="http://cdb.iso.org/lg/CDB-00138111-001">skw</item>
+                                    <item AppInfo="Seko Padang" ConceptLink="http://cdb.iso.org/lg/CDB-00137435-001">skx</item>
+                                    <item AppInfo="Sikaiana" ConceptLink="http://cdb.iso.org/lg/CDB-00137433-001">sky</item>
+                                    <item AppInfo="Sekar" ConceptLink="http://cdb.iso.org/lg/CDB-00137432-001">skz</item>
+                                    <item AppInfo="SÃ¡liba" ConceptLink="http://cdb.iso.org/lg/CDB-00137369-001">slc</item>
+                                    <item AppInfo="Sissala" ConceptLink="http://cdb.iso.org/lg/CDB-00137648-001">sld</item>
+                                    <item AppInfo="Sholaga" ConceptLink="http://cdb.iso.org/lg/CDB-00137799-001">sle</item>
+                                    <item AppInfo="Swiss-Italian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137841-001">slf</item>
+                                    <item AppInfo="Selungai Murut" ConceptLink="http://cdb.iso.org/lg/CDB-00137744-001">slg</item>
+                                    <item AppInfo="Southern Puget Sound Salish" ConceptLink="http://cdb.iso.org/lg/CDB-00137747-001">slh</item>
+                                    <item AppInfo="Lower Silesian" ConceptLink="http://cdb.iso.org/lg/CDB-00137745-001">sli</item>
+                                    <item AppInfo="SalumÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00137738-001">slj</item>
+                                    <item AppInfo="Slovak" ConceptLink="http://cdb.iso.org/lg/CDB-00138609-001">slk</item>
+                                    <item AppInfo="Salt-Yui" ConceptLink="http://cdb.iso.org/lg/CDB-00137767-001">sll</item>
+                                    <item AppInfo="Pangutaran Sama" ConceptLink="http://cdb.iso.org/lg/CDB-00137765-001">slm</item>
+                                    <item AppInfo="Salinan" ConceptLink="http://cdb.iso.org/lg/CDB-00138113-001">sln</item>
+                                    <item AppInfo="Lamaholot" ConceptLink="http://cdb.iso.org/lg/CDB-00137763-001">slp</item>
+                                    <item AppInfo="Salchuq" ConceptLink="http://cdb.iso.org/lg/CDB-00137764-001">slq</item>
+                                    <item AppInfo="Salar" ConceptLink="http://cdb.iso.org/lg/CDB-00137769-001">slr</item>
+                                    <item AppInfo="Singapore Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137770-001">sls</item>
+                                    <item AppInfo="Sila" ConceptLink="http://cdb.iso.org/lg/CDB-00137771-001">slt</item>
+                                    <item AppInfo="Selaru" ConceptLink="http://cdb.iso.org/lg/CDB-00137772-001">slu</item>
+                                    <item AppInfo="Slovenian" ConceptLink="http://cdb.iso.org/lg/CDB-00138610-001">slv</item>
+                                    <item AppInfo="Sialum" ConceptLink="http://cdb.iso.org/lg/CDB-00137774-001">slw</item>
+                                    <item AppInfo="Salampasu" ConceptLink="http://cdb.iso.org/lg/CDB-00137782-001">slx</item>
+                                    <item AppInfo="Selayar" ConceptLink="http://cdb.iso.org/lg/CDB-00137789-001">sly</item>
+                                    <item AppInfo="Ma'ya" ConceptLink="http://cdb.iso.org/lg/CDB-00137788-001">slz</item>
+                                    <item AppInfo="Southern Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137787-001">sma</item>
+                                    <item AppInfo="Simbari" ConceptLink="http://cdb.iso.org/lg/CDB-00137786-001">smb</item>
+                                    <item AppInfo="Som" ConceptLink="http://cdb.iso.org/lg/CDB-00137776-001">smc</item>
+                                    <item AppInfo="Sama" ConceptLink="http://cdb.iso.org/lg/CDB-00137783-001">smd</item>
+                                    <item AppInfo="Northern Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00138605-001">sme</item>
+                                    <item AppInfo="Auwe" ConceptLink="http://cdb.iso.org/lg/CDB-00137791-001">smf</item>
+                                    <item AppInfo="Simbali" ConceptLink="http://cdb.iso.org/lg/CDB-00137781-001">smg</item>
+                                    <item AppInfo="Samei" ConceptLink="http://cdb.iso.org/lg/CDB-00137780-001">smh</item>
+                                    <item AppInfo="Lule Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137790-001">smj</item>
+                                    <item AppInfo="Bolinao" ConceptLink="http://cdb.iso.org/lg/CDB-00137733-001">smk</item>
+                                    <item AppInfo="Central Sama" ConceptLink="http://cdb.iso.org/lg/CDB-00137734-001">sml</item>
+                                    <item AppInfo="Musasa" ConceptLink="http://cdb.iso.org/lg/CDB-00137736-001">smm</item>
+                                    <item AppInfo="Inari Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137441-001">smn</item>
+                                    <item AppInfo="Samoan" ConceptLink="http://cdb.iso.org/lg/CDB-00138611-001">smo</item>
+                                    <item AppInfo="Samaritan" ConceptLink="http://cdb.iso.org/lg/CDB-00138062-001">smp</item>
+                                    <item AppInfo="Samo" ConceptLink="http://cdb.iso.org/lg/CDB-00137760-001">smq</item>
+                                    <item AppInfo="Simeulue" ConceptLink="http://cdb.iso.org/lg/CDB-00137750-001">smr</item>
+                                    <item AppInfo="Skolt Sami" ConceptLink="http://cdb.iso.org/lg/CDB-00137751-001">sms</item>
+                                    <item AppInfo="Simte" ConceptLink="http://cdb.iso.org/lg/CDB-00137753-001">smt</item>
+                                    <item AppInfo="Somray" ConceptLink="http://cdb.iso.org/lg/CDB-00137755-001">smu</item>
+                                    <item AppInfo="Samvedi" ConceptLink="http://cdb.iso.org/lg/CDB-00137805-001">smv</item>
+                                    <item AppInfo="Sumbawa" ConceptLink="http://cdb.iso.org/lg/CDB-00137777-001">smw</item>
+                                    <item AppInfo="Samba" ConceptLink="http://cdb.iso.org/lg/CDB-00137844-001">smx</item>
+                                    <item AppInfo="Semnani" ConceptLink="http://cdb.iso.org/lg/CDB-00137824-001">smy</item>
+                                    <item AppInfo="Simeku" ConceptLink="http://cdb.iso.org/lg/CDB-00137836-001">smz</item>
+                                    <item AppInfo="Shona" ConceptLink="http://cdb.iso.org/lg/CDB-00138612-001">sna</item>
+                                    <item AppInfo="Sebuyau" ConceptLink="http://cdb.iso.org/lg/CDB-00137834-001">snb</item>
+                                    <item AppInfo="Sinaugoro" ConceptLink="http://cdb.iso.org/lg/CDB-00137832-001">snc</item>
+                                    <item AppInfo="Sindhi" ConceptLink="http://cdb.iso.org/lg/CDB-00138604-001">snd</item>
+                                    <item AppInfo="Bau Bidayuh" ConceptLink="http://cdb.iso.org/lg/CDB-00137831-001">sne</item>
+                                    <item AppInfo="Noon" ConceptLink="http://cdb.iso.org/lg/CDB-00137829-001">snf</item>
+                                    <item AppInfo="Sanga" ConceptLink="http://cdb.iso.org/lg/CDB-00137835-001">sng</item>
+                                    <item AppInfo="Shinabo" ConceptLink="http://cdb.iso.org/lg/CDB-00138043-001">snh</item>
+                                    <item AppInfo="Sensi" ConceptLink="http://cdb.iso.org/lg/CDB-00138042-001">sni</item>
+                                    <item AppInfo="Riverain Sango" ConceptLink="http://cdb.iso.org/lg/CDB-00137830-001">snj</item>
+                                    <item AppInfo="Soninke" ConceptLink="http://cdb.iso.org/lg/CDB-00137837-001">snk</item>
+                                    <item AppInfo="Sangil" ConceptLink="http://cdb.iso.org/lg/CDB-00137849-001">snl</item>
+                                    <item AppInfo="Southern Ma'di" ConceptLink="http://cdb.iso.org/lg/CDB-00137838-001">snm</item>
+                                    <item AppInfo="Siona" ConceptLink="http://cdb.iso.org/lg/CDB-00137839-001">snn</item>
+                                    <item AppInfo="Snohomish" ConceptLink="http://cdb.iso.org/lg/CDB-00137833-001">sno</item>
+                                    <item AppInfo="Siane" ConceptLink="http://cdb.iso.org/lg/CDB-00137806-001">snp</item>
+                                    <item AppInfo="Sangu" ConceptLink="http://cdb.iso.org/lg/CDB-00137794-001">snq</item>
+                                    <item AppInfo="Sihan" ConceptLink="http://cdb.iso.org/lg/CDB-00137800-001">snr</item>
+                                    <item AppInfo="South West Bay" ConceptLink="http://cdb.iso.org/lg/CDB-00137820-001">sns</item>
+                                    <item AppInfo="Senggi" ConceptLink="http://cdb.iso.org/lg/CDB-00137819-001">snu</item>
+                                    <item AppInfo="Sa'ban" ConceptLink="http://cdb.iso.org/lg/CDB-00137817-001">snv</item>
+                                    <item AppInfo="Selee" ConceptLink="http://cdb.iso.org/lg/CDB-00137823-001">snw</item>
+                                    <item AppInfo="Sam" ConceptLink="http://cdb.iso.org/lg/CDB-00137812-001">snx</item>
+                                    <item AppInfo="Saniyo-Hiyewe" ConceptLink="http://cdb.iso.org/lg/CDB-00137811-001">sny</item>
+                                    <item AppInfo="Sinsauru" ConceptLink="http://cdb.iso.org/lg/CDB-00137809-001">snz</item>
+                                    <item AppInfo="Thai Song" ConceptLink="http://cdb.iso.org/lg/CDB-00137748-001">soa</item>
+                                    <item AppInfo="Sobei" ConceptLink="http://cdb.iso.org/lg/CDB-00137639-001">sob</item>
+                                    <item AppInfo="So" ConceptLink="http://cdb.iso.org/lg/CDB-00137640-001">soc</item>
+                                    <item AppInfo="Songoora" ConceptLink="http://cdb.iso.org/lg/CDB-00137644-001">sod</item>
+                                    <item AppInfo="Songomeno" ConceptLink="http://cdb.iso.org/lg/CDB-00137647-001">soe</item>
+                                    <item AppInfo="Sogdian" ConceptLink="http://cdb.iso.org/lg/CDB-00138366-001">sog</item>
+                                    <item AppInfo="Aka" ConceptLink="http://cdb.iso.org/lg/CDB-00137658-001">soh</item>
+                                    <item AppInfo="Sonha" ConceptLink="http://cdb.iso.org/lg/CDB-00137660-001">soi</item>
+                                    <item AppInfo="Soi" ConceptLink="http://cdb.iso.org/lg/CDB-00137662-001">soj</item>
+                                    <item AppInfo="Sokoro" ConceptLink="http://cdb.iso.org/lg/CDB-00137661-001">sok</item>
+                                    <item AppInfo="Solos" ConceptLink="http://cdb.iso.org/lg/CDB-00137667-001">sol</item>
+                                    <item AppInfo="Somali" ConceptLink="http://cdb.iso.org/lg/CDB-00138613-001">som</item>
+                                    <item AppInfo="Songo" ConceptLink="http://cdb.iso.org/lg/CDB-00137655-001">soo</item>
+                                    <item AppInfo="Songe" ConceptLink="http://cdb.iso.org/lg/CDB-00137653-001">sop</item>
+                                    <item AppInfo="Kanasi" ConceptLink="http://cdb.iso.org/lg/CDB-00137635-001">soq</item>
+                                    <item AppInfo="Somrai" ConceptLink="http://cdb.iso.org/lg/CDB-00137651-001">sor</item>
+                                    <item AppInfo="Seeku" ConceptLink="http://cdb.iso.org/lg/CDB-00137609-001">sos</item>
+                                    <item AppInfo="Sesotho; Southern Sotho" ConceptLink="http://cdb.iso.org/lg/CDB-00138617-001">sot</item>
+                                    <item AppInfo="Southern Thai" ConceptLink="http://cdb.iso.org/lg/CDB-00137610-001">sou</item>
+                                    <item AppInfo="Sonsorol" ConceptLink="http://cdb.iso.org/lg/CDB-00137614-001">sov</item>
+                                    <item AppInfo="Sowanda" ConceptLink="http://cdb.iso.org/lg/CDB-00137618-001">sow</item>
+                                    <item AppInfo="So" ConceptLink="http://cdb.iso.org/lg/CDB-00137619-001">sox</item>
+                                    <item AppInfo="Miyobe" ConceptLink="http://cdb.iso.org/lg/CDB-00137629-001">soy</item>
+                                    <item AppInfo="Temi" ConceptLink="http://cdb.iso.org/lg/CDB-00137634-001">soz</item>
+                                    <item AppInfo="Spanish; Castilian" ConceptLink="http://cdb.iso.org/lg/CDB-00138504-001">spa</item>
+                                    <item AppInfo="Sepa" ConceptLink="http://cdb.iso.org/lg/CDB-00137633-001">spb</item>
+                                    <item AppInfo="SapÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00137621-001">spc</item>
+                                    <item AppInfo="Saep" ConceptLink="http://cdb.iso.org/lg/CDB-00137628-001">spd</item>
+                                    <item AppInfo="Sepa" ConceptLink="http://cdb.iso.org/lg/CDB-00137626-001">spe</item>
+                                    <item AppInfo="Sian" ConceptLink="http://cdb.iso.org/lg/CDB-00137625-001">spg</item>
+                                    <item AppInfo="Saponi" ConceptLink="http://cdb.iso.org/lg/CDB-00137624-001">spi</item>
+                                    <item AppInfo="Sengo" ConceptLink="http://cdb.iso.org/lg/CDB-00137623-001">spk</item>
+                                    <item AppInfo="Selepet" ConceptLink="http://cdb.iso.org/lg/CDB-00137622-001">spl</item>
+                                    <item AppInfo="Sepen" ConceptLink="http://cdb.iso.org/lg/CDB-00137716-001">spm</item>
+                                    <item AppInfo="Spokane" ConceptLink="http://cdb.iso.org/lg/CDB-00137666-001">spo</item>
+                                    <item AppInfo="Supyire Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00137712-001">spp</item>
+                                    <item AppInfo="Loreto-Ucayali Spanish" ConceptLink="http://cdb.iso.org/lg/CDB-00137711-001">spq</item>
+                                    <item AppInfo="Saparua" ConceptLink="http://cdb.iso.org/lg/CDB-00137710-001">spr</item>
+                                    <item AppInfo="Saposa" ConceptLink="http://cdb.iso.org/lg/CDB-00137709-001">sps</item>
+                                    <item AppInfo="Spiti Bhoti" ConceptLink="http://cdb.iso.org/lg/CDB-00137708-001">spt</item>
+                                    <item AppInfo="Sapuan" ConceptLink="http://cdb.iso.org/lg/CDB-00137704-001">spu</item>
+                                    <item AppInfo="South Picene" ConceptLink="http://cdb.iso.org/lg/CDB-00138364-001">spx</item>
+                                    <item AppInfo="Sabaot" ConceptLink="http://cdb.iso.org/lg/CDB-00137703-001">spy</item>
+                                    <item AppInfo="Shama-Sambuga" ConceptLink="http://cdb.iso.org/lg/CDB-00137702-001">sqa</item>
+                                    <item AppInfo="Shau" ConceptLink="http://cdb.iso.org/lg/CDB-00137701-001">sqh</item>
+                                    <item AppInfo="Albanian" ConceptLink="http://cdb.iso.org/lg/CDB-00138614-001">sqi</item>
+                                    <item AppInfo="Suma" ConceptLink="http://cdb.iso.org/lg/CDB-00137707-001">sqm</item>
+                                    <item AppInfo="Susquehannock" ConceptLink="http://cdb.iso.org/lg/CDB-00138089-001">sqn</item>
+                                    <item AppInfo="Sorkhei" ConceptLink="http://cdb.iso.org/lg/CDB-00137726-001">sqo</item>
+                                    <item AppInfo="Sou" ConceptLink="http://cdb.iso.org/lg/CDB-00137725-001">sqq</item>
+                                    <item AppInfo="Siculo Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00137875-001">sqr</item>
+                                    <item AppInfo="Sri Lankan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00137722-001">sqs</item>
+                                    <item AppInfo="Soqotri" ConceptLink="http://cdb.iso.org/lg/CDB-00137730-001">sqt</item>
+                                    <item AppInfo="Squamish" ConceptLink="http://cdb.iso.org/lg/CDB-00137720-001">squ</item>
+                                    <item AppInfo="Saruga" ConceptLink="http://cdb.iso.org/lg/CDB-00137718-001">sra</item>
+                                    <item AppInfo="Sora" ConceptLink="http://cdb.iso.org/lg/CDB-00137723-001">srb</item>
+                                    <item AppInfo="Logudorese Sardinian" ConceptLink="http://cdb.iso.org/lg/CDB-00137700-001">src</item>
+                                    <item AppInfo="Sardinian" ConceptLink="http://cdb.iso.org/lg/CDB-00138603-001">srd</item>
+                                    <item AppInfo="Sara" ConceptLink="http://cdb.iso.org/lg/CDB-00137670-001">sre</item>
+                                    <item AppInfo="Nafi" ConceptLink="http://cdb.iso.org/lg/CDB-00137671-001">srf</item>
+                                    <item AppInfo="Sulod" ConceptLink="http://cdb.iso.org/lg/CDB-00137672-001">srg</item>
+                                    <item AppInfo="Sarikoli" ConceptLink="http://cdb.iso.org/lg/CDB-00137673-001">srh</item>
+                                    <item AppInfo="Siriano" ConceptLink="http://cdb.iso.org/lg/CDB-00137674-001">sri</item>
+                                    <item AppInfo="Serudung Murut" ConceptLink="http://cdb.iso.org/lg/CDB-00137675-001">srk</item>
+                                    <item AppInfo="Isirawa" ConceptLink="http://cdb.iso.org/lg/CDB-00137676-001">srl</item>
+                                    <item AppInfo="Saramaccan" ConceptLink="http://cdb.iso.org/lg/CDB-00137678-001">srm</item>
+                                    <item AppInfo="Sranan Tongo" ConceptLink="http://cdb.iso.org/lg/CDB-00137679-001">srn</item>
+                                    <item AppInfo="Campidanese Sardinian" ConceptLink="http://cdb.iso.org/lg/CDB-00137680-001">sro</item>
+                                    <item AppInfo="Serbian" ConceptLink="http://cdb.iso.org/lg/CDB-00138615-001">srp</item>
+                                    <item AppInfo="SirionÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00137668-001">srq</item>
+                                    <item AppInfo="Serer" ConceptLink="http://cdb.iso.org/lg/CDB-00137696-001">srr</item>
+                                    <item AppInfo="Sarsi" ConceptLink="http://cdb.iso.org/lg/CDB-00137345-001">srs</item>
+                                    <item AppInfo="Sauri" ConceptLink="http://cdb.iso.org/lg/CDB-00135408-001">srt</item>
+                                    <item AppInfo="SuruÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00135640-001">sru</item>
+                                    <item AppInfo="Waray Sorsogon" ConceptLink="http://cdb.iso.org/lg/CDB-00135641-001">srv</item>
+                                    <item AppInfo="Serua" ConceptLink="http://cdb.iso.org/lg/CDB-00135642-001">srw</item>
+                                    <item AppInfo="Sirmauri" ConceptLink="http://cdb.iso.org/lg/CDB-00135643-001">srx</item>
+                                    <item AppInfo="Sera" ConceptLink="http://cdb.iso.org/lg/CDB-00135644-001">sry</item>
+                                    <item AppInfo="Shahmirzadi" ConceptLink="http://cdb.iso.org/lg/CDB-00135645-001">srz</item>
+                                    <item AppInfo="Southern Sama" ConceptLink="http://cdb.iso.org/lg/CDB-00135646-001">ssb</item>
+                                    <item AppInfo="Suba-Simbiti" ConceptLink="http://cdb.iso.org/lg/CDB-00135647-001">ssc</item>
+                                    <item AppInfo="Siroi" ConceptLink="http://cdb.iso.org/lg/CDB-00135648-001">ssd</item>
+                                    <item AppInfo="Balangingi" ConceptLink="http://cdb.iso.org/lg/CDB-00135661-001">sse</item>
+                                    <item AppInfo="Thao" ConceptLink="http://cdb.iso.org/lg/CDB-00135650-001">ssf</item>
+                                    <item AppInfo="Seimat" ConceptLink="http://cdb.iso.org/lg/CDB-00135639-001">ssg</item>
+                                    <item AppInfo="Shihhi Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00135652-001">ssh</item>
+                                    <item AppInfo="Sansi" ConceptLink="http://cdb.iso.org/lg/CDB-00135653-001">ssi</item>
+                                    <item AppInfo="Sausi" ConceptLink="http://cdb.iso.org/lg/CDB-00135654-001">ssj</item>
+                                    <item AppInfo="Sunam" ConceptLink="http://cdb.iso.org/lg/CDB-00135655-001">ssk</item>
+                                    <item AppInfo="Western Sisaala" ConceptLink="http://cdb.iso.org/lg/CDB-00135656-001">ssl</item>
+                                    <item AppInfo="Semnam" ConceptLink="http://cdb.iso.org/lg/CDB-00135657-001">ssm</item>
+                                    <item AppInfo="Waata" ConceptLink="http://cdb.iso.org/lg/CDB-00135658-001">ssn</item>
+                                    <item AppInfo="Sissano" ConceptLink="http://cdb.iso.org/lg/CDB-00135659-001">sso</item>
+                                    <item AppInfo="Spanish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135660-001">ssp</item>
+                                    <item AppInfo="So'a" ConceptLink="http://cdb.iso.org/lg/CDB-00135628-001">ssq</item>
+                                    <item AppInfo="Swiss-French Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135626-001">ssr</item>
+                                    <item AppInfo="SÃŽ" ConceptLink="http://cdb.iso.org/lg/CDB-00135649-001">sss</item>
+                                    <item AppInfo="Sinasina" ConceptLink="http://cdb.iso.org/lg/CDB-00135618-001">sst</item>
+                                    <item AppInfo="Susuami" ConceptLink="http://cdb.iso.org/lg/CDB-00135619-001">ssu</item>
+                                    <item AppInfo="Shark Bay" ConceptLink="http://cdb.iso.org/lg/CDB-00135620-001">ssv</item>
+                                    <item AppInfo="Swazi; Swati; Siswati" ConceptLink="http://cdb.iso.org/lg/CDB-00138616-001">ssw</item>
+                                    <item AppInfo="Samberigi" ConceptLink="http://cdb.iso.org/lg/CDB-00135621-001">ssx</item>
+                                    <item AppInfo="Saho" ConceptLink="http://cdb.iso.org/lg/CDB-00135622-001">ssy</item>
+                                    <item AppInfo="Sengseng" ConceptLink="http://cdb.iso.org/lg/CDB-00135623-001">ssz</item>
+                                    <item AppInfo="Settla" ConceptLink="http://cdb.iso.org/lg/CDB-00135624-001">sta</item>
+                                    <item AppInfo="Northern Subanen" ConceptLink="http://cdb.iso.org/lg/CDB-00135625-001">stb</item>
+                                    <item AppInfo="Sentinel" ConceptLink="http://cdb.iso.org/lg/CDB-00135638-001">std</item>
+                                    <item AppInfo="Liana-Seti" ConceptLink="http://cdb.iso.org/lg/CDB-00135627-001">ste</item>
+                                    <item AppInfo="Seta" ConceptLink="http://cdb.iso.org/lg/CDB-00135616-001">stf</item>
+                                    <item AppInfo="Trieng" ConceptLink="http://cdb.iso.org/lg/CDB-00135629-001">stg</item>
+                                    <item AppInfo="Shelta" ConceptLink="http://cdb.iso.org/lg/CDB-00135630-001">sth</item>
+                                    <item AppInfo="Bulo Stieng" ConceptLink="http://cdb.iso.org/lg/CDB-00135631-001">sti</item>
+                                    <item AppInfo="Matya Samo" ConceptLink="http://cdb.iso.org/lg/CDB-00135632-001">stj</item>
+                                    <item AppInfo="Arammba" ConceptLink="http://cdb.iso.org/lg/CDB-00135633-001">stk</item>
+                                    <item AppInfo="Stellingwerfs" ConceptLink="http://cdb.iso.org/lg/CDB-00135634-001">stl</item>
+                                    <item AppInfo="Setaman" ConceptLink="http://cdb.iso.org/lg/CDB-00135635-001">stm</item>
+                                    <item AppInfo="Owa" ConceptLink="http://cdb.iso.org/lg/CDB-00135636-001">stn</item>
+                                    <item AppInfo="Stoney" ConceptLink="http://cdb.iso.org/lg/CDB-00135663-001">sto</item>
+                                    <item AppInfo="Southeastern Tepehuan" ConceptLink="http://cdb.iso.org/lg/CDB-00135617-001">stp</item>
+                                    <item AppInfo="Saterfriesisch" ConceptLink="http://cdb.iso.org/lg/CDB-00135651-001">stq</item>
+                                    <item AppInfo="Straits Salish" ConceptLink="http://cdb.iso.org/lg/CDB-00135686-001">str</item>
+                                    <item AppInfo="Shumashti" ConceptLink="http://cdb.iso.org/lg/CDB-00135687-001">sts</item>
+                                    <item AppInfo="Budeh Stieng" ConceptLink="http://cdb.iso.org/lg/CDB-00135688-001">stt</item>
+                                    <item AppInfo="Samtao" ConceptLink="http://cdb.iso.org/lg/CDB-00135689-001">stu</item>
+                                    <item AppInfo="Silt'e" ConceptLink="http://cdb.iso.org/lg/CDB-00135690-001">stv</item>
+                                    <item AppInfo="Satawalese" ConceptLink="http://cdb.iso.org/lg/CDB-00135691-001">stw</item>
+                                    <item AppInfo="Sulka" ConceptLink="http://cdb.iso.org/lg/CDB-00135692-001">sua</item>
+                                    <item AppInfo="Suku" ConceptLink="http://cdb.iso.org/lg/CDB-00135693-001">sub</item>
+                                    <item AppInfo="Western Subanon" ConceptLink="http://cdb.iso.org/lg/CDB-00135694-001">suc</item>
+                                    <item AppInfo="Suena" ConceptLink="http://cdb.iso.org/lg/CDB-00135707-001">sue</item>
+                                    <item AppInfo="Suganga" ConceptLink="http://cdb.iso.org/lg/CDB-00135696-001">sug</item>
+                                    <item AppInfo="Suki" ConceptLink="http://cdb.iso.org/lg/CDB-00135685-001">sui</item>
+                                    <item AppInfo="Shubi" ConceptLink="http://cdb.iso.org/lg/CDB-00135698-001">suj</item>
+                                    <item AppInfo="Sukuma" ConceptLink="http://cdb.iso.org/lg/CDB-00135699-001">suk</item>
+                                    <item AppInfo="Surigaonon" ConceptLink="http://cdb.iso.org/lg/CDB-00135700-001">sul</item>
+                                    <item AppInfo="Sumo-Mayangna" ConceptLink="http://cdb.iso.org/lg/CDB-00135701-001">sum</item>
+                                    <item AppInfo="Sundanese" ConceptLink="http://cdb.iso.org/lg/CDB-00138618-001">sun</item>
+                                    <item AppInfo="Suri" ConceptLink="http://cdb.iso.org/lg/CDB-00135702-001">suq</item>
+                                    <item AppInfo="Mwaghavul" ConceptLink="http://cdb.iso.org/lg/CDB-00135703-001">sur</item>
+                                    <item AppInfo="Susu" ConceptLink="http://cdb.iso.org/lg/CDB-00135704-001">sus</item>
+                                    <item AppInfo="Subtiaba" ConceptLink="http://cdb.iso.org/lg/CDB-00138092-001">sut</item>
+                                    <item AppInfo="Sulung" ConceptLink="http://cdb.iso.org/lg/CDB-00135705-001">suv</item>
+                                    <item AppInfo="Sumbwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135706-001">suw</item>
+                                    <item AppInfo="Sumerian" ConceptLink="http://cdb.iso.org/lg/CDB-00138377-001">sux</item>
+                                    <item AppInfo="SuyÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00135674-001">suy</item>
+                                    <item AppInfo="Sunwar" ConceptLink="http://cdb.iso.org/lg/CDB-00135672-001">suz</item>
+                                    <item AppInfo="Svan" ConceptLink="http://cdb.iso.org/lg/CDB-00135695-001">sva</item>
+                                    <item AppInfo="Ulau-Suain" ConceptLink="http://cdb.iso.org/lg/CDB-00135664-001">svb</item>
+                                    <item AppInfo="Vincentian Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00135665-001">svc</item>
+                                    <item AppInfo="Serili" ConceptLink="http://cdb.iso.org/lg/CDB-00135666-001">sve</item>
+                                    <item AppInfo="Slovakian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135667-001">svk</item>
+                                    <item AppInfo="Savara" ConceptLink="http://cdb.iso.org/lg/CDB-00135668-001">svr</item>
+                                    <item AppInfo="Savosavo" ConceptLink="http://cdb.iso.org/lg/CDB-00135669-001">svs</item>
+                                    <item AppInfo="Skalvian" ConceptLink="http://cdb.iso.org/lg/CDB-00138020-001">svx</item>
+                                    <item AppInfo="Swahili; Kiswahili" ConceptLink="http://cdb.iso.org/lg/CDB-00138620-001">swa</item>
+                                    <item AppInfo="Maore Comorian" ConceptLink="http://cdb.iso.org/lg/CDB-00135670-001">swb</item>
+                                    <item AppInfo="Congo Swahili" ConceptLink="http://cdb.iso.org/lg/CDB-00135671-001">swc</item>
+                                    <item AppInfo="Swedish" ConceptLink="http://cdb.iso.org/lg/CDB-00138619-001">swe</item>
+                                    <item AppInfo="Sere" ConceptLink="http://cdb.iso.org/lg/CDB-00135684-001">swf</item>
+                                    <item AppInfo="Swabian" ConceptLink="http://cdb.iso.org/lg/CDB-00135673-001">swg</item>
+                                    <item AppInfo="Swahili" ConceptLink="http://cdb.iso.org/lg/CDB-00135662-001">swh</item>
+                                    <item AppInfo="Sui" ConceptLink="http://cdb.iso.org/lg/CDB-00135675-001">swi</item>
+                                    <item AppInfo="Sira" ConceptLink="http://cdb.iso.org/lg/CDB-00135676-001">swj</item>
+                                    <item AppInfo="Malawi Sena" ConceptLink="http://cdb.iso.org/lg/CDB-00135677-001">swk</item>
+                                    <item AppInfo="Swedish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135678-001">swl</item>
+                                    <item AppInfo="Samosa" ConceptLink="http://cdb.iso.org/lg/CDB-00135679-001">swm</item>
+                                    <item AppInfo="Sawknah" ConceptLink="http://cdb.iso.org/lg/CDB-00135680-001">swn</item>
+                                    <item AppInfo="Shanenawa" ConceptLink="http://cdb.iso.org/lg/CDB-00135681-001">swo</item>
+                                    <item AppInfo="Suau" ConceptLink="http://cdb.iso.org/lg/CDB-00135682-001">swp</item>
+                                    <item AppInfo="Sharwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135594-001">swq</item>
+                                    <item AppInfo="Saweru" ConceptLink="http://cdb.iso.org/lg/CDB-00135697-001">swr</item>
+                                    <item AppInfo="Seluwasan" ConceptLink="http://cdb.iso.org/lg/CDB-00135637-001">sws</item>
+                                    <item AppInfo="Sawila" ConceptLink="http://cdb.iso.org/lg/CDB-00135548-001">swt</item>
+                                    <item AppInfo="Suwawa" ConceptLink="http://cdb.iso.org/lg/CDB-00135549-001">swu</item>
+                                    <item AppInfo="Shekhawati" ConceptLink="http://cdb.iso.org/lg/CDB-00135550-001">swv</item>
+                                    <item AppInfo="Sowa" ConceptLink="http://cdb.iso.org/lg/CDB-00135551-001">sww</item>
+                                    <item AppInfo="SuruahÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00135552-001">swx</item>
+                                    <item AppInfo="Sarua" ConceptLink="http://cdb.iso.org/lg/CDB-00135553-001">swy</item>
+                                    <item AppInfo="Suba" ConceptLink="http://cdb.iso.org/lg/CDB-00135554-001">sxb</item>
+                                    <item AppInfo="Sicanian" ConceptLink="http://cdb.iso.org/lg/CDB-00138462-001">sxc</item>
+                                    <item AppInfo="Sighu" ConceptLink="http://cdb.iso.org/lg/CDB-00135555-001">sxe</item>
+                                    <item AppInfo="Shixing" ConceptLink="http://cdb.iso.org/lg/CDB-00135556-001">sxg</item>
+                                    <item AppInfo="Southern Kalapuya" ConceptLink="http://cdb.iso.org/lg/CDB-00138054-001">sxk</item>
+                                    <item AppInfo="Selian" ConceptLink="http://cdb.iso.org/lg/CDB-00138040-001">sxl</item>
+                                    <item AppInfo="Samre" ConceptLink="http://cdb.iso.org/lg/CDB-00135569-001">sxm</item>
+                                    <item AppInfo="Sangir" ConceptLink="http://cdb.iso.org/lg/CDB-00135558-001">sxn</item>
+                                    <item AppInfo="Sorothaptic" ConceptLink="http://cdb.iso.org/lg/CDB-00138443-001">sxo</item>
+                                    <item AppInfo="Saaroa" ConceptLink="http://cdb.iso.org/lg/CDB-00135547-001">sxr</item>
+                                    <item AppInfo="Sasaru" ConceptLink="http://cdb.iso.org/lg/CDB-00135560-001">sxs</item>
+                                    <item AppInfo="Upper Saxon" ConceptLink="http://cdb.iso.org/lg/CDB-00135561-001">sxu</item>
+                                    <item AppInfo="Saxwe Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00135562-001">sxw</item>
+                                    <item AppInfo="Siang" ConceptLink="http://cdb.iso.org/lg/CDB-00135563-001">sya</item>
+                                    <item AppInfo="Central Subanen" ConceptLink="http://cdb.iso.org/lg/CDB-00135564-001">syb</item>
+                                    <item AppInfo="Classical Syriac" ConceptLink="http://cdb.iso.org/lg/CDB-00137874-001">syc</item>
+                                    <item AppInfo="Seki" ConceptLink="http://cdb.iso.org/lg/CDB-00135565-001">syi</item>
+                                    <item AppInfo="Sukur" ConceptLink="http://cdb.iso.org/lg/CDB-00135566-001">syk</item>
+                                    <item AppInfo="Sylheti" ConceptLink="http://cdb.iso.org/lg/CDB-00135567-001">syl</item>
+                                    <item AppInfo="Maya Samo" ConceptLink="http://cdb.iso.org/lg/CDB-00135536-001">sym</item>
+                                    <item AppInfo="Senaya" ConceptLink="http://cdb.iso.org/lg/CDB-00135559-001">syn</item>
+                                    <item AppInfo="Suoy" ConceptLink="http://cdb.iso.org/lg/CDB-00135557-001">syo</item>
+                                    <item AppInfo="Syriac" ConceptLink="http://cdb.iso.org/lg/CDB-00130987-001">syr</item>
+                                    <item AppInfo="Sinyar" ConceptLink="http://cdb.iso.org/lg/CDB-00135526-001">sys</item>
+                                    <item AppInfo="Kagate" ConceptLink="http://cdb.iso.org/lg/CDB-00135527-001">syw</item>
+                                    <item AppInfo="Al-Sayyid Bedouin Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135528-001">syy</item>
+                                    <item AppInfo="Semelai" ConceptLink="http://cdb.iso.org/lg/CDB-00135529-001">sza</item>
+                                    <item AppInfo="Ngalum" ConceptLink="http://cdb.iso.org/lg/CDB-00135530-001">szb</item>
+                                    <item AppInfo="Semaq Beri" ConceptLink="http://cdb.iso.org/lg/CDB-00135531-001">szc</item>
+                                    <item AppInfo="Seru" ConceptLink="http://cdb.iso.org/lg/CDB-00138021-001">szd</item>
+                                    <item AppInfo="Seze" ConceptLink="http://cdb.iso.org/lg/CDB-00135532-001">sze</item>
+                                    <item AppInfo="Sengele" ConceptLink="http://cdb.iso.org/lg/CDB-00135533-001">szg</item>
+                                    <item AppInfo="Silesian" ConceptLink="http://cdb.iso.org/lg/CDB-00135546-001">szl</item>
+                                    <item AppInfo="Sula" ConceptLink="http://cdb.iso.org/lg/CDB-00135535-001">szn</item>
+                                    <item AppInfo="Suabo" ConceptLink="http://cdb.iso.org/lg/CDB-00135525-001">szp</item>
+                                    <item AppInfo="Isu" ConceptLink="http://cdb.iso.org/lg/CDB-00135537-001">szv</item>
+                                    <item AppInfo="Sawai" ConceptLink="http://cdb.iso.org/lg/CDB-00135538-001">szw</item>
+                                    <item AppInfo="Lower Tanana" ConceptLink="http://cdb.iso.org/lg/CDB-00135539-001">taa</item>
+                                    <item AppInfo="Tabassaran" ConceptLink="http://cdb.iso.org/lg/CDB-00135540-001">tab</item>
+                                    <item AppInfo="Lowland Tarahumara" ConceptLink="http://cdb.iso.org/lg/CDB-00135541-001">tac</item>
+                                    <item AppInfo="Tause" ConceptLink="http://cdb.iso.org/lg/CDB-00135542-001">tad</item>
+                                    <item AppInfo="Tariana" ConceptLink="http://cdb.iso.org/lg/CDB-00135543-001">tae</item>
+                                    <item AppInfo="TapirapÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00135544-001">taf</item>
+                                    <item AppInfo="Tagoi" ConceptLink="http://cdb.iso.org/lg/CDB-00135545-001">tag</item>
+                                    <item AppInfo="Tahitian" ConceptLink="http://cdb.iso.org/lg/CDB-00138634-001">tah</item>
+                                    <item AppInfo="Eastern Tamang" ConceptLink="http://cdb.iso.org/lg/CDB-00135571-001">taj</item>
+                                    <item AppInfo="Tala" ConceptLink="http://cdb.iso.org/lg/CDB-00135605-001">tak</item>
+                                    <item AppInfo="Tal" ConceptLink="http://cdb.iso.org/lg/CDB-00135568-001">tal</item>
+                                    <item AppInfo="Tamil" ConceptLink="http://cdb.iso.org/lg/CDB-00138621-001">tam</item>
+                                    <item AppInfo="Tangale" ConceptLink="http://cdb.iso.org/lg/CDB-00135595-001">tan</item>
+                                    <item AppInfo="Yami" ConceptLink="http://cdb.iso.org/lg/CDB-00135596-001">tao</item>
+                                    <item AppInfo="Taabwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135597-001">tap</item>
+                                    <item AppInfo="Tamasheq" ConceptLink="http://cdb.iso.org/lg/CDB-00135598-001">taq</item>
+                                    <item AppInfo="Central Tarahumara" ConceptLink="http://cdb.iso.org/lg/CDB-00135599-001">tar</item>
+                                    <item AppInfo="Tay Boi" ConceptLink="http://cdb.iso.org/lg/CDB-00138108-001">tas</item>
+                                    <item AppInfo="Tatar" ConceptLink="http://cdb.iso.org/lg/CDB-00138632-001">tat</item>
+                                    <item AppInfo="Upper Tanana" ConceptLink="http://cdb.iso.org/lg/CDB-00135600-001">tau</item>
+                                    <item AppInfo="Tatuyo" ConceptLink="http://cdb.iso.org/lg/CDB-00135601-001">tav</item>
+                                    <item AppInfo="Tai" ConceptLink="http://cdb.iso.org/lg/CDB-00135602-001">taw</item>
+                                    <item AppInfo="Tamki" ConceptLink="http://cdb.iso.org/lg/CDB-00135615-001">tax</item>
+                                    <item AppInfo="Atayal" ConceptLink="http://cdb.iso.org/lg/CDB-00135604-001">tay</item>
+                                    <item AppInfo="Tocho" ConceptLink="http://cdb.iso.org/lg/CDB-00135593-001">taz</item>
+                                    <item AppInfo="AikanÃ£" ConceptLink="http://cdb.iso.org/lg/CDB-00135606-001">tba</item>
+                                    <item AppInfo="Tapeba" ConceptLink="http://cdb.iso.org/lg/CDB-00138120-001">tbb</item>
+                                    <item AppInfo="Takia" ConceptLink="http://cdb.iso.org/lg/CDB-00135607-001">tbc</item>
+                                    <item AppInfo="Kaki Ae" ConceptLink="http://cdb.iso.org/lg/CDB-00135608-001">tbd</item>
+                                    <item AppInfo="Tanimbili" ConceptLink="http://cdb.iso.org/lg/CDB-00135609-001">tbe</item>
+                                    <item AppInfo="Mandara" ConceptLink="http://cdb.iso.org/lg/CDB-00135610-001">tbf</item>
+                                    <item AppInfo="North Tairora" ConceptLink="http://cdb.iso.org/lg/CDB-00135611-001">tbg</item>
+                                    <item AppInfo="Thurawal" ConceptLink="http://cdb.iso.org/lg/CDB-00138082-001">tbh</item>
+                                    <item AppInfo="Gaam" ConceptLink="http://cdb.iso.org/lg/CDB-00135612-001">tbi</item>
+                                    <item AppInfo="Tiang" ConceptLink="http://cdb.iso.org/lg/CDB-00135613-001">tbj</item>
+                                    <item AppInfo="Calamian Tagbanwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135614-001">tbk</item>
+                                    <item AppInfo="Tboli" ConceptLink="http://cdb.iso.org/lg/CDB-00135582-001">tbl</item>
+                                    <item AppInfo="Tagbu" ConceptLink="http://cdb.iso.org/lg/CDB-00135580-001">tbm</item>
+                                    <item AppInfo="Barro Negro Tunebo" ConceptLink="http://cdb.iso.org/lg/CDB-00135603-001">tbn</item>
+                                    <item AppInfo="Tawala" ConceptLink="http://cdb.iso.org/lg/CDB-00135572-001">tbo</item>
+                                    <item AppInfo="Taworta" ConceptLink="http://cdb.iso.org/lg/CDB-00135573-001">tbp</item>
+                                    <item AppInfo="Tumtum" ConceptLink="http://cdb.iso.org/lg/CDB-00135574-001">tbr</item>
+                                    <item AppInfo="Tanguat" ConceptLink="http://cdb.iso.org/lg/CDB-00135575-001">tbs</item>
+                                    <item AppInfo="Tembo; Kitembo" ConceptLink="http://cdb.iso.org/lg/CDB-00135576-001">tbt</item>
+                                    <item AppInfo="Tubar" ConceptLink="http://cdb.iso.org/lg/CDB-00138069-001">tbu</item>
+                                    <item AppInfo="Tobo" ConceptLink="http://cdb.iso.org/lg/CDB-00135577-001">tbv</item>
+                                    <item AppInfo="Tagbanwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135578-001">tbw</item>
+                                    <item AppInfo="Kapin" ConceptLink="http://cdb.iso.org/lg/CDB-00135579-001">tbx</item>
+                                    <item AppInfo="Tabaru" ConceptLink="http://cdb.iso.org/lg/CDB-00135592-001">tby</item>
+                                    <item AppInfo="Ditammari" ConceptLink="http://cdb.iso.org/lg/CDB-00135581-001">tbz</item>
+                                    <item AppInfo="Ticuna" ConceptLink="http://cdb.iso.org/lg/CDB-00135570-001">tca</item>
+                                    <item AppInfo="Tanacross" ConceptLink="http://cdb.iso.org/lg/CDB-00135583-001">tcb</item>
+                                    <item AppInfo="Datooga" ConceptLink="http://cdb.iso.org/lg/CDB-00135584-001">tcc</item>
+                                    <item AppInfo="Tafi" ConceptLink="http://cdb.iso.org/lg/CDB-00135585-001">tcd</item>
+                                    <item AppInfo="Southern Tutchone" ConceptLink="http://cdb.iso.org/lg/CDB-00135586-001">tce</item>
+                                    <item AppInfo="Malinaltepec Me'phaa" ConceptLink="http://cdb.iso.org/lg/CDB-00135587-001">tcf</item>
+                                    <item AppInfo="Tamagario" ConceptLink="http://cdb.iso.org/lg/CDB-00135588-001">tcg</item>
+                                    <item AppInfo="Turks And Caicos Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00135589-001">tch</item>
+                                    <item AppInfo="WÃ¡ra" ConceptLink="http://cdb.iso.org/lg/CDB-00135590-001">tci</item>
+                                    <item AppInfo="Tchitchege" ConceptLink="http://cdb.iso.org/lg/CDB-00135717-001">tck</item>
+                                    <item AppInfo="Taman" ConceptLink="http://cdb.iso.org/lg/CDB-00135534-001">tcl</item>
+                                    <item AppInfo="Tanahmerah" ConceptLink="http://cdb.iso.org/lg/CDB-00135683-001">tcm</item>
+                                    <item AppInfo="Tichurong" ConceptLink="http://cdb.iso.org/lg/CDB-00135823-001">tcn</item>
+                                    <item AppInfo="Taungyo" ConceptLink="http://cdb.iso.org/lg/CDB-00135824-001">tco</item>
+                                    <item AppInfo="Tawr Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00135825-001">tcp</item>
+                                    <item AppInfo="Kaiy" ConceptLink="http://cdb.iso.org/lg/CDB-00135826-001">tcq</item>
+                                    <item AppInfo="Torres Strait Creole" ConceptLink="http://cdb.iso.org/lg/CDB-00135827-001">tcs</item>
+                                    <item AppInfo="T'en" ConceptLink="http://cdb.iso.org/lg/CDB-00135828-001">tct</item>
+                                    <item AppInfo="Southeastern Tarahumara" ConceptLink="http://cdb.iso.org/lg/CDB-00135829-001">tcu</item>
+                                    <item AppInfo="TecpatlÃ¡n Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135830-001">tcw</item>
+                                    <item AppInfo="Toda" ConceptLink="http://cdb.iso.org/lg/CDB-00135831-001">tcx</item>
+                                    <item AppInfo="Tulu" ConceptLink="http://cdb.iso.org/lg/CDB-00135844-001">tcy</item>
+                                    <item AppInfo="Thado Chin" ConceptLink="http://cdb.iso.org/lg/CDB-00135833-001">tcz</item>
+                                    <item AppInfo="Tagdal" ConceptLink="http://cdb.iso.org/lg/CDB-00135822-001">tda</item>
+                                    <item AppInfo="Panchpargania" ConceptLink="http://cdb.iso.org/lg/CDB-00135835-001">tdb</item>
+                                    <item AppInfo="EmberÃ¡-TadÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00135836-001">tdc</item>
+                                    <item AppInfo="Tai NÃŒa" ConceptLink="http://cdb.iso.org/lg/CDB-00135837-001">tdd</item>
+                                    <item AppInfo="Talieng" ConceptLink="http://cdb.iso.org/lg/CDB-00135838-001">tdf</item>
+                                    <item AppInfo="Western Tamang" ConceptLink="http://cdb.iso.org/lg/CDB-00135839-001">tdg</item>
+                                    <item AppInfo="Thulung" ConceptLink="http://cdb.iso.org/lg/CDB-00135840-001">tdh</item>
+                                    <item AppInfo="Tomadino" ConceptLink="http://cdb.iso.org/lg/CDB-00135841-001">tdi</item>
+                                    <item AppInfo="Tajio" ConceptLink="http://cdb.iso.org/lg/CDB-00135842-001">tdj</item>
+                                    <item AppInfo="Tambas" ConceptLink="http://cdb.iso.org/lg/CDB-00135843-001">tdk</item>
+                                    <item AppInfo="Sur" ConceptLink="http://cdb.iso.org/lg/CDB-00135811-001">tdl</item>
+                                    <item AppInfo="Tondano" ConceptLink="http://cdb.iso.org/lg/CDB-00135809-001">tdn</item>
+                                    <item AppInfo="Teme" ConceptLink="http://cdb.iso.org/lg/CDB-00135832-001">tdo</item>
+                                    <item AppInfo="Tita" ConceptLink="http://cdb.iso.org/lg/CDB-00135801-001">tdq</item>
+                                    <item AppInfo="Todrah" ConceptLink="http://cdb.iso.org/lg/CDB-00135802-001">tdr</item>
+                                    <item AppInfo="Doutai" ConceptLink="http://cdb.iso.org/lg/CDB-00135803-001">tds</item>
+                                    <item AppInfo="Tetun Dili" ConceptLink="http://cdb.iso.org/lg/CDB-00135804-001">tdt</item>
+                                    <item AppInfo="Tempasuk Dusun" ConceptLink="http://cdb.iso.org/lg/CDB-00135805-001">tdu</item>
+                                    <item AppInfo="Toro" ConceptLink="http://cdb.iso.org/lg/CDB-00135806-001">tdv</item>
+                                    <item AppInfo="Tandroy-Mahafaly Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00135807-001">tdx</item>
+                                    <item AppInfo="Tadyawan" ConceptLink="http://cdb.iso.org/lg/CDB-00135808-001">tdy</item>
+                                    <item AppInfo="Temiar" ConceptLink="http://cdb.iso.org/lg/CDB-00135821-001">tea</item>
+                                    <item AppInfo="Tetete" ConceptLink="http://cdb.iso.org/lg/CDB-00138003-001">teb</item>
+                                    <item AppInfo="Terik" ConceptLink="http://cdb.iso.org/lg/CDB-00135810-001">tec</item>
+                                    <item AppInfo="Tepo Krumen" ConceptLink="http://cdb.iso.org/lg/CDB-00135799-001">ted</item>
+                                    <item AppInfo="Huehuetla Tepehua" ConceptLink="http://cdb.iso.org/lg/CDB-00135812-001">tee</item>
+                                    <item AppInfo="Teressa" ConceptLink="http://cdb.iso.org/lg/CDB-00135813-001">tef</item>
+                                    <item AppInfo="Teke-Tege" ConceptLink="http://cdb.iso.org/lg/CDB-00135814-001">teg</item>
+                                    <item AppInfo="Tehuelche" ConceptLink="http://cdb.iso.org/lg/CDB-00135815-001">teh</item>
+                                    <item AppInfo="Torricelli" ConceptLink="http://cdb.iso.org/lg/CDB-00135816-001">tei</item>
+                                    <item AppInfo="Ibali Teke" ConceptLink="http://cdb.iso.org/lg/CDB-00135817-001">tek</item>
+                                    <item AppInfo="Telugu" ConceptLink="http://cdb.iso.org/lg/CDB-00138622-001">tel</item>
+                                    <item AppInfo="Timne" ConceptLink="http://cdb.iso.org/lg/CDB-00135818-001">tem</item>
+                                    <item AppInfo="Tama" ConceptLink="http://cdb.iso.org/lg/CDB-00137983-001">ten</item>
+                                    <item AppInfo="Teso" ConceptLink="http://cdb.iso.org/lg/CDB-00135819-001">teo</item>
+                                    <item AppInfo="Tepecano" ConceptLink="http://cdb.iso.org/lg/CDB-00137972-001">tep</item>
+                                    <item AppInfo="Temein" ConceptLink="http://cdb.iso.org/lg/CDB-00135846-001">teq</item>
+                                    <item AppInfo="Tereno" ConceptLink="http://cdb.iso.org/lg/CDB-00135800-001">ter</item>
+                                    <item AppInfo="Tengger" ConceptLink="http://cdb.iso.org/lg/CDB-00135834-001">tes</item>
+                                    <item AppInfo="Tetum" ConceptLink="http://cdb.iso.org/lg/CDB-00135869-001">tet</item>
+                                    <item AppInfo="Soo" ConceptLink="http://cdb.iso.org/lg/CDB-00135870-001">teu</item>
+                                    <item AppInfo="Teor" ConceptLink="http://cdb.iso.org/lg/CDB-00135871-001">tev</item>
+                                    <item AppInfo="Tewa" ConceptLink="http://cdb.iso.org/lg/CDB-00135872-001">tew</item>
+                                    <item AppInfo="Tennet" ConceptLink="http://cdb.iso.org/lg/CDB-00135873-001">tex</item>
+                                    <item AppInfo="Tulishi" ConceptLink="http://cdb.iso.org/lg/CDB-00135874-001">tey</item>
+                                    <item AppInfo="Tofin Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00135875-001">tfi</item>
+                                    <item AppInfo="Tanaina" ConceptLink="http://cdb.iso.org/lg/CDB-00135876-001">tfn</item>
+                                    <item AppInfo="Tefaro" ConceptLink="http://cdb.iso.org/lg/CDB-00135877-001">tfo</item>
+                                    <item AppInfo="Teribe" ConceptLink="http://cdb.iso.org/lg/CDB-00135890-001">tfr</item>
+                                    <item AppInfo="Ternate" ConceptLink="http://cdb.iso.org/lg/CDB-00135879-001">tft</item>
+                                    <item AppInfo="Sagalla" ConceptLink="http://cdb.iso.org/lg/CDB-00135868-001">tga</item>
+                                    <item AppInfo="Tobilung" ConceptLink="http://cdb.iso.org/lg/CDB-00135881-001">tgb</item>
+                                    <item AppInfo="Tigak" ConceptLink="http://cdb.iso.org/lg/CDB-00135882-001">tgc</item>
+                                    <item AppInfo="Ciwogai" ConceptLink="http://cdb.iso.org/lg/CDB-00135883-001">tgd</item>
+                                    <item AppInfo="Eastern Gorkha Tamang" ConceptLink="http://cdb.iso.org/lg/CDB-00135884-001">tge</item>
+                                    <item AppInfo="Chalikha" ConceptLink="http://cdb.iso.org/lg/CDB-00135885-001">tgf</item>
+                                    <item AppInfo="Tangga" ConceptLink="http://cdb.iso.org/lg/CDB-00135886-001">tgg</item>
+                                    <item AppInfo="Tobagonian Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00135887-001">tgh</item>
+                                    <item AppInfo="Lawunuia" ConceptLink="http://cdb.iso.org/lg/CDB-00135888-001">tgi</item>
+                                    <item AppInfo="Tajik" ConceptLink="http://cdb.iso.org/lg/CDB-00138623-001">tgk</item>
+                                    <item AppInfo="Tagalog" ConceptLink="http://cdb.iso.org/lg/CDB-00138627-001">tgl</item>
+                                    <item AppInfo="Sudest" ConceptLink="http://cdb.iso.org/lg/CDB-00135889-001">tgo</item>
+                                    <item AppInfo="Tangoa" ConceptLink="http://cdb.iso.org/lg/CDB-00135857-001">tgp</item>
+                                    <item AppInfo="Tring" ConceptLink="http://cdb.iso.org/lg/CDB-00135855-001">tgq</item>
+                                    <item AppInfo="Tareng" ConceptLink="http://cdb.iso.org/lg/CDB-00135878-001">tgr</item>
+                                    <item AppInfo="Nume" ConceptLink="http://cdb.iso.org/lg/CDB-00135847-001">tgs</item>
+                                    <item AppInfo="Central Tagbanwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135848-001">tgt</item>
+                                    <item AppInfo="Tanggu" ConceptLink="http://cdb.iso.org/lg/CDB-00135849-001">tgu</item>
+                                    <item AppInfo="Tingui-Boto" ConceptLink="http://cdb.iso.org/lg/CDB-00138273-001">tgv</item>
+                                    <item AppInfo="Tagwana Senoufo" ConceptLink="http://cdb.iso.org/lg/CDB-00135850-001">tgw</item>
+                                    <item AppInfo="Tagish" ConceptLink="http://cdb.iso.org/lg/CDB-00135851-001">tgx</item>
+                                    <item AppInfo="Togoyo" ConceptLink="http://cdb.iso.org/lg/CDB-00138268-001">tgy</item>
+                                    <item AppInfo="Thai" ConceptLink="http://cdb.iso.org/lg/CDB-00138624-001">tha</item>
+                                    <item AppInfo="Tai Hang Tong" ConceptLink="http://cdb.iso.org/lg/CDB-00135852-001">thc</item>
+                                    <item AppInfo="Thayore" ConceptLink="http://cdb.iso.org/lg/CDB-00135853-001">thd</item>
+                                    <item AppInfo="Chitwania Tharu" ConceptLink="http://cdb.iso.org/lg/CDB-00135854-001">the</item>
+                                    <item AppInfo="Thangmi" ConceptLink="http://cdb.iso.org/lg/CDB-00135867-001">thf</item>
+                                    <item AppInfo="Northern Tarahumara" ConceptLink="http://cdb.iso.org/lg/CDB-00135856-001">thh</item>
+                                    <item AppInfo="Tai Long" ConceptLink="http://cdb.iso.org/lg/CDB-00135845-001">thi</item>
+                                    <item AppInfo="Tharaka" ConceptLink="http://cdb.iso.org/lg/CDB-00135858-001">thk</item>
+                                    <item AppInfo="Dangaura Tharu" ConceptLink="http://cdb.iso.org/lg/CDB-00135859-001">thl</item>
+                                    <item AppInfo="Aheu" ConceptLink="http://cdb.iso.org/lg/CDB-00135860-001">thm</item>
+                                    <item AppInfo="Thachanadan" ConceptLink="http://cdb.iso.org/lg/CDB-00135861-001">thn</item>
+                                    <item AppInfo="Thompson" ConceptLink="http://cdb.iso.org/lg/CDB-00135862-001">thp</item>
+                                    <item AppInfo="Kochila Tharu" ConceptLink="http://cdb.iso.org/lg/CDB-00135863-001">thq</item>
+                                    <item AppInfo="Rana Tharu" ConceptLink="http://cdb.iso.org/lg/CDB-00135864-001">thr</item>
+                                    <item AppInfo="Thakali" ConceptLink="http://cdb.iso.org/lg/CDB-00135865-001">ths</item>
+                                    <item AppInfo="Tahltan" ConceptLink="http://cdb.iso.org/lg/CDB-00135777-001">tht</item>
+                                    <item AppInfo="Thuri" ConceptLink="http://cdb.iso.org/lg/CDB-00135880-001">thu</item>
+                                    <item AppInfo="Tahaggart Tamahaq" ConceptLink="http://cdb.iso.org/lg/CDB-00135820-001">thv</item>
+                                    <item AppInfo="Thudam" ConceptLink="http://cdb.iso.org/lg/CDB-00135731-001">thw</item>
+                                    <item AppInfo="The" ConceptLink="http://cdb.iso.org/lg/CDB-00135732-001">thx</item>
+                                    <item AppInfo="Tha" ConceptLink="http://cdb.iso.org/lg/CDB-00135733-001">thy</item>
+                                    <item AppInfo="Tayart Tamajeq" ConceptLink="http://cdb.iso.org/lg/CDB-00135734-001">thz</item>
+                                    <item AppInfo="Tidikelt Tamazight" ConceptLink="http://cdb.iso.org/lg/CDB-00135735-001">tia</item>
+                                    <item AppInfo="Tira" ConceptLink="http://cdb.iso.org/lg/CDB-00135736-001">tic</item>
+                                    <item AppInfo="Tidong" ConceptLink="http://cdb.iso.org/lg/CDB-00135737-001">tid</item>
+                                    <item AppInfo="Tingal" ConceptLink="http://cdb.iso.org/lg/CDB-00135738-001">tie</item>
+                                    <item AppInfo="Tifal" ConceptLink="http://cdb.iso.org/lg/CDB-00135739-001">tif</item>
+                                    <item AppInfo="Tigre" ConceptLink="http://cdb.iso.org/lg/CDB-00135752-001">tig</item>
+                                    <item AppInfo="Timugon Murut" ConceptLink="http://cdb.iso.org/lg/CDB-00135741-001">tih</item>
+                                    <item AppInfo="Tiene" ConceptLink="http://cdb.iso.org/lg/CDB-00135730-001">tii</item>
+                                    <item AppInfo="Tilung" ConceptLink="http://cdb.iso.org/lg/CDB-00135743-001">tij</item>
+                                    <item AppInfo="Tikar" ConceptLink="http://cdb.iso.org/lg/CDB-00135744-001">tik</item>
+                                    <item AppInfo="Tillamook" ConceptLink="http://cdb.iso.org/lg/CDB-00138175-001">til</item>
+                                    <item AppInfo="Timbe" ConceptLink="http://cdb.iso.org/lg/CDB-00135745-001">tim</item>
+                                    <item AppInfo="Tindi" ConceptLink="http://cdb.iso.org/lg/CDB-00135746-001">tin</item>
+                                    <item AppInfo="Teop" ConceptLink="http://cdb.iso.org/lg/CDB-00135747-001">tio</item>
+                                    <item AppInfo="Trimuris" ConceptLink="http://cdb.iso.org/lg/CDB-00135748-001">tip</item>
+                                    <item AppInfo="TiÃ©fo" ConceptLink="http://cdb.iso.org/lg/CDB-00135749-001">tiq</item>
+                                    <item AppInfo="Tigrinya" ConceptLink="http://cdb.iso.org/lg/CDB-00138625-001">tir</item>
+                                    <item AppInfo="Masadiit Itneg" ConceptLink="http://cdb.iso.org/lg/CDB-00135750-001">tis</item>
+                                    <item AppInfo="Tinigua" ConceptLink="http://cdb.iso.org/lg/CDB-00135719-001">tit</item>
+                                    <item AppInfo="Adasen" ConceptLink="http://cdb.iso.org/lg/CDB-00135742-001">tiu</item>
+                                    <item AppInfo="Tiv" ConceptLink="http://cdb.iso.org/lg/CDB-00135740-001">tiv</item>
+                                    <item AppInfo="Tiwi" ConceptLink="http://cdb.iso.org/lg/CDB-00135709-001">tiw</item>
+                                    <item AppInfo="Southern Tiwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135710-001">tix</item>
+                                    <item AppInfo="Tiruray" ConceptLink="http://cdb.iso.org/lg/CDB-00135711-001">tiy</item>
+                                    <item AppInfo="Tai Hongjin" ConceptLink="http://cdb.iso.org/lg/CDB-00135712-001">tiz</item>
+                                    <item AppInfo="Tajuasohn" ConceptLink="http://cdb.iso.org/lg/CDB-00135713-001">tja</item>
+                                    <item AppInfo="Tunjung" ConceptLink="http://cdb.iso.org/lg/CDB-00135714-001">tjg</item>
+                                    <item AppInfo="Northern Tujia" ConceptLink="http://cdb.iso.org/lg/CDB-00135715-001">tji</item>
+                                    <item AppInfo="Timucua" ConceptLink="http://cdb.iso.org/lg/CDB-00138231-001">tjm</item>
+                                    <item AppInfo="Tonjon" ConceptLink="http://cdb.iso.org/lg/CDB-00138218-001">tjn</item>
+                                    <item AppInfo="Temacine Tamazight" ConceptLink="http://cdb.iso.org/lg/CDB-00135716-001">tjo</item>
+                                    <item AppInfo="Southern Tujia" ConceptLink="http://cdb.iso.org/lg/CDB-00135729-001">tjs</item>
+                                    <item AppInfo="Tjurruru" ConceptLink="http://cdb.iso.org/lg/CDB-00138225-001">tju</item>
+                                    <item AppInfo="TrukÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138245-001">tka</item>
+                                    <item AppInfo="Buksa" ConceptLink="http://cdb.iso.org/lg/CDB-00135718-001">tkb</item>
+                                    <item AppInfo="Tukudede" ConceptLink="http://cdb.iso.org/lg/CDB-00135708-001">tkd</item>
+                                    <item AppInfo="Takwane" ConceptLink="http://cdb.iso.org/lg/CDB-00135720-001">tke</item>
+                                    <item AppInfo="TukumanfÃ©d" ConceptLink="http://cdb.iso.org/lg/CDB-00138244-001">tkf</item>
+                                    <item AppInfo="Takpa" ConceptLink="http://cdb.iso.org/lg/CDB-00135721-001">tkk</item>
+                                    <item AppInfo="Tokelau" ConceptLink="http://cdb.iso.org/lg/CDB-00135722-001">tkl</item>
+                                    <item AppInfo="Takelma" ConceptLink="http://cdb.iso.org/lg/CDB-00138200-001">tkm</item>
+                                    <item AppInfo="Toku-No-Shima" ConceptLink="http://cdb.iso.org/lg/CDB-00135723-001">tkn</item>
+                                    <item AppInfo="Tikopia" ConceptLink="http://cdb.iso.org/lg/CDB-00135724-001">tkp</item>
+                                    <item AppInfo="Tee" ConceptLink="http://cdb.iso.org/lg/CDB-00135725-001">tkq</item>
+                                    <item AppInfo="Tsakhur" ConceptLink="http://cdb.iso.org/lg/CDB-00135726-001">tkr</item>
+                                    <item AppInfo="Takestani" ConceptLink="http://cdb.iso.org/lg/CDB-00135727-001">tks</item>
+                                    <item AppInfo="Kathoriya Tharu" ConceptLink="http://cdb.iso.org/lg/CDB-00135728-001">tkt</item>
+                                    <item AppInfo="Upper Necaxa Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135754-001">tku</item>
+                                    <item AppInfo="Teanu" ConceptLink="http://cdb.iso.org/lg/CDB-00135788-001">tkw</item>
+                                    <item AppInfo="Tangko" ConceptLink="http://cdb.iso.org/lg/CDB-00135751-001">tkx</item>
+                                    <item AppInfo="Takua" ConceptLink="http://cdb.iso.org/lg/CDB-00135778-001">tkz</item>
+                                    <item AppInfo="Southwestern Tepehuan" ConceptLink="http://cdb.iso.org/lg/CDB-00135779-001">tla</item>
+                                    <item AppInfo="Tobelo" ConceptLink="http://cdb.iso.org/lg/CDB-00135780-001">tlb</item>
+                                    <item AppInfo="Yecuatla Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135781-001">tlc</item>
+                                    <item AppInfo="Talaud" ConceptLink="http://cdb.iso.org/lg/CDB-00135782-001">tld</item>
+                                    <item AppInfo="Telefol" ConceptLink="http://cdb.iso.org/lg/CDB-00135783-001">tlf</item>
+                                    <item AppInfo="Tofanma" ConceptLink="http://cdb.iso.org/lg/CDB-00135784-001">tlg</item>
+                                    <item AppInfo="Klingon; tlhIngan Hol" ConceptLink="http://cdb.iso.org/lg/CDB-00138348-001">tlh</item>
+                                    <item AppInfo="Tlingit" ConceptLink="http://cdb.iso.org/lg/CDB-00135785-001">tli</item>
+                                    <item AppInfo="Talinga-Bwisi" ConceptLink="http://cdb.iso.org/lg/CDB-00135798-001">tlj</item>
+                                    <item AppInfo="Taloki" ConceptLink="http://cdb.iso.org/lg/CDB-00135787-001">tlk</item>
+                                    <item AppInfo="Tetela" ConceptLink="http://cdb.iso.org/lg/CDB-00135776-001">tll</item>
+                                    <item AppInfo="Tolomako" ConceptLink="http://cdb.iso.org/lg/CDB-00135789-001">tlm</item>
+                                    <item AppInfo="Talondo'" ConceptLink="http://cdb.iso.org/lg/CDB-00135790-001">tln</item>
+                                    <item AppInfo="Talodi" ConceptLink="http://cdb.iso.org/lg/CDB-00135791-001">tlo</item>
+                                    <item AppInfo="Filomena Mata-CoahuitlÃ¡n Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135792-001">tlp</item>
+                                    <item AppInfo="Tai Loi" ConceptLink="http://cdb.iso.org/lg/CDB-00135793-001">tlq</item>
+                                    <item AppInfo="Talise" ConceptLink="http://cdb.iso.org/lg/CDB-00135794-001">tlr</item>
+                                    <item AppInfo="Tambotalo" ConceptLink="http://cdb.iso.org/lg/CDB-00135795-001">tls</item>
+                                    <item AppInfo="Teluti" ConceptLink="http://cdb.iso.org/lg/CDB-00135796-001">tlt</item>
+                                    <item AppInfo="Tulehu" ConceptLink="http://cdb.iso.org/lg/CDB-00135797-001">tlu</item>
+                                    <item AppInfo="Taliabu" ConceptLink="http://cdb.iso.org/lg/CDB-00135765-001">tlv</item>
+                                    <item AppInfo="South Wemale" ConceptLink="http://cdb.iso.org/lg/CDB-00135763-001">tlw</item>
+                                    <item AppInfo="Khehek" ConceptLink="http://cdb.iso.org/lg/CDB-00135786-001">tlx</item>
+                                    <item AppInfo="Talysh" ConceptLink="http://cdb.iso.org/lg/CDB-00135755-001">tly</item>
+                                    <item AppInfo="Tama" ConceptLink="http://cdb.iso.org/lg/CDB-00135756-001">tma</item>
+                                    <item AppInfo="Katbol" ConceptLink="http://cdb.iso.org/lg/CDB-00135757-001">tmb</item>
+                                    <item AppInfo="Tumak" ConceptLink="http://cdb.iso.org/lg/CDB-00135758-001">tmc</item>
+                                    <item AppInfo="Haruai" ConceptLink="http://cdb.iso.org/lg/CDB-00135759-001">tmd</item>
+                                    <item AppInfo="TremembÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00135760-001">tme</item>
+                                    <item AppInfo="Toba-Maskoy" ConceptLink="http://cdb.iso.org/lg/CDB-00135761-001">tmf</item>
+                                    <item AppInfo="TernateÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00138337-001">tmg</item>
+                                    <item AppInfo="Tamashek" ConceptLink="http://cdb.iso.org/lg/CDB-00130989-001">tmh</item>
+                                    <item AppInfo="Tutuba" ConceptLink="http://cdb.iso.org/lg/CDB-00135762-001">tmi</item>
+                                    <item AppInfo="Samarokena" ConceptLink="http://cdb.iso.org/lg/CDB-00135775-001">tmj</item>
+                                    <item AppInfo="Northwestern Tamang" ConceptLink="http://cdb.iso.org/lg/CDB-00135764-001">tmk</item>
+                                    <item AppInfo="Tamnim Citak" ConceptLink="http://cdb.iso.org/lg/CDB-00135753-001">tml</item>
+                                    <item AppInfo="Tai Thanh" ConceptLink="http://cdb.iso.org/lg/CDB-00135766-001">tmm</item>
+                                    <item AppInfo="Taman" ConceptLink="http://cdb.iso.org/lg/CDB-00135767-001">tmn</item>
+                                    <item AppInfo="Temoq" ConceptLink="http://cdb.iso.org/lg/CDB-00135768-001">tmo</item>
+                                    <item AppInfo="Tai MÃšne" ConceptLink="http://cdb.iso.org/lg/CDB-00135769-001">tmp</item>
+                                    <item AppInfo="Tumleo" ConceptLink="http://cdb.iso.org/lg/CDB-00135770-001">tmq</item>
+                                    <item AppInfo="Jewish Babylonian Aramaic" ConceptLink="http://cdb.iso.org/lg/CDB-00138288-001">tmr</item>
+                                    <item AppInfo="Tima" ConceptLink="http://cdb.iso.org/lg/CDB-00135771-001">tms</item>
+                                    <item AppInfo="Tasmate" ConceptLink="http://cdb.iso.org/lg/CDB-00135772-001">tmt</item>
+                                    <item AppInfo="Iau" ConceptLink="http://cdb.iso.org/lg/CDB-00135773-001">tmu</item>
+                                    <item AppInfo="Tembo; Motembo" ConceptLink="http://cdb.iso.org/lg/CDB-00135774-001">tmv</item>
+                                    <item AppInfo="Temuan" ConceptLink="http://cdb.iso.org/lg/CDB-00135500-001">tmw</item>
+                                    <item AppInfo="Tami" ConceptLink="http://cdb.iso.org/lg/CDB-00135225-001">tmy</item>
+                                    <item AppInfo="Tamanaku" ConceptLink="http://cdb.iso.org/lg/CDB-00138246-001">tmz</item>
+                                    <item AppInfo="Tacana" ConceptLink="http://cdb.iso.org/lg/CDB-00135591-001">tna</item>
+                                    <item AppInfo="Western Tunebo" ConceptLink="http://cdb.iso.org/lg/CDB-00135275-001">tnb</item>
+                                    <item AppInfo="Tanimuca-RetuarÃ£" ConceptLink="http://cdb.iso.org/lg/CDB-00135276-001">tnc</item>
+                                    <item AppInfo="Angosturas Tunebo" ConceptLink="http://cdb.iso.org/lg/CDB-00135277-001">tnd</item>
+                                    <item AppInfo="Tinoc Kallahan" ConceptLink="http://cdb.iso.org/lg/CDB-00135278-001">tne</item>
+                                    <item AppInfo="Tangshewi" ConceptLink="http://cdb.iso.org/lg/CDB-00135279-001">tnf</item>
+                                    <item AppInfo="Tobanga" ConceptLink="http://cdb.iso.org/lg/CDB-00135280-001">tng</item>
+                                    <item AppInfo="Maiani" ConceptLink="http://cdb.iso.org/lg/CDB-00135281-001">tnh</item>
+                                    <item AppInfo="Tandia" ConceptLink="http://cdb.iso.org/lg/CDB-00135282-001">tni</item>
+                                    <item AppInfo="Kwamera" ConceptLink="http://cdb.iso.org/lg/CDB-00135295-001">tnk</item>
+                                    <item AppInfo="Lenakel" ConceptLink="http://cdb.iso.org/lg/CDB-00135284-001">tnl</item>
+                                    <item AppInfo="Tabla" ConceptLink="http://cdb.iso.org/lg/CDB-00135273-001">tnm</item>
+                                    <item AppInfo="North Tanna" ConceptLink="http://cdb.iso.org/lg/CDB-00135286-001">tnn</item>
+                                    <item AppInfo="Toromono" ConceptLink="http://cdb.iso.org/lg/CDB-00135287-001">tno</item>
+                                    <item AppInfo="Whitesands" ConceptLink="http://cdb.iso.org/lg/CDB-00135288-001">tnp</item>
+                                    <item AppInfo="Taino" ConceptLink="http://cdb.iso.org/lg/CDB-00138279-001">tnq</item>
+                                    <item AppInfo="Bedik" ConceptLink="http://cdb.iso.org/lg/CDB-00135289-001">tnr</item>
+                                    <item AppInfo="Tenis" ConceptLink="http://cdb.iso.org/lg/CDB-00135290-001">tns</item>
+                                    <item AppInfo="Tontemboan" ConceptLink="http://cdb.iso.org/lg/CDB-00135291-001">tnt</item>
+                                    <item AppInfo="Tay Khang" ConceptLink="http://cdb.iso.org/lg/CDB-00135292-001">tnu</item>
+                                    <item AppInfo="Tangchangya" ConceptLink="http://cdb.iso.org/lg/CDB-00135293-001">tnv</item>
+                                    <item AppInfo="Tonsawang" ConceptLink="http://cdb.iso.org/lg/CDB-00135294-001">tnw</item>
+                                    <item AppInfo="Tanema" ConceptLink="http://cdb.iso.org/lg/CDB-00135262-001">tnx</item>
+                                    <item AppInfo="Tongwe" ConceptLink="http://cdb.iso.org/lg/CDB-00135260-001">tny</item>
+                                    <item AppInfo="Tonga" ConceptLink="http://cdb.iso.org/lg/CDB-00135283-001">tnz</item>
+                                    <item AppInfo="Toba" ConceptLink="http://cdb.iso.org/lg/CDB-00135252-001">tob</item>
+                                    <item AppInfo="Coyutla Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135253-001">toc</item>
+                                    <item AppInfo="Toma" ConceptLink="http://cdb.iso.org/lg/CDB-00135254-001">tod</item>
+                                    <item AppInfo="Tomedes" ConceptLink="http://cdb.iso.org/lg/CDB-00137957-001">toe</item>
+                                    <item AppInfo="Gizrra" ConceptLink="http://cdb.iso.org/lg/CDB-00135255-001">tof</item>
+                                    <item AppInfo="Tonga" ConceptLink="http://cdb.iso.org/lg/CDB-00135256-001">tog</item>
+                                    <item AppInfo="Gitonga" ConceptLink="http://cdb.iso.org/lg/CDB-00135257-001">toh</item>
+                                    <item AppInfo="Tonga" ConceptLink="http://cdb.iso.org/lg/CDB-00135258-001">toi</item>
+                                    <item AppInfo="Tojolabal" ConceptLink="http://cdb.iso.org/lg/CDB-00135259-001">toj</item>
+                                    <item AppInfo="Tolowa" ConceptLink="http://cdb.iso.org/lg/CDB-00135272-001">tol</item>
+                                    <item AppInfo="Tombulu" ConceptLink="http://cdb.iso.org/lg/CDB-00135261-001">tom</item>
+                                    <item AppInfo="Tonga" ConceptLink="http://cdb.iso.org/lg/CDB-00138629-001">ton</item>
+                                    <item AppInfo="Xicotepec De JuÃ¡rez Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135250-001">too</item>
+                                    <item AppInfo="Papantla Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135263-001">top</item>
+                                    <item AppInfo="Toposa" ConceptLink="http://cdb.iso.org/lg/CDB-00135264-001">toq</item>
+                                    <item AppInfo="Togbo-Vara Banda" ConceptLink="http://cdb.iso.org/lg/CDB-00135265-001">tor</item>
+                                    <item AppInfo="Highland Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135266-001">tos</item>
+                                    <item AppInfo="Tho" ConceptLink="http://cdb.iso.org/lg/CDB-00135267-001">tou</item>
+                                    <item AppInfo="Upper Taromi" ConceptLink="http://cdb.iso.org/lg/CDB-00135268-001">tov</item>
+                                    <item AppInfo="Jemez" ConceptLink="http://cdb.iso.org/lg/CDB-00135269-001">tow</item>
+                                    <item AppInfo="Tobian" ConceptLink="http://cdb.iso.org/lg/CDB-00135270-001">tox</item>
+                                    <item AppInfo="Topoiyo" ConceptLink="http://cdb.iso.org/lg/CDB-00135297-001">toy</item>
+                                    <item AppInfo="To" ConceptLink="http://cdb.iso.org/lg/CDB-00135251-001">toz</item>
+                                    <item AppInfo="Taupota" ConceptLink="http://cdb.iso.org/lg/CDB-00135285-001">tpa</item>
+                                    <item AppInfo="AzoyÃº Me'phaa" ConceptLink="http://cdb.iso.org/lg/CDB-00135320-001">tpc</item>
+                                    <item AppInfo="Tippera" ConceptLink="http://cdb.iso.org/lg/CDB-00135321-001">tpe</item>
+                                    <item AppInfo="Tarpia" ConceptLink="http://cdb.iso.org/lg/CDB-00135322-001">tpf</item>
+                                    <item AppInfo="Kula" ConceptLink="http://cdb.iso.org/lg/CDB-00135323-001">tpg</item>
+                                    <item AppInfo="Tok Pisin" ConceptLink="http://cdb.iso.org/lg/CDB-00135324-001">tpi</item>
+                                    <item AppInfo="TapietÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00135325-001">tpj</item>
+                                    <item AppInfo="Tupinikin" ConceptLink="http://cdb.iso.org/lg/CDB-00137938-001">tpk</item>
+                                    <item AppInfo="Tlacoapa Me'phaa" ConceptLink="http://cdb.iso.org/lg/CDB-00135326-001">tpl</item>
+                                    <item AppInfo="Tampulma" ConceptLink="http://cdb.iso.org/lg/CDB-00135327-001">tpm</item>
+                                    <item AppInfo="TupinambÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00137930-001">tpn</item>
+                                    <item AppInfo="Tai Pao" ConceptLink="http://cdb.iso.org/lg/CDB-00135328-001">tpo</item>
+                                    <item AppInfo="Pisaflores Tepehua" ConceptLink="http://cdb.iso.org/lg/CDB-00135341-001">tpp</item>
+                                    <item AppInfo="Tukpa" ConceptLink="http://cdb.iso.org/lg/CDB-00135330-001">tpq</item>
+                                    <item AppInfo="TuparÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00135319-001">tpr</item>
+                                    <item AppInfo="Tlachichilco Tepehua" ConceptLink="http://cdb.iso.org/lg/CDB-00135332-001">tpt</item>
+                                    <item AppInfo="Tampuan" ConceptLink="http://cdb.iso.org/lg/CDB-00135333-001">tpu</item>
+                                    <item AppInfo="Tanapag" ConceptLink="http://cdb.iso.org/lg/CDB-00135334-001">tpv</item>
+                                    <item AppInfo="TupÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00138095-001">tpw</item>
+                                    <item AppInfo="Acatepec Me'phaa" ConceptLink="http://cdb.iso.org/lg/CDB-00135335-001">tpx</item>
+                                    <item AppInfo="Trumai" ConceptLink="http://cdb.iso.org/lg/CDB-00135336-001">tpy</item>
+                                    <item AppInfo="Tinputz" ConceptLink="http://cdb.iso.org/lg/CDB-00135337-001">tpz</item>
+                                    <item AppInfo="TembÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00135338-001">tqb</item>
+                                    <item AppInfo="Lehali" ConceptLink="http://cdb.iso.org/lg/CDB-00135339-001">tql</item>
+                                    <item AppInfo="Turumsa" ConceptLink="http://cdb.iso.org/lg/CDB-00135340-001">tqm</item>
+                                    <item AppInfo="Tenino" ConceptLink="http://cdb.iso.org/lg/CDB-00135308-001">tqn</item>
+                                    <item AppInfo="Toaripi" ConceptLink="http://cdb.iso.org/lg/CDB-00135306-001">tqo</item>
+                                    <item AppInfo="Tomoip" ConceptLink="http://cdb.iso.org/lg/CDB-00135329-001">tqp</item>
+                                    <item AppInfo="Tunni" ConceptLink="http://cdb.iso.org/lg/CDB-00135298-001">tqq</item>
+                                    <item AppInfo="Torona" ConceptLink="http://cdb.iso.org/lg/CDB-00138081-001">tqr</item>
+                                    <item AppInfo="Western Totonac" ConceptLink="http://cdb.iso.org/lg/CDB-00135299-001">tqt</item>
+                                    <item AppInfo="Touo" ConceptLink="http://cdb.iso.org/lg/CDB-00135300-001">tqu</item>
+                                    <item AppInfo="Tonkawa" ConceptLink="http://cdb.iso.org/lg/CDB-00138077-001">tqw</item>
+                                    <item AppInfo="Tirahi" ConceptLink="http://cdb.iso.org/lg/CDB-00135301-001">tra</item>
+                                    <item AppInfo="Terebu" ConceptLink="http://cdb.iso.org/lg/CDB-00135302-001">trb</item>
+                                    <item AppInfo="Copala Triqui" ConceptLink="http://cdb.iso.org/lg/CDB-00135303-001">trc</item>
+                                    <item AppInfo="Turi" ConceptLink="http://cdb.iso.org/lg/CDB-00135304-001">trd</item>
+                                    <item AppInfo="East Tarangan" ConceptLink="http://cdb.iso.org/lg/CDB-00135305-001">tre</item>
+                                    <item AppInfo="Trinidadian Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00135318-001">trf</item>
+                                    <item AppInfo="LishÃ¡n DidÃ¡n" ConceptLink="http://cdb.iso.org/lg/CDB-00135307-001">trg</item>
+                                    <item AppInfo="Turaka" ConceptLink="http://cdb.iso.org/lg/CDB-00135296-001">trh</item>
+                                    <item AppInfo="TriÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00135309-001">tri</item>
+                                    <item AppInfo="Toram" ConceptLink="http://cdb.iso.org/lg/CDB-00135310-001">trj</item>
+                                    <item AppInfo="Traveller Scottish" ConceptLink="http://cdb.iso.org/lg/CDB-00135311-001">trl</item>
+                                    <item AppInfo="Tregami" ConceptLink="http://cdb.iso.org/lg/CDB-00135312-001">trm</item>
+                                    <item AppInfo="Trinitario" ConceptLink="http://cdb.iso.org/lg/CDB-00135313-001">trn</item>
+                                    <item AppInfo="Tarao Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00135314-001">tro</item>
+                                    <item AppInfo="Kok Borok" ConceptLink="http://cdb.iso.org/lg/CDB-00135315-001">trp</item>
+                                    <item AppInfo="San MartÃ­n Itunyoso Triqui" ConceptLink="http://cdb.iso.org/lg/CDB-00135316-001">trq</item>
+                                    <item AppInfo="Taushiro" ConceptLink="http://cdb.iso.org/lg/CDB-00135228-001">trr</item>
+                                    <item AppInfo="Chicahuaxtla Triqui" ConceptLink="http://cdb.iso.org/lg/CDB-00135331-001">trs</item>
+                                    <item AppInfo="Tunggare" ConceptLink="http://cdb.iso.org/lg/CDB-00135271-001">trt</item>
+                                    <item AppInfo="Turoyo" ConceptLink="http://cdb.iso.org/lg/CDB-00135182-001">tru</item>
+                                    <item AppInfo="Taroko" ConceptLink="http://cdb.iso.org/lg/CDB-00135183-001">trv</item>
+                                    <item AppInfo="Torwali" ConceptLink="http://cdb.iso.org/lg/CDB-00135184-001">trw</item>
+                                    <item AppInfo="Tringgus-Sembaan Bidayuh" ConceptLink="http://cdb.iso.org/lg/CDB-00135185-001">trx</item>
+                                    <item AppInfo="Turung" ConceptLink="http://cdb.iso.org/lg/CDB-00138064-001">try</item>
+                                    <item AppInfo="TorÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00135186-001">trz</item>
+                                    <item AppInfo="Tsaangi" ConceptLink="http://cdb.iso.org/lg/CDB-00135187-001">tsa</item>
+                                    <item AppInfo="Tsamai" ConceptLink="http://cdb.iso.org/lg/CDB-00135188-001">tsb</item>
+                                    <item AppInfo="Tswa" ConceptLink="http://cdb.iso.org/lg/CDB-00135189-001">tsc</item>
+                                    <item AppInfo="Tsakonian" ConceptLink="http://cdb.iso.org/lg/CDB-00135190-001">tsd</item>
+                                    <item AppInfo="Tunisian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135203-001">tse</item>
+                                    <item AppInfo="Southwestern Tamang" ConceptLink="http://cdb.iso.org/lg/CDB-00135192-001">tsf</item>
+                                    <item AppInfo="Tausug" ConceptLink="http://cdb.iso.org/lg/CDB-00135181-001">tsg</item>
+                                    <item AppInfo="Tsuvan" ConceptLink="http://cdb.iso.org/lg/CDB-00135194-001">tsh</item>
+                                    <item AppInfo="Tsimshian" ConceptLink="http://cdb.iso.org/lg/CDB-00135195-001">tsi</item>
+                                    <item AppInfo="Tshangla" ConceptLink="http://cdb.iso.org/lg/CDB-00135196-001">tsj</item>
+                                    <item AppInfo="Tseku" ConceptLink="http://cdb.iso.org/lg/CDB-00135197-001">tsk</item>
+                                    <item AppInfo="Ts'ÃŒn-Lao" ConceptLink="http://cdb.iso.org/lg/CDB-00135198-001">tsl</item>
+                                    <item AppInfo="Turkish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135199-001">tsm</item>
+                                    <item AppInfo="Setswana; Tswana" ConceptLink="http://cdb.iso.org/lg/CDB-00138628-001">tsn</item>
+                                    <item AppInfo="Tsonga" ConceptLink="http://cdb.iso.org/lg/CDB-00138631-001">tso</item>
+                                    <item AppInfo="Northern Toussian" ConceptLink="http://cdb.iso.org/lg/CDB-00135200-001">tsp</item>
+                                    <item AppInfo="Thai Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135201-001">tsq</item>
+                                    <item AppInfo="Akei" ConceptLink="http://cdb.iso.org/lg/CDB-00135170-001">tsr</item>
+                                    <item AppInfo="Taiwan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135193-001">tss</item>
+                                    <item AppInfo="Tsou" ConceptLink="http://cdb.iso.org/lg/CDB-00135191-001">tsu</item>
+                                    <item AppInfo="Tsogo" ConceptLink="http://cdb.iso.org/lg/CDB-00135160-001">tsv</item>
+                                    <item AppInfo="Tsishingini" ConceptLink="http://cdb.iso.org/lg/CDB-00135161-001">tsw</item>
+                                    <item AppInfo="Mubami" ConceptLink="http://cdb.iso.org/lg/CDB-00135162-001">tsx</item>
+                                    <item AppInfo="Tebul Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135163-001">tsy</item>
+                                    <item AppInfo="Purepecha" ConceptLink="http://cdb.iso.org/lg/CDB-00135164-001">tsz</item>
+                                    <item AppInfo="Tutelo" ConceptLink="http://cdb.iso.org/lg/CDB-00138057-001">tta</item>
+                                    <item AppInfo="Gaa" ConceptLink="http://cdb.iso.org/lg/CDB-00135165-001">ttb</item>
+                                    <item AppInfo="Tektiteko" ConceptLink="http://cdb.iso.org/lg/CDB-00135166-001">ttc</item>
+                                    <item AppInfo="Tauade" ConceptLink="http://cdb.iso.org/lg/CDB-00135167-001">ttd</item>
+                                    <item AppInfo="Bwanabwana" ConceptLink="http://cdb.iso.org/lg/CDB-00135180-001">tte</item>
+                                    <item AppInfo="Tuotomb" ConceptLink="http://cdb.iso.org/lg/CDB-00135169-001">ttf</item>
+                                    <item AppInfo="Tutong" ConceptLink="http://cdb.iso.org/lg/CDB-00135159-001">ttg</item>
+                                    <item AppInfo="Upper Ta'oih" ConceptLink="http://cdb.iso.org/lg/CDB-00135171-001">tth</item>
+                                    <item AppInfo="Tobati" ConceptLink="http://cdb.iso.org/lg/CDB-00135172-001">tti</item>
+                                    <item AppInfo="Tooro" ConceptLink="http://cdb.iso.org/lg/CDB-00135173-001">ttj</item>
+                                    <item AppInfo="Totoro" ConceptLink="http://cdb.iso.org/lg/CDB-00135174-001">ttk</item>
+                                    <item AppInfo="Totela" ConceptLink="http://cdb.iso.org/lg/CDB-00135175-001">ttl</item>
+                                    <item AppInfo="Northern Tutchone" ConceptLink="http://cdb.iso.org/lg/CDB-00135176-001">ttm</item>
+                                    <item AppInfo="Towei" ConceptLink="http://cdb.iso.org/lg/CDB-00135177-001">ttn</item>
+                                    <item AppInfo="Lower Ta'oih" ConceptLink="http://cdb.iso.org/lg/CDB-00135178-001">tto</item>
+                                    <item AppInfo="Tombelala" ConceptLink="http://cdb.iso.org/lg/CDB-00135179-001">ttp</item>
+                                    <item AppInfo="Tawallammat Tamajaq" ConceptLink="http://cdb.iso.org/lg/CDB-00135205-001">ttq</item>
+                                    <item AppInfo="Tera" ConceptLink="http://cdb.iso.org/lg/CDB-00135239-001">ttr</item>
+                                    <item AppInfo="Northeastern Thai" ConceptLink="http://cdb.iso.org/lg/CDB-00135202-001">tts</item>
+                                    <item AppInfo="Muslim Tat" ConceptLink="http://cdb.iso.org/lg/CDB-00135229-001">ttt</item>
+                                    <item AppInfo="Torau" ConceptLink="http://cdb.iso.org/lg/CDB-00135230-001">ttu</item>
+                                    <item AppInfo="Titan" ConceptLink="http://cdb.iso.org/lg/CDB-00135231-001">ttv</item>
+                                    <item AppInfo="Long Wat" ConceptLink="http://cdb.iso.org/lg/CDB-00135232-001">ttw</item>
+                                    <item AppInfo="Sikaritai" ConceptLink="http://cdb.iso.org/lg/CDB-00135233-001">tty</item>
+                                    <item AppInfo="Tsum" ConceptLink="http://cdb.iso.org/lg/CDB-00135234-001">ttz</item>
+                                    <item AppInfo="Wiarumus" ConceptLink="http://cdb.iso.org/lg/CDB-00135235-001">tua</item>
+                                    <item AppInfo="TÃŒbatulabal" ConceptLink="http://cdb.iso.org/lg/CDB-00135236-001">tub</item>
+                                    <item AppInfo="Mutu" ConceptLink="http://cdb.iso.org/lg/CDB-00135249-001">tuc</item>
+                                    <item AppInfo="TuxÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138088-001">tud</item>
+                                    <item AppInfo="Tuyuca" ConceptLink="http://cdb.iso.org/lg/CDB-00135238-001">tue</item>
+                                    <item AppInfo="Central Tunebo" ConceptLink="http://cdb.iso.org/lg/CDB-00135227-001">tuf</item>
+                                    <item AppInfo="Tunia" ConceptLink="http://cdb.iso.org/lg/CDB-00135240-001">tug</item>
+                                    <item AppInfo="Taulil" ConceptLink="http://cdb.iso.org/lg/CDB-00135241-001">tuh</item>
+                                    <item AppInfo="Tupuri" ConceptLink="http://cdb.iso.org/lg/CDB-00135242-001">tui</item>
+                                    <item AppInfo="Tugutil" ConceptLink="http://cdb.iso.org/lg/CDB-00135243-001">tuj</item>
+                                    <item AppInfo="Turkmen" ConceptLink="http://cdb.iso.org/lg/CDB-00138626-001">tuk</item>
+                                    <item AppInfo="Tula" ConceptLink="http://cdb.iso.org/lg/CDB-00135244-001">tul</item>
+                                    <item AppInfo="Tumbuka" ConceptLink="http://cdb.iso.org/lg/CDB-00135245-001">tum</item>
+                                    <item AppInfo="Tunica" ConceptLink="http://cdb.iso.org/lg/CDB-00137951-001">tun</item>
+                                    <item AppInfo="Tucano" ConceptLink="http://cdb.iso.org/lg/CDB-00135246-001">tuo</item>
+                                    <item AppInfo="Tedaga" ConceptLink="http://cdb.iso.org/lg/CDB-00135247-001">tuq</item>
+                                    <item AppInfo="Turkish" ConceptLink="http://cdb.iso.org/lg/CDB-00138630-001">tur</item>
+                                    <item AppInfo="Tuscarora" ConceptLink="http://cdb.iso.org/lg/CDB-00135248-001">tus</item>
+                                    <item AppInfo="Tututni" ConceptLink="http://cdb.iso.org/lg/CDB-00135216-001">tuu</item>
+                                    <item AppInfo="Turkana" ConceptLink="http://cdb.iso.org/lg/CDB-00135214-001">tuv</item>
+                                    <item AppInfo="TuxinÃ¡wa" ConceptLink="http://cdb.iso.org/lg/CDB-00137988-001">tux</item>
+                                    <item AppInfo="Tugen" ConceptLink="http://cdb.iso.org/lg/CDB-00135237-001">tuy</item>
+                                    <item AppInfo="Turka" ConceptLink="http://cdb.iso.org/lg/CDB-00135206-001">tuz</item>
+                                    <item AppInfo="Vaghua" ConceptLink="http://cdb.iso.org/lg/CDB-00135207-001">tva</item>
+                                    <item AppInfo="Tsuvadi" ConceptLink="http://cdb.iso.org/lg/CDB-00135208-001">tvd</item>
+                                    <item AppInfo="Te'un" ConceptLink="http://cdb.iso.org/lg/CDB-00135209-001">tve</item>
+                                    <item AppInfo="Southeast Ambrym" ConceptLink="http://cdb.iso.org/lg/CDB-00135210-001">tvk</item>
+                                    <item AppInfo="Tuvalu" ConceptLink="http://cdb.iso.org/lg/CDB-00135211-001">tvl</item>
+                                    <item AppInfo="Tela-Masbuar" ConceptLink="http://cdb.iso.org/lg/CDB-00135212-001">tvm</item>
+                                    <item AppInfo="Tavoyan" ConceptLink="http://cdb.iso.org/lg/CDB-00135213-001">tvn</item>
+                                    <item AppInfo="Tidore" ConceptLink="http://cdb.iso.org/lg/CDB-00135226-001">tvo</item>
+                                    <item AppInfo="Taveta" ConceptLink="http://cdb.iso.org/lg/CDB-00135215-001">tvs</item>
+                                    <item AppInfo="Tutsa Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00135204-001">tvt</item>
+                                    <item AppInfo="Sedoa" ConceptLink="http://cdb.iso.org/lg/CDB-00135217-001">tvw</item>
+                                    <item AppInfo="Timor Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00138007-001">tvy</item>
+                                    <item AppInfo="Twana" ConceptLink="http://cdb.iso.org/lg/CDB-00137961-001">twa</item>
+                                    <item AppInfo="Western Tawbuid" ConceptLink="http://cdb.iso.org/lg/CDB-00135218-001">twb</item>
+                                    <item AppInfo="Teshenawa" ConceptLink="http://cdb.iso.org/lg/CDB-00137964-001">twc</item>
+                                    <item AppInfo="Twents" ConceptLink="http://cdb.iso.org/lg/CDB-00135219-001">twd</item>
+                                    <item AppInfo="Tewa" ConceptLink="http://cdb.iso.org/lg/CDB-00135220-001">twe</item>
+                                    <item AppInfo="Northern Tiwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135221-001">twf</item>
+                                    <item AppInfo="Tereweng" ConceptLink="http://cdb.iso.org/lg/CDB-00135222-001">twg</item>
+                                    <item AppInfo="Tai DÃ³n" ConceptLink="http://cdb.iso.org/lg/CDB-00135223-001">twh</item>
+                                    <item AppInfo="Twi" ConceptLink="http://cdb.iso.org/lg/CDB-00138633-001">twi</item>
+                                    <item AppInfo="Tawara" ConceptLink="http://cdb.iso.org/lg/CDB-00135224-001">twl</item>
+                                    <item AppInfo="Tawang Monpa" ConceptLink="http://cdb.iso.org/lg/CDB-00135351-001">twm</item>
+                                    <item AppInfo="Twendi" ConceptLink="http://cdb.iso.org/lg/CDB-00135168-001">twn</item>
+                                    <item AppInfo="Tswapong" ConceptLink="http://cdb.iso.org/lg/CDB-00135317-001">two</item>
+                                    <item AppInfo="Ere" ConceptLink="http://cdb.iso.org/lg/CDB-00135457-001">twp</item>
+                                    <item AppInfo="Tasawaq" ConceptLink="http://cdb.iso.org/lg/CDB-00135458-001">twq</item>
+                                    <item AppInfo="Southwestern Tarahumara" ConceptLink="http://cdb.iso.org/lg/CDB-00135459-001">twr</item>
+                                    <item AppInfo="TuriwÃ¡ra" ConceptLink="http://cdb.iso.org/lg/CDB-00138258-001">twt</item>
+                                    <item AppInfo="Termanu" ConceptLink="http://cdb.iso.org/lg/CDB-00135460-001">twu</item>
+                                    <item AppInfo="Tuwari" ConceptLink="http://cdb.iso.org/lg/CDB-00135461-001">tww</item>
+                                    <item AppInfo="Tewe" ConceptLink="http://cdb.iso.org/lg/CDB-00135462-001">twx</item>
+                                    <item AppInfo="Tawoyan" ConceptLink="http://cdb.iso.org/lg/CDB-00135463-001">twy</item>
+                                    <item AppInfo="Tombonuo" ConceptLink="http://cdb.iso.org/lg/CDB-00135464-001">txa</item>
+                                    <item AppInfo="Tokharian B" ConceptLink="http://cdb.iso.org/lg/CDB-00138374-001">txb</item>
+                                    <item AppInfo="Tsetsaut" ConceptLink="http://cdb.iso.org/lg/CDB-00138257-001">txc</item>
+                                    <item AppInfo="Totoli" ConceptLink="http://cdb.iso.org/lg/CDB-00135465-001">txe</item>
+                                    <item AppInfo="Tangut" ConceptLink="http://cdb.iso.org/lg/CDB-00138375-001">txg</item>
+                                    <item AppInfo="Thracian" ConceptLink="http://cdb.iso.org/lg/CDB-00138368-001">txh</item>
+                                    <item AppInfo="Ikpeng" ConceptLink="http://cdb.iso.org/lg/CDB-00135478-001">txi</item>
+                                    <item AppInfo="Tomini" ConceptLink="http://cdb.iso.org/lg/CDB-00135467-001">txm</item>
+                                    <item AppInfo="West Tarangan" ConceptLink="http://cdb.iso.org/lg/CDB-00135456-001">txn</item>
+                                    <item AppInfo="Toto" ConceptLink="http://cdb.iso.org/lg/CDB-00135469-001">txo</item>
+                                    <item AppInfo="Tii" ConceptLink="http://cdb.iso.org/lg/CDB-00135470-001">txq</item>
+                                    <item AppInfo="Tartessian" ConceptLink="http://cdb.iso.org/lg/CDB-00138363-001">txr</item>
+                                    <item AppInfo="Tonsea" ConceptLink="http://cdb.iso.org/lg/CDB-00135471-001">txs</item>
+                                    <item AppInfo="Citak" ConceptLink="http://cdb.iso.org/lg/CDB-00135472-001">txt</item>
+                                    <item AppInfo="KayapÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00135473-001">txu</item>
+                                    <item AppInfo="Tatana" ConceptLink="http://cdb.iso.org/lg/CDB-00135474-001">txx</item>
+                                    <item AppInfo="Tanosy Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00135475-001">txy</item>
+                                    <item AppInfo="Tauya" ConceptLink="http://cdb.iso.org/lg/CDB-00135476-001">tya</item>
+                                    <item AppInfo="Kyenga" ConceptLink="http://cdb.iso.org/lg/CDB-00135477-001">tye</item>
+                                    <item AppInfo="O'du" ConceptLink="http://cdb.iso.org/lg/CDB-00135445-001">tyh</item>
+                                    <item AppInfo="Teke-Tsaayi" ConceptLink="http://cdb.iso.org/lg/CDB-00135443-001">tyi</item>
+                                    <item AppInfo="Tai Do" ConceptLink="http://cdb.iso.org/lg/CDB-00135466-001">tyj</item>
+                                    <item AppInfo="Thu Lao" ConceptLink="http://cdb.iso.org/lg/CDB-00135435-001">tyl</item>
+                                    <item AppInfo="Kombai" ConceptLink="http://cdb.iso.org/lg/CDB-00135436-001">tyn</item>
+                                    <item AppInfo="Thaypan" ConceptLink="http://cdb.iso.org/lg/CDB-00135437-001">typ</item>
+                                    <item AppInfo="Tai Daeng" ConceptLink="http://cdb.iso.org/lg/CDB-00135438-001">tyr</item>
+                                    <item AppInfo="TÃ y Sa Pa" ConceptLink="http://cdb.iso.org/lg/CDB-00135439-001">tys</item>
+                                    <item AppInfo="TÃ y Tac" ConceptLink="http://cdb.iso.org/lg/CDB-00135440-001">tyt</item>
+                                    <item AppInfo="Kua" ConceptLink="http://cdb.iso.org/lg/CDB-00135441-001">tyu</item>
+                                    <item AppInfo="Tuvinian" ConceptLink="http://cdb.iso.org/lg/CDB-00135442-001">tyv</item>
+                                    <item AppInfo="Teke-Tyee" ConceptLink="http://cdb.iso.org/lg/CDB-00135455-001">tyx</item>
+                                    <item AppInfo="TÃ y" ConceptLink="http://cdb.iso.org/lg/CDB-00135444-001">tyz</item>
+                                    <item AppInfo="Tanzanian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135433-001">tza</item>
+                                    <item AppInfo="Tzeltal" ConceptLink="http://cdb.iso.org/lg/CDB-00135446-001">tzh</item>
+                                    <item AppInfo="Tz'utujil" ConceptLink="http://cdb.iso.org/lg/CDB-00135447-001">tzj</item>
+                                    <item AppInfo="Central Atlas Tamazight" ConceptLink="http://cdb.iso.org/lg/CDB-00135448-001">tzm</item>
+                                    <item AppInfo="Tugun" ConceptLink="http://cdb.iso.org/lg/CDB-00135449-001">tzn</item>
+                                    <item AppInfo="Tzotzil" ConceptLink="http://cdb.iso.org/lg/CDB-00135450-001">tzo</item>
+                                    <item AppInfo="Tabriak" ConceptLink="http://cdb.iso.org/lg/CDB-00135451-001">tzx</item>
+                                    <item AppInfo="UamuÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00138330-001">uam</item>
+                                    <item AppInfo="Kuan" ConceptLink="http://cdb.iso.org/lg/CDB-00135452-001">uan</item>
+                                    <item AppInfo="Tairuma" ConceptLink="http://cdb.iso.org/lg/CDB-00135453-001">uar</item>
+                                    <item AppInfo="Ubang" ConceptLink="http://cdb.iso.org/lg/CDB-00135480-001">uba</item>
+                                    <item AppInfo="Ubi" ConceptLink="http://cdb.iso.org/lg/CDB-00135434-001">ubi</item>
+                                    <item AppInfo="Ubir" ConceptLink="http://cdb.iso.org/lg/CDB-00135468-001">ubr</item>
+                                    <item AppInfo="Umbu-Ungu" ConceptLink="http://cdb.iso.org/lg/CDB-00135503-001">ubu</item>
+                                    <item AppInfo="Ubykh" ConceptLink="http://cdb.iso.org/lg/CDB-00138270-001">uby</item>
+                                    <item AppInfo="Uda" ConceptLink="http://cdb.iso.org/lg/CDB-00135504-001">uda</item>
+                                    <item AppInfo="Udihe" ConceptLink="http://cdb.iso.org/lg/CDB-00135505-001">ude</item>
+                                    <item AppInfo="Muduga" ConceptLink="http://cdb.iso.org/lg/CDB-00135506-001">udg</item>
+                                    <item AppInfo="Udi" ConceptLink="http://cdb.iso.org/lg/CDB-00135507-001">udi</item>
+                                    <item AppInfo="Ujir" ConceptLink="http://cdb.iso.org/lg/CDB-00135508-001">udj</item>
+                                    <item AppInfo="Wuzlam" ConceptLink="http://cdb.iso.org/lg/CDB-00135509-001">udl</item>
+                                    <item AppInfo="Udmurt" ConceptLink="http://cdb.iso.org/lg/CDB-00135510-001">udm</item>
+                                    <item AppInfo="Uduk" ConceptLink="http://cdb.iso.org/lg/CDB-00135511-001">udu</item>
+                                    <item AppInfo="Kioko" ConceptLink="http://cdb.iso.org/lg/CDB-00135524-001">ues</item>
+                                    <item AppInfo="Ufim" ConceptLink="http://cdb.iso.org/lg/CDB-00135513-001">ufi</item>
+                                    <item AppInfo="Ugaritic" ConceptLink="http://cdb.iso.org/lg/CDB-00138373-001">uga</item>
+                                    <item AppInfo="Kuku-Ugbanh" ConceptLink="http://cdb.iso.org/lg/CDB-00135502-001">ugb</item>
+                                    <item AppInfo="Ughele" ConceptLink="http://cdb.iso.org/lg/CDB-00135515-001">uge</item>
+                                    <item AppInfo="Ugandan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135516-001">ugn</item>
+                                    <item AppInfo="Ugong" ConceptLink="http://cdb.iso.org/lg/CDB-00135517-001">ugo</item>
+                                    <item AppInfo="Uruguayan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135518-001">ugy</item>
+                                    <item AppInfo="Uhami" ConceptLink="http://cdb.iso.org/lg/CDB-00135519-001">uha</item>
+                                    <item AppInfo="Damal" ConceptLink="http://cdb.iso.org/lg/CDB-00135520-001">uhn</item>
+                                    <item AppInfo="Uighur; Uyghur" ConceptLink="http://cdb.iso.org/lg/CDB-00138635-001">uig</item>
+                                    <item AppInfo="Uisai" ConceptLink="http://cdb.iso.org/lg/CDB-00135521-001">uis</item>
+                                    <item AppInfo="Iyive" ConceptLink="http://cdb.iso.org/lg/CDB-00135522-001">uiv</item>
+                                    <item AppInfo="Tanjijili" ConceptLink="http://cdb.iso.org/lg/CDB-00135523-001">uji</item>
+                                    <item AppInfo="Kaburi" ConceptLink="http://cdb.iso.org/lg/CDB-00135491-001">uka</item>
+                                    <item AppInfo="Ukuriguma" ConceptLink="http://cdb.iso.org/lg/CDB-00135489-001">ukg</item>
+                                    <item AppInfo="Ukhwejo" ConceptLink="http://cdb.iso.org/lg/CDB-00135512-001">ukh</item>
+                                    <item AppInfo="Ukrainian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135481-001">ukl</item>
+                                    <item AppInfo="Ukpe-Bayobiri" ConceptLink="http://cdb.iso.org/lg/CDB-00135482-001">ukp</item>
+                                    <item AppInfo="Ukwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135483-001">ukq</item>
+                                    <item AppInfo="Ukrainian" ConceptLink="http://cdb.iso.org/lg/CDB-00138636-001">ukr</item>
+                                    <item AppInfo="UrubÃº-Kaapor Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135484-001">uks</item>
+                                    <item AppInfo="Ukue" ConceptLink="http://cdb.iso.org/lg/CDB-00135485-001">uku</item>
+                                    <item AppInfo="Ukwuani-Aboh-Ndoni" ConceptLink="http://cdb.iso.org/lg/CDB-00135486-001">ukw</item>
+                                    <item AppInfo="Fungwa" ConceptLink="http://cdb.iso.org/lg/CDB-00135487-001">ula</item>
+                                    <item AppInfo="Ulukwumi" ConceptLink="http://cdb.iso.org/lg/CDB-00135488-001">ulb</item>
+                                    <item AppInfo="Ulch" ConceptLink="http://cdb.iso.org/lg/CDB-00135501-001">ulc</item>
+                                    <item AppInfo="Usku" ConceptLink="http://cdb.iso.org/lg/CDB-00135490-001">ulf</item>
+                                    <item AppInfo="Ulithian" ConceptLink="http://cdb.iso.org/lg/CDB-00135479-001">uli</item>
+                                    <item AppInfo="Meriam" ConceptLink="http://cdb.iso.org/lg/CDB-00135492-001">ulk</item>
+                                    <item AppInfo="Ullatan" ConceptLink="http://cdb.iso.org/lg/CDB-00135493-001">ull</item>
+                                    <item AppInfo="Ulumanda'" ConceptLink="http://cdb.iso.org/lg/CDB-00135494-001">ulm</item>
+                                    <item AppInfo="Unserdeutsch" ConceptLink="http://cdb.iso.org/lg/CDB-00135495-001">uln</item>
+                                    <item AppInfo="Uma' Lung" ConceptLink="http://cdb.iso.org/lg/CDB-00135496-001">ulu</item>
+                                    <item AppInfo="Umatilla" ConceptLink="http://cdb.iso.org/lg/CDB-00135497-001">uma</item>
+                                    <item AppInfo="Umbundu" ConceptLink="http://cdb.iso.org/lg/CDB-00135498-001">umb</item>
+                                    <item AppInfo="Marrucinian" ConceptLink="http://cdb.iso.org/lg/CDB-00138361-001">umc</item>
+                                    <item AppInfo="Umbindhamu" ConceptLink="http://cdb.iso.org/lg/CDB-00135499-001">umd</item>
+                                    <item AppInfo="Umbuygamu" ConceptLink="http://cdb.iso.org/lg/CDB-00135411-001">umg</item>
+                                    <item AppInfo="Ukit" ConceptLink="http://cdb.iso.org/lg/CDB-00135514-001">umi</item>
+                                    <item AppInfo="Umon" ConceptLink="http://cdb.iso.org/lg/CDB-00135454-001">umm</item>
+                                    <item AppInfo="Makyan Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00135365-001">umn</item>
+                                    <item AppInfo="UmotÃ­na" ConceptLink="http://cdb.iso.org/lg/CDB-00138000-001">umo</item>
+                                    <item AppInfo="Umpila" ConceptLink="http://cdb.iso.org/lg/CDB-00135366-001">ump</item>
+                                    <item AppInfo="Umbugarla" ConceptLink="http://cdb.iso.org/lg/CDB-00135367-001">umr</item>
+                                    <item AppInfo="Pendau" ConceptLink="http://cdb.iso.org/lg/CDB-00135368-001">ums</item>
+                                    <item AppInfo="Munsee" ConceptLink="http://cdb.iso.org/lg/CDB-00135369-001">umu</item>
+                                    <item AppInfo="North Watut" ConceptLink="http://cdb.iso.org/lg/CDB-00135370-001">una</item>
+                                    <item AppInfo="undetermined" ConceptLink="http://cdb.iso.org/lg/CDB-00130975-001">und</item>
+                                    <item AppInfo="Uneme" ConceptLink="http://cdb.iso.org/lg/CDB-00135371-001">une</item>
+                                    <item AppInfo="Ngarinyin" ConceptLink="http://cdb.iso.org/lg/CDB-00135372-001">ung</item>
+                                    <item AppInfo="EnawenÃ©-NawÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00135373-001">unk</item>
+                                    <item AppInfo="Unami" ConceptLink="http://cdb.iso.org/lg/CDB-00137997-001">unm</item>
+                                    <item AppInfo="Worora" ConceptLink="http://cdb.iso.org/lg/CDB-00135386-001">unp</item>
+                                    <item AppInfo="Mundari" ConceptLink="http://cdb.iso.org/lg/CDB-00135375-001">unr</item>
+                                    <item AppInfo="Munda" ConceptLink="http://cdb.iso.org/lg/CDB-00135364-001">unx</item>
+                                    <item AppInfo="Unde Kaili" ConceptLink="http://cdb.iso.org/lg/CDB-00135377-001">unz</item>
+                                    <item AppInfo="Uokha" ConceptLink="http://cdb.iso.org/lg/CDB-00135378-001">uok</item>
+                                    <item AppInfo="Umeda" ConceptLink="http://cdb.iso.org/lg/CDB-00135379-001">upi</item>
+                                    <item AppInfo="Uripiv-Wala-Rano-Atchin" ConceptLink="http://cdb.iso.org/lg/CDB-00135380-001">upv</item>
+                                    <item AppInfo="Urarina" ConceptLink="http://cdb.iso.org/lg/CDB-00135381-001">ura</item>
+                                    <item AppInfo="UrubÃº-Kaapor" ConceptLink="http://cdb.iso.org/lg/CDB-00135382-001">urb</item>
+                                    <item AppInfo="Urningangg" ConceptLink="http://cdb.iso.org/lg/CDB-00135383-001">urc</item>
+                                    <item AppInfo="Urdu" ConceptLink="http://cdb.iso.org/lg/CDB-00138637-001">urd</item>
+                                    <item AppInfo="Uru" ConceptLink="http://cdb.iso.org/lg/CDB-00135384-001">ure</item>
+                                    <item AppInfo="Uradhi" ConceptLink="http://cdb.iso.org/lg/CDB-00135353-001">urf</item>
+                                    <item AppInfo="Urigina" ConceptLink="http://cdb.iso.org/lg/CDB-00135376-001">urg</item>
+                                    <item AppInfo="Urhobo" ConceptLink="http://cdb.iso.org/lg/CDB-00135374-001">urh</item>
+                                    <item AppInfo="Urim" ConceptLink="http://cdb.iso.org/lg/CDB-00135343-001">uri</item>
+                                    <item AppInfo="Urak Lawoi'" ConceptLink="http://cdb.iso.org/lg/CDB-00135344-001">urk</item>
+                                    <item AppInfo="Urali" ConceptLink="http://cdb.iso.org/lg/CDB-00135345-001">url</item>
+                                    <item AppInfo="Urapmin" ConceptLink="http://cdb.iso.org/lg/CDB-00135346-001">urm</item>
+                                    <item AppInfo="Uruangnirin" ConceptLink="http://cdb.iso.org/lg/CDB-00135347-001">urn</item>
+                                    <item AppInfo="Ura" ConceptLink="http://cdb.iso.org/lg/CDB-00135348-001">uro</item>
+                                    <item AppInfo="Uru-Pa-In" ConceptLink="http://cdb.iso.org/lg/CDB-00135349-001">urp</item>
+                                    <item AppInfo="Lehalurup" ConceptLink="http://cdb.iso.org/lg/CDB-00135350-001">urr</item>
+                                    <item AppInfo="Urat" ConceptLink="http://cdb.iso.org/lg/CDB-00135363-001">urt</item>
+                                    <item AppInfo="Urumi" ConceptLink="http://cdb.iso.org/lg/CDB-00137944-001">uru</item>
+                                    <item AppInfo="Uruava" ConceptLink="http://cdb.iso.org/lg/CDB-00137956-001">urv</item>
+                                    <item AppInfo="Sop" ConceptLink="http://cdb.iso.org/lg/CDB-00135352-001">urw</item>
+                                    <item AppInfo="Urimo" ConceptLink="http://cdb.iso.org/lg/CDB-00135342-001">urx</item>
+                                    <item AppInfo="Orya" ConceptLink="http://cdb.iso.org/lg/CDB-00136598-001">ury</item>
+                                    <item AppInfo="Uru-Eu-Wau-Wau" ConceptLink="http://cdb.iso.org/lg/CDB-00135355-001">urz</item>
+                                    <item AppInfo="Usarufa" ConceptLink="http://cdb.iso.org/lg/CDB-00137343-001">usa</item>
+                                    <item AppInfo="Ushojo" ConceptLink="http://cdb.iso.org/lg/CDB-00135357-001">ush</item>
+                                    <item AppInfo="Usui" ConceptLink="http://cdb.iso.org/lg/CDB-00135358-001">usi</item>
+                                    <item AppInfo="Usaghade" ConceptLink="http://cdb.iso.org/lg/CDB-00135359-001">usk</item>
+                                    <item AppInfo="Uspanteco" ConceptLink="http://cdb.iso.org/lg/CDB-00135360-001">usp</item>
+                                    <item AppInfo="Uya" ConceptLink="http://cdb.iso.org/lg/CDB-00135361-001">usu</item>
+                                    <item AppInfo="Otank" ConceptLink="http://cdb.iso.org/lg/CDB-00135362-001">uta</item>
+                                    <item AppInfo="Ute-Southern Paiute" ConceptLink="http://cdb.iso.org/lg/CDB-00135388-001">ute</item>
+                                    <item AppInfo="Amba" ConceptLink="http://cdb.iso.org/lg/CDB-00135422-001">utp</item>
+                                    <item AppInfo="Etulo" ConceptLink="http://cdb.iso.org/lg/CDB-00135385-001">utr</item>
+                                    <item AppInfo="Utu" ConceptLink="http://cdb.iso.org/lg/CDB-00135412-001">utu</item>
+                                    <item AppInfo="Urum" ConceptLink="http://cdb.iso.org/lg/CDB-00135413-001">uum</item>
+                                    <item AppInfo="Kulon-Pazeh" ConceptLink="http://cdb.iso.org/lg/CDB-00138100-001">uun</item>
+                                    <item AppInfo="Ura" ConceptLink="http://cdb.iso.org/lg/CDB-00135414-001">uur</item>
+                                    <item AppInfo="U" ConceptLink="http://cdb.iso.org/lg/CDB-00135415-001">uuu</item>
+                                    <item AppInfo="West Uvean" ConceptLink="http://cdb.iso.org/lg/CDB-00135416-001">uve</item>
+                                    <item AppInfo="Uri" ConceptLink="http://cdb.iso.org/lg/CDB-00135417-001">uvh</item>
+                                    <item AppInfo="Lote" ConceptLink="http://cdb.iso.org/lg/CDB-00135418-001">uvl</item>
+                                    <item AppInfo="Kuku-Uwanh" ConceptLink="http://cdb.iso.org/lg/CDB-00135419-001">uwa</item>
+                                    <item AppInfo="Doko-Uyanga" ConceptLink="http://cdb.iso.org/lg/CDB-00135432-001">uya</item>
+                                    <item AppInfo="Uzbek" ConceptLink="http://cdb.iso.org/lg/CDB-00138638-001">uzb</item>
+                                    <item AppInfo="Northern Uzbek" ConceptLink="http://cdb.iso.org/lg/CDB-00135421-001">uzn</item>
+                                    <item AppInfo="Southern Uzbek" ConceptLink="http://cdb.iso.org/lg/CDB-00135410-001">uzs</item>
+                                    <item AppInfo="Vaagri Booli" ConceptLink="http://cdb.iso.org/lg/CDB-00135423-001">vaa</item>
+                                    <item AppInfo="Vale" ConceptLink="http://cdb.iso.org/lg/CDB-00135424-001">vae</item>
+                                    <item AppInfo="Vafsi" ConceptLink="http://cdb.iso.org/lg/CDB-00135425-001">vaf</item>
+                                    <item AppInfo="Vagla" ConceptLink="http://cdb.iso.org/lg/CDB-00135426-001">vag</item>
+                                    <item AppInfo="Varhadi-Nagpuri" ConceptLink="http://cdb.iso.org/lg/CDB-00135427-001">vah</item>
+                                    <item AppInfo="Vai" ConceptLink="http://cdb.iso.org/lg/CDB-00135428-001">vai</item>
+                                    <item AppInfo="Vasekela Bushman" ConceptLink="http://cdb.iso.org/lg/CDB-00135429-001">vaj</item>
+                                    <item AppInfo="Vehes" ConceptLink="http://cdb.iso.org/lg/CDB-00135430-001">val</item>
+                                    <item AppInfo="Vanimo" ConceptLink="http://cdb.iso.org/lg/CDB-00135431-001">vam</item>
+                                    <item AppInfo="Valman" ConceptLink="http://cdb.iso.org/lg/CDB-00135399-001">van</item>
+                                    <item AppInfo="Vao" ConceptLink="http://cdb.iso.org/lg/CDB-00135397-001">vao</item>
+                                    <item AppInfo="Vaiphei" ConceptLink="http://cdb.iso.org/lg/CDB-00135420-001">vap</item>
+                                    <item AppInfo="Huarijio" ConceptLink="http://cdb.iso.org/lg/CDB-00135389-001">var</item>
+                                    <item AppInfo="Vasavi" ConceptLink="http://cdb.iso.org/lg/CDB-00135390-001">vas</item>
+                                    <item AppInfo="Vanuma" ConceptLink="http://cdb.iso.org/lg/CDB-00135391-001">vau</item>
+                                    <item AppInfo="Varli" ConceptLink="http://cdb.iso.org/lg/CDB-00135392-001">vav</item>
+                                    <item AppInfo="Wayu" ConceptLink="http://cdb.iso.org/lg/CDB-00135393-001">vay</item>
+                                    <item AppInfo="Southeast Babar" ConceptLink="http://cdb.iso.org/lg/CDB-00135394-001">vbb</item>
+                                    <item AppInfo="Venetian" ConceptLink="http://cdb.iso.org/lg/CDB-00135395-001">vec</item>
+                                    <item AppInfo="Veddah" ConceptLink="http://cdb.iso.org/lg/CDB-00135396-001">ved</item>
+                                    <item AppInfo="Veluws" ConceptLink="http://cdb.iso.org/lg/CDB-00135409-001">vel</item>
+                                    <item AppInfo="Vemgo-Mabas" ConceptLink="http://cdb.iso.org/lg/CDB-00135398-001">vem</item>
+                                    <item AppInfo="Venda" ConceptLink="http://cdb.iso.org/lg/CDB-00138639-001">ven</item>
+                                    <item AppInfo="VentureÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00138045-001">veo</item>
+                                    <item AppInfo="Veps" ConceptLink="http://cdb.iso.org/lg/CDB-00135387-001">vep</item>
+                                    <item AppInfo="Mom Jango" ConceptLink="http://cdb.iso.org/lg/CDB-00135400-001">ver</item>
+                                    <item AppInfo="Vaghri" ConceptLink="http://cdb.iso.org/lg/CDB-00135401-001">vgr</item>
+                                    <item AppInfo="Vlaamse Gebarentaal" ConceptLink="http://cdb.iso.org/lg/CDB-00135402-001">vgt</item>
+                                    <item AppInfo="Virgin Islands Creole English" ConceptLink="http://cdb.iso.org/lg/CDB-00135403-001">vic</item>
+                                    <item AppInfo="Vidunda" ConceptLink="http://cdb.iso.org/lg/CDB-00135404-001">vid</item>
+                                    <item AppInfo="Vietnamese" ConceptLink="http://cdb.iso.org/lg/CDB-00138640-001">vie</item>
+                                    <item AppInfo="Vili" ConceptLink="http://cdb.iso.org/lg/CDB-00135405-001">vif</item>
+                                    <item AppInfo="Viemo" ConceptLink="http://cdb.iso.org/lg/CDB-00135406-001">vig</item>
+                                    <item AppInfo="Vilela" ConceptLink="http://cdb.iso.org/lg/CDB-00135407-001">vil</item>
+                                    <item AppInfo="Vinza" ConceptLink="http://cdb.iso.org/lg/CDB-00136006-001">vin</item>
+                                    <item AppInfo="Vishavan" ConceptLink="http://cdb.iso.org/lg/CDB-00135274-001">vis</item>
+                                    <item AppInfo="Viti" ConceptLink="http://cdb.iso.org/lg/CDB-00135866-001">vit</item>
+                                    <item AppInfo="Iduna" ConceptLink="http://cdb.iso.org/lg/CDB-00136372-001">viv</item>
+                                    <item AppInfo="Kariyarra" ConceptLink="http://cdb.iso.org/lg/CDB-00138056-001">vka</item>
+                                    <item AppInfo="Ija-Zuba" ConceptLink="http://cdb.iso.org/lg/CDB-00136373-001">vki</item>
+                                    <item AppInfo="Kujarge" ConceptLink="http://cdb.iso.org/lg/CDB-00136374-001">vkj</item>
+                                    <item AppInfo="Kaur" ConceptLink="http://cdb.iso.org/lg/CDB-00136375-001">vkk</item>
+                                    <item AppInfo="Kulisusu" ConceptLink="http://cdb.iso.org/lg/CDB-00136376-001">vkl</item>
+                                    <item AppInfo="Kamakan" ConceptLink="http://cdb.iso.org/lg/CDB-00138059-001">vkm</item>
+                                    <item AppInfo="Kodeoha" ConceptLink="http://cdb.iso.org/lg/CDB-00136377-001">vko</item>
+                                    <item AppInfo="Korlai Creole Portuguese" ConceptLink="http://cdb.iso.org/lg/CDB-00136378-001">vkp</item>
+                                    <item AppInfo="Tenggarong Kutai Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00136379-001">vkt</item>
+                                    <item AppInfo="Kurrama" ConceptLink="http://cdb.iso.org/lg/CDB-00136380-001">vku</item>
+                                    <item AppInfo="Valpei" ConceptLink="http://cdb.iso.org/lg/CDB-00136393-001">vlp</item>
+                                    <item AppInfo="Vlaams" ConceptLink="http://cdb.iso.org/lg/CDB-00136382-001">vls</item>
+                                    <item AppInfo="Martuyhunira" ConceptLink="http://cdb.iso.org/lg/CDB-00136371-001">vma</item>
+                                    <item AppInfo="Mbabaram" ConceptLink="http://cdb.iso.org/lg/CDB-00136384-001">vmb</item>
+                                    <item AppInfo="Juxtlahuaca Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136385-001">vmc</item>
+                                    <item AppInfo="Mudu Koraga" ConceptLink="http://cdb.iso.org/lg/CDB-00136386-001">vmd</item>
+                                    <item AppInfo="East Masela" ConceptLink="http://cdb.iso.org/lg/CDB-00136387-001">vme</item>
+                                    <item AppInfo="MainfrÃ€nkisch" ConceptLink="http://cdb.iso.org/lg/CDB-00136388-001">vmf</item>
+                                    <item AppInfo="Minigir" ConceptLink="http://cdb.iso.org/lg/CDB-00136389-001">vmg</item>
+                                    <item AppInfo="Maraghei" ConceptLink="http://cdb.iso.org/lg/CDB-00136390-001">vmh</item>
+                                    <item AppInfo="Miwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136391-001">vmi</item>
+                                    <item AppInfo="Ixtayutla Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136392-001">vmj</item>
+                                    <item AppInfo="Makhuwa-Shirima" ConceptLink="http://cdb.iso.org/lg/CDB-00136360-001">vmk</item>
+                                    <item AppInfo="Malgana" ConceptLink="http://cdb.iso.org/lg/CDB-00138053-001">vml</item>
+                                    <item AppInfo="Mitlatongo Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136358-001">vmm</item>
+                                    <item AppInfo="Soyaltepec Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00136381-001">vmp</item>
+                                    <item AppInfo="Soyaltepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136350-001">vmq</item>
+                                    <item AppInfo="Marenje" ConceptLink="http://cdb.iso.org/lg/CDB-00136351-001">vmr</item>
+                                    <item AppInfo="Moksela" ConceptLink="http://cdb.iso.org/lg/CDB-00138016-001">vms</item>
+                                    <item AppInfo="Muluridyi" ConceptLink="http://cdb.iso.org/lg/CDB-00136352-001">vmu</item>
+                                    <item AppInfo="Valley Maidu" ConceptLink="http://cdb.iso.org/lg/CDB-00138022-001">vmv</item>
+                                    <item AppInfo="Makhuwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136353-001">vmw</item>
+                                    <item AppInfo="Tamazola Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136354-001">vmx</item>
+                                    <item AppInfo="Ayautla Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00136355-001">vmy</item>
+                                    <item AppInfo="MazatlÃ¡n Mazatec" ConceptLink="http://cdb.iso.org/lg/CDB-00136356-001">vmz</item>
+                                    <item AppInfo="Vano" ConceptLink="http://cdb.iso.org/lg/CDB-00138027-001">vnk</item>
+                                    <item AppInfo="Vinmavis" ConceptLink="http://cdb.iso.org/lg/CDB-00136357-001">vnm</item>
+                                    <item AppInfo="Vunapu" ConceptLink="http://cdb.iso.org/lg/CDB-00136370-001">vnp</item>
+                                    <item AppInfo="VolapÃŒk" ConceptLink="http://cdb.iso.org/lg/CDB-00138641-001">vol</item>
+                                    <item AppInfo="Voro" ConceptLink="http://cdb.iso.org/lg/CDB-00136359-001">vor</item>
+                                    <item AppInfo="Votic" ConceptLink="http://cdb.iso.org/lg/CDB-00136348-001">vot</item>
+                                    <item AppInfo="Vera'a" ConceptLink="http://cdb.iso.org/lg/CDB-00136361-001">vra</item>
+                                    <item AppInfo="VÅro" ConceptLink="http://cdb.iso.org/lg/CDB-00136362-001">vro</item>
+                                    <item AppInfo="Varisi" ConceptLink="http://cdb.iso.org/lg/CDB-00136363-001">vrs</item>
+                                    <item AppInfo="Burmbar" ConceptLink="http://cdb.iso.org/lg/CDB-00136364-001">vrt</item>
+                                    <item AppInfo="Moldova Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136365-001">vsi</item>
+                                    <item AppInfo="Venezuelan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136366-001">vsl</item>
+                                    <item AppInfo="Valencian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136367-001">vsv</item>
+                                    <item AppInfo="Vitou" ConceptLink="http://cdb.iso.org/lg/CDB-00136368-001">vto</item>
+                                    <item AppInfo="Vumbu" ConceptLink="http://cdb.iso.org/lg/CDB-00136395-001">vum</item>
+                                    <item AppInfo="Vunjo" ConceptLink="http://cdb.iso.org/lg/CDB-00136349-001">vun</item>
+                                    <item AppInfo="Vute" ConceptLink="http://cdb.iso.org/lg/CDB-00136383-001">vut</item>
+                                    <item AppInfo="Awa" ConceptLink="http://cdb.iso.org/lg/CDB-00136418-001">vwa</item>
+                                    <item AppInfo="Walla Walla" ConceptLink="http://cdb.iso.org/lg/CDB-00136419-001">waa</item>
+                                    <item AppInfo="Wab" ConceptLink="http://cdb.iso.org/lg/CDB-00136420-001">wab</item>
+                                    <item AppInfo="Wasco-Wishram" ConceptLink="http://cdb.iso.org/lg/CDB-00136421-001">wac</item>
+                                    <item AppInfo="Wandamen" ConceptLink="http://cdb.iso.org/lg/CDB-00136422-001">wad</item>
+                                    <item AppInfo="Walser" ConceptLink="http://cdb.iso.org/lg/CDB-00136423-001">wae</item>
+                                    <item AppInfo="WakonÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138121-001">waf</item>
+                                    <item AppInfo="Wa'ema" ConceptLink="http://cdb.iso.org/lg/CDB-00136424-001">wag</item>
+                                    <item AppInfo="Watubela" ConceptLink="http://cdb.iso.org/lg/CDB-00136425-001">wah</item>
+                                    <item AppInfo="Wares" ConceptLink="http://cdb.iso.org/lg/CDB-00136426-001">wai</item>
+                                    <item AppInfo="Waffa" ConceptLink="http://cdb.iso.org/lg/CDB-00136439-001">waj</item>
+                                    <item AppInfo="Wolaytta; Walamo" ConceptLink="http://cdb.iso.org/lg/CDB-00136428-001">wal</item>
+                                    <item AppInfo="Wampanoag" ConceptLink="http://cdb.iso.org/lg/CDB-00138078-001">wam</item>
+                                    <item AppInfo="Wan" ConceptLink="http://cdb.iso.org/lg/CDB-00136417-001">wan</item>
+                                    <item AppInfo="Wappo" ConceptLink="http://cdb.iso.org/lg/CDB-00138079-001">wao</item>
+                                    <item AppInfo="Wapishana" ConceptLink="http://cdb.iso.org/lg/CDB-00136430-001">wap</item>
+                                    <item AppInfo="Wageman" ConceptLink="http://cdb.iso.org/lg/CDB-00136431-001">waq</item>
+                                    <item AppInfo="Waray" ConceptLink="http://cdb.iso.org/lg/CDB-00136432-001">war</item>
+                                    <item AppInfo="Washo" ConceptLink="http://cdb.iso.org/lg/CDB-00136433-001">was</item>
+                                    <item AppInfo="Kaninuwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136434-001">wat</item>
+                                    <item AppInfo="WaurÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00136435-001">wau</item>
+                                    <item AppInfo="Waka" ConceptLink="http://cdb.iso.org/lg/CDB-00136436-001">wav</item>
+                                    <item AppInfo="Waiwai" ConceptLink="http://cdb.iso.org/lg/CDB-00136437-001">waw</item>
+                                    <item AppInfo="Watam" ConceptLink="http://cdb.iso.org/lg/CDB-00136438-001">wax</item>
+                                    <item AppInfo="Wayana" ConceptLink="http://cdb.iso.org/lg/CDB-00136406-001">way</item>
+                                    <item AppInfo="Wampur" ConceptLink="http://cdb.iso.org/lg/CDB-00136404-001">waz</item>
+                                    <item AppInfo="Warao" ConceptLink="http://cdb.iso.org/lg/CDB-00136427-001">wba</item>
+                                    <item AppInfo="Wabo" ConceptLink="http://cdb.iso.org/lg/CDB-00136396-001">wbb</item>
+                                    <item AppInfo="Waritai" ConceptLink="http://cdb.iso.org/lg/CDB-00136397-001">wbe</item>
+                                    <item AppInfo="Wara" ConceptLink="http://cdb.iso.org/lg/CDB-00136398-001">wbf</item>
+                                    <item AppInfo="Wanda" ConceptLink="http://cdb.iso.org/lg/CDB-00136399-001">wbh</item>
+                                    <item AppInfo="Vwanji" ConceptLink="http://cdb.iso.org/lg/CDB-00136400-001">wbi</item>
+                                    <item AppInfo="Alagwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136401-001">wbj</item>
+                                    <item AppInfo="Waigali" ConceptLink="http://cdb.iso.org/lg/CDB-00136402-001">wbk</item>
+                                    <item AppInfo="Wakhi" ConceptLink="http://cdb.iso.org/lg/CDB-00136403-001">wbl</item>
+                                    <item AppInfo="Wa" ConceptLink="http://cdb.iso.org/lg/CDB-00136416-001">wbm</item>
+                                    <item AppInfo="Warlpiri" ConceptLink="http://cdb.iso.org/lg/CDB-00136405-001">wbp</item>
+                                    <item AppInfo="Waddar" ConceptLink="http://cdb.iso.org/lg/CDB-00136394-001">wbq</item>
+                                    <item AppInfo="Wagdi" ConceptLink="http://cdb.iso.org/lg/CDB-00136407-001">wbr</item>
+                                    <item AppInfo="Wanman" ConceptLink="http://cdb.iso.org/lg/CDB-00136408-001">wbt</item>
+                                    <item AppInfo="Wajarri" ConceptLink="http://cdb.iso.org/lg/CDB-00136409-001">wbv</item>
+                                    <item AppInfo="Woi" ConceptLink="http://cdb.iso.org/lg/CDB-00136410-001">wbw</item>
+                                    <item AppInfo="YanomÃ¡mi" ConceptLink="http://cdb.iso.org/lg/CDB-00136411-001">wca</item>
+                                    <item AppInfo="Waci Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00136412-001">wci</item>
+                                    <item AppInfo="Wandji" ConceptLink="http://cdb.iso.org/lg/CDB-00136413-001">wdd</item>
+                                    <item AppInfo="Wadaginam" ConceptLink="http://cdb.iso.org/lg/CDB-00136414-001">wdg</item>
+                                    <item AppInfo="Wadjiginy" ConceptLink="http://cdb.iso.org/lg/CDB-00136326-001">wdj</item>
+                                    <item AppInfo="Wadjigu" ConceptLink="http://cdb.iso.org/lg/CDB-00136429-001">wdu</item>
+                                    <item AppInfo="Wewaw" ConceptLink="http://cdb.iso.org/lg/CDB-00136369-001">wea</item>
+                                    <item AppInfo="WÃš Western" ConceptLink="http://cdb.iso.org/lg/CDB-00136280-001">wec</item>
+                                    <item AppInfo="Wedau" ConceptLink="http://cdb.iso.org/lg/CDB-00136281-001">wed</item>
+                                    <item AppInfo="Weh" ConceptLink="http://cdb.iso.org/lg/CDB-00136282-001">weh</item>
+                                    <item AppInfo="Were" ConceptLink="http://cdb.iso.org/lg/CDB-00136283-001">wei</item>
+                                    <item AppInfo="Weme Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00136284-001">wem</item>
+                                    <item AppInfo="North Wemale" ConceptLink="http://cdb.iso.org/lg/CDB-00136285-001">weo</item>
+                                    <item AppInfo="Westphalien" ConceptLink="http://cdb.iso.org/lg/CDB-00136286-001">wep</item>
+                                    <item AppInfo="Weri" ConceptLink="http://cdb.iso.org/lg/CDB-00136287-001">wer</item>
+                                    <item AppInfo="Cameroon Pidgin" ConceptLink="http://cdb.iso.org/lg/CDB-00136288-001">wes</item>
+                                    <item AppInfo="Perai" ConceptLink="http://cdb.iso.org/lg/CDB-00136301-001">wet</item>
+                                    <item AppInfo="Welaung" ConceptLink="http://cdb.iso.org/lg/CDB-00136290-001">weu</item>
+                                    <item AppInfo="Wejewa" ConceptLink="http://cdb.iso.org/lg/CDB-00136279-001">wew</item>
+                                    <item AppInfo="Yafi" ConceptLink="http://cdb.iso.org/lg/CDB-00136292-001">wfg</item>
+                                    <item AppInfo="Wagaya" ConceptLink="http://cdb.iso.org/lg/CDB-00136293-001">wga</item>
+                                    <item AppInfo="Wangganguru" ConceptLink="http://cdb.iso.org/lg/CDB-00136294-001">wgg</item>
+                                    <item AppInfo="Wahgi" ConceptLink="http://cdb.iso.org/lg/CDB-00136295-001">wgi</item>
+                                    <item AppInfo="Waigeo" ConceptLink="http://cdb.iso.org/lg/CDB-00136296-001">wgo</item>
+                                    <item AppInfo="Wagawaga" ConceptLink="http://cdb.iso.org/lg/CDB-00136297-001">wgw</item>
+                                    <item AppInfo="Warrgamay" ConceptLink="http://cdb.iso.org/lg/CDB-00136298-001">wgy</item>
+                                    <item AppInfo="Manusela" ConceptLink="http://cdb.iso.org/lg/CDB-00136299-001">wha</item>
+                                    <item AppInfo="North Wahgi" ConceptLink="http://cdb.iso.org/lg/CDB-00136268-001">whg</item>
+                                    <item AppInfo="Wahau Kenyah" ConceptLink="http://cdb.iso.org/lg/CDB-00136291-001">whk</item>
+                                    <item AppInfo="Wahau Kayan" ConceptLink="http://cdb.iso.org/lg/CDB-00136289-001">whu</item>
+                                    <item AppInfo="Southern Toussian" ConceptLink="http://cdb.iso.org/lg/CDB-00136258-001">wib</item>
+                                    <item AppInfo="Wichita" ConceptLink="http://cdb.iso.org/lg/CDB-00136259-001">wic</item>
+                                    <item AppInfo="Wik-Epa" ConceptLink="http://cdb.iso.org/lg/CDB-00136260-001">wie</item>
+                                    <item AppInfo="Wik-Keyangan" ConceptLink="http://cdb.iso.org/lg/CDB-00136261-001">wif</item>
+                                    <item AppInfo="Wik-Ngathana" ConceptLink="http://cdb.iso.org/lg/CDB-00136262-001">wig</item>
+                                    <item AppInfo="Wik-Me'anha" ConceptLink="http://cdb.iso.org/lg/CDB-00136263-001">wih</item>
+                                    <item AppInfo="Minidien" ConceptLink="http://cdb.iso.org/lg/CDB-00136264-001">wii</item>
+                                    <item AppInfo="Wik-Iiyanh" ConceptLink="http://cdb.iso.org/lg/CDB-00136265-001">wij</item>
+                                    <item AppInfo="Wikalkan" ConceptLink="http://cdb.iso.org/lg/CDB-00136278-001">wik</item>
+                                    <item AppInfo="Wilawila" ConceptLink="http://cdb.iso.org/lg/CDB-00136267-001">wil</item>
+                                    <item AppInfo="Wik-Mungkan" ConceptLink="http://cdb.iso.org/lg/CDB-00136257-001">wim</item>
+                                    <item AppInfo="Ho-Chunk" ConceptLink="http://cdb.iso.org/lg/CDB-00136269-001">win</item>
+                                    <item AppInfo="WirafÃ©d" ConceptLink="http://cdb.iso.org/lg/CDB-00138002-001">wir</item>
+                                    <item AppInfo="Wintu" ConceptLink="http://cdb.iso.org/lg/CDB-00136270-001">wit</item>
+                                    <item AppInfo="Wiru" ConceptLink="http://cdb.iso.org/lg/CDB-00136271-001">wiu</item>
+                                    <item AppInfo="Muduapa" ConceptLink="http://cdb.iso.org/lg/CDB-00136272-001">wiv</item>
+                                    <item AppInfo="Wirangu" ConceptLink="http://cdb.iso.org/lg/CDB-00136273-001">wiw</item>
+                                    <item AppInfo="Wiyot" ConceptLink="http://cdb.iso.org/lg/CDB-00138008-001">wiy</item>
+                                    <item AppInfo="Waja" ConceptLink="http://cdb.iso.org/lg/CDB-00136274-001">wja</item>
+                                    <item AppInfo="Warji" ConceptLink="http://cdb.iso.org/lg/CDB-00136275-001">wji</item>
+                                    <item AppInfo="Kw'adza" ConceptLink="http://cdb.iso.org/lg/CDB-00138009-001">wka</item>
+                                    <item AppInfo="Kumbaran" ConceptLink="http://cdb.iso.org/lg/CDB-00136276-001">wkb</item>
+                                    <item AppInfo="Wakde" ConceptLink="http://cdb.iso.org/lg/CDB-00136277-001">wkd</item>
+                                    <item AppInfo="Kalanadi" ConceptLink="http://cdb.iso.org/lg/CDB-00136303-001">wkl</item>
+                                    <item AppInfo="Kunduvadi" ConceptLink="http://cdb.iso.org/lg/CDB-00136337-001">wku</item>
+                                    <item AppInfo="Wakawaka" ConceptLink="http://cdb.iso.org/lg/CDB-00136300-001">wkw</item>
+                                    <item AppInfo="Walio" ConceptLink="http://cdb.iso.org/lg/CDB-00136327-001">wla</item>
+                                    <item AppInfo="Mwali Comorian" ConceptLink="http://cdb.iso.org/lg/CDB-00136328-001">wlc</item>
+                                    <item AppInfo="Wolane" ConceptLink="http://cdb.iso.org/lg/CDB-00136329-001">wle</item>
+                                    <item AppInfo="Kunbarlang" ConceptLink="http://cdb.iso.org/lg/CDB-00136330-001">wlg</item>
+                                    <item AppInfo="Waioli" ConceptLink="http://cdb.iso.org/lg/CDB-00136331-001">wli</item>
+                                    <item AppInfo="Wailaki" ConceptLink="http://cdb.iso.org/lg/CDB-00137974-001">wlk</item>
+                                    <item AppInfo="Wali" ConceptLink="http://cdb.iso.org/lg/CDB-00136332-001">wll</item>
+                                    <item AppInfo="Middle Welsh" ConceptLink="http://cdb.iso.org/lg/CDB-00137901-001">wlm</item>
+                                    <item AppInfo="Walloon" ConceptLink="http://cdb.iso.org/lg/CDB-00138642-001">wln</item>
+                                    <item AppInfo="Wolio" ConceptLink="http://cdb.iso.org/lg/CDB-00136333-001">wlo</item>
+                                    <item AppInfo="Wailapa" ConceptLink="http://cdb.iso.org/lg/CDB-00136334-001">wlr</item>
+                                    <item AppInfo="Wallisian" ConceptLink="http://cdb.iso.org/lg/CDB-00136347-001">wls</item>
+                                    <item AppInfo="Wuliwuli" ConceptLink="http://cdb.iso.org/lg/CDB-00137977-001">wlu</item>
+                                    <item AppInfo="WichÃ­ LhamtÃ©s Vejoz" ConceptLink="http://cdb.iso.org/lg/CDB-00136336-001">wlv</item>
+                                    <item AppInfo="Walak" ConceptLink="http://cdb.iso.org/lg/CDB-00136325-001">wlw</item>
+                                    <item AppInfo="Wali" ConceptLink="http://cdb.iso.org/lg/CDB-00136338-001">wlx</item>
+                                    <item AppInfo="Waling" ConceptLink="http://cdb.iso.org/lg/CDB-00138161-001">wly</item>
+                                    <item AppInfo="Mawa" ConceptLink="http://cdb.iso.org/lg/CDB-00138159-001">wma</item>
+                                    <item AppInfo="Wambaya" ConceptLink="http://cdb.iso.org/lg/CDB-00136339-001">wmb</item>
+                                    <item AppInfo="Wamas" ConceptLink="http://cdb.iso.org/lg/CDB-00136340-001">wmc</item>
+                                    <item AppInfo="MamaindÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00136341-001">wmd</item>
+                                    <item AppInfo="Wambule" ConceptLink="http://cdb.iso.org/lg/CDB-00136342-001">wme</item>
+                                    <item AppInfo="Waima'a" ConceptLink="http://cdb.iso.org/lg/CDB-00136343-001">wmh</item>
+                                    <item AppInfo="Wamin" ConceptLink="http://cdb.iso.org/lg/CDB-00136344-001">wmi</item>
+                                    <item AppInfo="Maiwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136345-001">wmm</item>
+                                    <item AppInfo="Waamwang" ConceptLink="http://cdb.iso.org/lg/CDB-00138281-001">wmn</item>
+                                    <item AppInfo="Wom" ConceptLink="http://cdb.iso.org/lg/CDB-00136346-001">wmo</item>
+                                    <item AppInfo="Wambon" ConceptLink="http://cdb.iso.org/lg/CDB-00136314-001">wms</item>
+                                    <item AppInfo="Walmajarri" ConceptLink="http://cdb.iso.org/lg/CDB-00136312-001">wmt</item>
+                                    <item AppInfo="Mwani" ConceptLink="http://cdb.iso.org/lg/CDB-00136335-001">wmw</item>
+                                    <item AppInfo="Womo" ConceptLink="http://cdb.iso.org/lg/CDB-00136304-001">wmx</item>
+                                    <item AppInfo="Wanambre" ConceptLink="http://cdb.iso.org/lg/CDB-00136305-001">wnb</item>
+                                    <item AppInfo="Wantoat" ConceptLink="http://cdb.iso.org/lg/CDB-00136306-001">wnc</item>
+                                    <item AppInfo="Wandarang" ConceptLink="http://cdb.iso.org/lg/CDB-00138294-001">wnd</item>
+                                    <item AppInfo="Waneci" ConceptLink="http://cdb.iso.org/lg/CDB-00136307-001">wne</item>
+                                    <item AppInfo="Wanggom" ConceptLink="http://cdb.iso.org/lg/CDB-00136308-001">wng</item>
+                                    <item AppInfo="Ndzwani Comorian" ConceptLink="http://cdb.iso.org/lg/CDB-00136309-001">wni</item>
+                                    <item AppInfo="Wanukaka" ConceptLink="http://cdb.iso.org/lg/CDB-00136310-001">wnk</item>
+                                    <item AppInfo="Wanggamala" ConceptLink="http://cdb.iso.org/lg/CDB-00136311-001">wnm</item>
+                                    <item AppInfo="Wano" ConceptLink="http://cdb.iso.org/lg/CDB-00136324-001">wno</item>
+                                    <item AppInfo="Wanap" ConceptLink="http://cdb.iso.org/lg/CDB-00136313-001">wnp</item>
+                                    <item AppInfo="Usan" ConceptLink="http://cdb.iso.org/lg/CDB-00136302-001">wnu</item>
+                                    <item AppInfo="Tyaraity" ConceptLink="http://cdb.iso.org/lg/CDB-00136315-001">woa</item>
+                                    <item AppInfo="WÃš Northern" ConceptLink="http://cdb.iso.org/lg/CDB-00136316-001">wob</item>
+                                    <item AppInfo="Wogeo" ConceptLink="http://cdb.iso.org/lg/CDB-00136317-001">woc</item>
+                                    <item AppInfo="Wolani" ConceptLink="http://cdb.iso.org/lg/CDB-00136318-001">wod</item>
+                                    <item AppInfo="Woleaian" ConceptLink="http://cdb.iso.org/lg/CDB-00136319-001">woe</item>
+                                    <item AppInfo="Gambian Wolof" ConceptLink="http://cdb.iso.org/lg/CDB-00136320-001">wof</item>
+                                    <item AppInfo="Wogamusin" ConceptLink="http://cdb.iso.org/lg/CDB-00136321-001">wog</item>
+                                    <item AppInfo="Kamang" ConceptLink="http://cdb.iso.org/lg/CDB-00136322-001">woi</item>
+                                    <item AppInfo="Longto" ConceptLink="http://cdb.iso.org/lg/CDB-00136449-001">wok</item>
+                                    <item AppInfo="Wolof" ConceptLink="http://cdb.iso.org/lg/CDB-00138643-001">wol</item>
+                                    <item AppInfo="Wom" ConceptLink="http://cdb.iso.org/lg/CDB-00136266-001">wom</item>
+                                    <item AppInfo="Wongo" ConceptLink="http://cdb.iso.org/lg/CDB-00136415-001">won</item>
+                                    <item AppInfo="Manombai" ConceptLink="http://cdb.iso.org/lg/CDB-00136555-001">woo</item>
+                                    <item AppInfo="Woria" ConceptLink="http://cdb.iso.org/lg/CDB-00136556-001">wor</item>
+                                    <item AppInfo="Hanga Hundi" ConceptLink="http://cdb.iso.org/lg/CDB-00136557-001">wos</item>
+                                    <item AppInfo="Wawonii" ConceptLink="http://cdb.iso.org/lg/CDB-00136558-001">wow</item>
+                                    <item AppInfo="Weyto" ConceptLink="http://cdb.iso.org/lg/CDB-00138272-001">woy</item>
+                                    <item AppInfo="Maco" ConceptLink="http://cdb.iso.org/lg/CDB-00136559-001">wpc</item>
+                                    <item AppInfo="Warapu" ConceptLink="http://cdb.iso.org/lg/CDB-00136560-001">wra</item>
+                                    <item AppInfo="Warluwara" ConceptLink="http://cdb.iso.org/lg/CDB-00136561-001">wrb</item>
+                                    <item AppInfo="Warduji" ConceptLink="http://cdb.iso.org/lg/CDB-00136562-001">wrd</item>
+                                    <item AppInfo="Warungu" ConceptLink="http://cdb.iso.org/lg/CDB-00136563-001">wrg</item>
+                                    <item AppInfo="Wiradhuri" ConceptLink="http://cdb.iso.org/lg/CDB-00136576-001">wrh</item>
+                                    <item AppInfo="Wariyangga" ConceptLink="http://cdb.iso.org/lg/CDB-00138335-001">wri</item>
+                                    <item AppInfo="Warlmanpa" ConceptLink="http://cdb.iso.org/lg/CDB-00136565-001">wrl</item>
+                                    <item AppInfo="Warumungu" ConceptLink="http://cdb.iso.org/lg/CDB-00136554-001">wrm</item>
+                                    <item AppInfo="Warnang" ConceptLink="http://cdb.iso.org/lg/CDB-00136567-001">wrn</item>
+                                    <item AppInfo="Waropen" ConceptLink="http://cdb.iso.org/lg/CDB-00136568-001">wrp</item>
+                                    <item AppInfo="Wardaman" ConceptLink="http://cdb.iso.org/lg/CDB-00136569-001">wrr</item>
+                                    <item AppInfo="Waris" ConceptLink="http://cdb.iso.org/lg/CDB-00136570-001">wrs</item>
+                                    <item AppInfo="Waru" ConceptLink="http://cdb.iso.org/lg/CDB-00136571-001">wru</item>
+                                    <item AppInfo="Waruna" ConceptLink="http://cdb.iso.org/lg/CDB-00136572-001">wrv</item>
+                                    <item AppInfo="Gugu Warra" ConceptLink="http://cdb.iso.org/lg/CDB-00138341-001">wrw</item>
+                                    <item AppInfo="Wae Rana" ConceptLink="http://cdb.iso.org/lg/CDB-00136573-001">wrx</item>
+                                    <item AppInfo="Merwari" ConceptLink="http://cdb.iso.org/lg/CDB-00136574-001">wry</item>
+                                    <item AppInfo="Waray" ConceptLink="http://cdb.iso.org/lg/CDB-00136575-001">wrz</item>
+                                    <item AppInfo="Warembori" ConceptLink="http://cdb.iso.org/lg/CDB-00136543-001">wsa</item>
+                                    <item AppInfo="Wusi" ConceptLink="http://cdb.iso.org/lg/CDB-00136541-001">wsi</item>
+                                    <item AppInfo="Waskia" ConceptLink="http://cdb.iso.org/lg/CDB-00136564-001">wsk</item>
+                                    <item AppInfo="Owenia" ConceptLink="http://cdb.iso.org/lg/CDB-00136533-001">wsr</item>
+                                    <item AppInfo="Wasa" ConceptLink="http://cdb.iso.org/lg/CDB-00136534-001">wss</item>
+                                    <item AppInfo="Wasu" ConceptLink="http://cdb.iso.org/lg/CDB-00138323-001">wsu</item>
+                                    <item AppInfo="Wotapuri-Katarqalai" ConceptLink="http://cdb.iso.org/lg/CDB-00136535-001">wsv</item>
+                                    <item AppInfo="Dumpu" ConceptLink="http://cdb.iso.org/lg/CDB-00136536-001">wtf</item>
+                                    <item AppInfo="Berta" ConceptLink="http://cdb.iso.org/lg/CDB-00136537-001">wti</item>
+                                    <item AppInfo="Watakataui" ConceptLink="http://cdb.iso.org/lg/CDB-00136538-001">wtk</item>
+                                    <item AppInfo="Mewati" ConceptLink="http://cdb.iso.org/lg/CDB-00136539-001">wtm</item>
+                                    <item AppInfo="Wotu" ConceptLink="http://cdb.iso.org/lg/CDB-00136540-001">wtw</item>
+                                    <item AppInfo="Wikngenchera" ConceptLink="http://cdb.iso.org/lg/CDB-00136553-001">wua</item>
+                                    <item AppInfo="Wunambal" ConceptLink="http://cdb.iso.org/lg/CDB-00136542-001">wub</item>
+                                    <item AppInfo="Wudu" ConceptLink="http://cdb.iso.org/lg/CDB-00136531-001">wud</item>
+                                    <item AppInfo="Wutunhua" ConceptLink="http://cdb.iso.org/lg/CDB-00136544-001">wuh</item>
+                                    <item AppInfo="Silimo" ConceptLink="http://cdb.iso.org/lg/CDB-00136545-001">wul</item>
+                                    <item AppInfo="Wumbvu" ConceptLink="http://cdb.iso.org/lg/CDB-00136546-001">wum</item>
+                                    <item AppInfo="Bungu" ConceptLink="http://cdb.iso.org/lg/CDB-00136547-001">wun</item>
+                                    <item AppInfo="Wurrugu" ConceptLink="http://cdb.iso.org/lg/CDB-00138158-001">wur</item>
+                                    <item AppInfo="Wutung" ConceptLink="http://cdb.iso.org/lg/CDB-00136548-001">wut</item>
+                                    <item AppInfo="Wu Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00136549-001">wuu</item>
+                                    <item AppInfo="Wuvulu-Aua" ConceptLink="http://cdb.iso.org/lg/CDB-00136550-001">wuv</item>
+                                    <item AppInfo="Wulna" ConceptLink="http://cdb.iso.org/lg/CDB-00136551-001">wux</item>
+                                    <item AppInfo="Wauyai" ConceptLink="http://cdb.iso.org/lg/CDB-00136578-001">wuy</item>
+                                    <item AppInfo="Waama" ConceptLink="http://cdb.iso.org/lg/CDB-00136532-001">wwa</item>
+                                    <item AppInfo="Wetamut" ConceptLink="http://cdb.iso.org/lg/CDB-00136566-001">wwo</item>
+                                    <item AppInfo="Warrwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136601-001">wwr</item>
+                                    <item AppInfo="Wawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136602-001">www</item>
+                                    <item AppInfo="Waxianghua" ConceptLink="http://cdb.iso.org/lg/CDB-00136603-001">wxa</item>
+                                    <item AppInfo="Wyandot" ConceptLink="http://cdb.iso.org/lg/CDB-00138163-001">wya</item>
+                                    <item AppInfo="Wangaaybuwan-Ngiyambaa" ConceptLink="http://cdb.iso.org/lg/CDB-00136604-001">wyb</item>
+                                    <item AppInfo="Wymysorys" ConceptLink="http://cdb.iso.org/lg/CDB-00136605-001">wym</item>
+                                    <item AppInfo="WayorÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00136606-001">wyr</item>
+                                    <item AppInfo="Western Fijian" ConceptLink="http://cdb.iso.org/lg/CDB-00136607-001">wyy</item>
+                                    <item AppInfo="Andalusian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00137911-001">xaa</item>
+                                    <item AppInfo="Sambe" ConceptLink="http://cdb.iso.org/lg/CDB-00136608-001">xab</item>
+                                    <item AppInfo="Kachari" ConceptLink="http://cdb.iso.org/lg/CDB-00136609-001">xac</item>
+                                    <item AppInfo="Adai" ConceptLink="http://cdb.iso.org/lg/CDB-00138166-001">xad</item>
+                                    <item AppInfo="Aequian" ConceptLink="http://cdb.iso.org/lg/CDB-00138448-001">xae</item>
+                                    <item AppInfo="Aghwan" ConceptLink="http://cdb.iso.org/lg/CDB-00138170-001">xag</item>
+                                    <item AppInfo="KaimbÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00138156-001">xai</item>
+                                    <item AppInfo="Kalmyk; Oirat" ConceptLink="http://cdb.iso.org/lg/CDB-00136622-001">xal</item>
+                                    <item AppInfo="/Xam" ConceptLink="http://cdb.iso.org/lg/CDB-00138179-001">xam</item>
+                                    <item AppInfo="Xamtanga" ConceptLink="http://cdb.iso.org/lg/CDB-00136611-001">xan</item>
+                                    <item AppInfo="Khao" ConceptLink="http://cdb.iso.org/lg/CDB-00136600-001">xao</item>
+                                    <item AppInfo="Apalachee" ConceptLink="http://cdb.iso.org/lg/CDB-00138181-001">xap</item>
+                                    <item AppInfo="Aquitanian" ConceptLink="http://cdb.iso.org/lg/CDB-00138464-001">xaq</item>
+                                    <item AppInfo="Karami" ConceptLink="http://cdb.iso.org/lg/CDB-00138131-001">xar</item>
+                                    <item AppInfo="Kamas" ConceptLink="http://cdb.iso.org/lg/CDB-00138149-001">xas</item>
+                                    <item AppInfo="Katawixi" ConceptLink="http://cdb.iso.org/lg/CDB-00136613-001">xat</item>
+                                    <item AppInfo="Kauwera" ConceptLink="http://cdb.iso.org/lg/CDB-00136614-001">xau</item>
+                                    <item AppInfo="XavÃ¡nte" ConceptLink="http://cdb.iso.org/lg/CDB-00136615-001">xav</item>
+                                    <item AppInfo="Kawaiisu" ConceptLink="http://cdb.iso.org/lg/CDB-00136616-001">xaw</item>
+                                    <item AppInfo="Kayan Mahakam" ConceptLink="http://cdb.iso.org/lg/CDB-00136617-001">xay</item>
+                                    <item AppInfo="Kamba" ConceptLink="http://cdb.iso.org/lg/CDB-00138153-001">xba</item>
+                                    <item AppInfo="Bactrian" ConceptLink="http://cdb.iso.org/lg/CDB-00138432-001">xbc</item>
+                                    <item AppInfo="Kombio" ConceptLink="http://cdb.iso.org/lg/CDB-00136618-001">xbi</item>
+                                    <item AppInfo="Middle Breton" ConceptLink="http://cdb.iso.org/lg/CDB-00137908-001">xbm</item>
+                                    <item AppInfo="Bolgarian" ConceptLink="http://cdb.iso.org/lg/CDB-00138221-001">xbo</item>
+                                    <item AppInfo="Kambera" ConceptLink="http://cdb.iso.org/lg/CDB-00136619-001">xbr</item>
+                                    <item AppInfo="KambiwÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138216-001">xbw</item>
+                                    <item AppInfo="KabixÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00136620-001">xbx</item>
+                                    <item AppInfo="Cumbric" ConceptLink="http://cdb.iso.org/lg/CDB-00138232-001">xcb</item>
+                                    <item AppInfo="Camunic" ConceptLink="http://cdb.iso.org/lg/CDB-00138392-001">xcc</item>
+                                    <item AppInfo="Celtiberian" ConceptLink="http://cdb.iso.org/lg/CDB-00138396-001">xce</item>
+                                    <item AppInfo="Cisalpine Gaulish" ConceptLink="http://cdb.iso.org/lg/CDB-00138397-001">xcg</item>
+                                    <item AppInfo="Chemakum" ConceptLink="http://cdb.iso.org/lg/CDB-00138237-001">xch</item>
+                                    <item AppInfo="Classical Armenian" ConceptLink="http://cdb.iso.org/lg/CDB-00137890-001">xcl</item>
+                                    <item AppInfo="Comecrudo" ConceptLink="http://cdb.iso.org/lg/CDB-00138198-001">xcm</item>
+                                    <item AppInfo="Cotoname" ConceptLink="http://cdb.iso.org/lg/CDB-00138215-001">xcn</item>
+                                    <item AppInfo="Chorasmian" ConceptLink="http://cdb.iso.org/lg/CDB-00138437-001">xco</item>
+                                    <item AppInfo="Carian" ConceptLink="http://cdb.iso.org/lg/CDB-00138466-001">xcr</item>
+                                    <item AppInfo="Classical Tibetan" ConceptLink="http://cdb.iso.org/lg/CDB-00137912-001">xct</item>
+                                    <item AppInfo="Curonian" ConceptLink="http://cdb.iso.org/lg/CDB-00138214-001">xcu</item>
+                                    <item AppInfo="Chuvantsy" ConceptLink="http://cdb.iso.org/lg/CDB-00138213-001">xcv</item>
+                                    <item AppInfo="Coahuilteco" ConceptLink="http://cdb.iso.org/lg/CDB-00138212-001">xcw</item>
+                                    <item AppInfo="Cayuse" ConceptLink="http://cdb.iso.org/lg/CDB-00138211-001">xcy</item>
+                                    <item AppInfo="Dacian" ConceptLink="http://cdb.iso.org/lg/CDB-00138457-001">xdc</item>
+                                    <item AppInfo="Edomite" ConceptLink="http://cdb.iso.org/lg/CDB-00138458-001">xdm</item>
+                                    <item AppInfo="Malayic Dayak" ConceptLink="http://cdb.iso.org/lg/CDB-00136621-001">xdy</item>
+                                    <item AppInfo="Eblan" ConceptLink="http://cdb.iso.org/lg/CDB-00138465-001">xeb</item>
+                                    <item AppInfo="Hdi" ConceptLink="http://cdb.iso.org/lg/CDB-00136589-001">xed</item>
+                                    <item AppInfo="//Xegwi" ConceptLink="http://cdb.iso.org/lg/CDB-00138205-001">xeg</item>
+                                    <item AppInfo="Kelo" ConceptLink="http://cdb.iso.org/lg/CDB-00136587-001">xel</item>
+                                    <item AppInfo="Kembayan" ConceptLink="http://cdb.iso.org/lg/CDB-00136610-001">xem</item>
+                                    <item AppInfo="Epi-Olmec" ConceptLink="http://cdb.iso.org/lg/CDB-00138440-001">xep</item>
+                                    <item AppInfo="XerÃ©nte" ConceptLink="http://cdb.iso.org/lg/CDB-00136579-001">xer</item>
+                                    <item AppInfo="Kesawai" ConceptLink="http://cdb.iso.org/lg/CDB-00136580-001">xes</item>
+                                    <item AppInfo="XetÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00136581-001">xet</item>
+                                    <item AppInfo="Keoru-Ahia" ConceptLink="http://cdb.iso.org/lg/CDB-00136582-001">xeu</item>
+                                    <item AppInfo="Faliscan" ConceptLink="http://cdb.iso.org/lg/CDB-00138452-001">xfa</item>
+                                    <item AppInfo="Galatian" ConceptLink="http://cdb.iso.org/lg/CDB-00138451-001">xga</item>
+                                    <item AppInfo="Gabrielino-FernandeÅo" ConceptLink="http://cdb.iso.org/lg/CDB-00138196-001">xgf</item>
+                                    <item AppInfo="Galindan" ConceptLink="http://cdb.iso.org/lg/CDB-00138195-001">xgl</item>
+                                    <item AppInfo="Garza" ConceptLink="http://cdb.iso.org/lg/CDB-00138193-001">xgr</item>
+                                    <item AppInfo="Harami" ConceptLink="http://cdb.iso.org/lg/CDB-00138450-001">xha</item>
+                                    <item AppInfo="Hunnic" ConceptLink="http://cdb.iso.org/lg/CDB-00138191-001">xhc</item>
+                                    <item AppInfo="Hadrami" ConceptLink="http://cdb.iso.org/lg/CDB-00138449-001">xhd</item>
+                                    <item AppInfo="Khetrani" ConceptLink="http://cdb.iso.org/lg/CDB-00136583-001">xhe</item>
+                                    <item AppInfo="Xhosa" ConceptLink="http://cdb.iso.org/lg/CDB-00138644-001">xho</item>
+                                    <item AppInfo="Hernican" ConceptLink="http://cdb.iso.org/lg/CDB-00138447-001">xhr</item>
+                                    <item AppInfo="Hattic" ConceptLink="http://cdb.iso.org/lg/CDB-00138436-001">xht</item>
+                                    <item AppInfo="Hurrian" ConceptLink="http://cdb.iso.org/lg/CDB-00138439-001">xhu</item>
+                                    <item AppInfo="Khua" ConceptLink="http://cdb.iso.org/lg/CDB-00136584-001">xhv</item>
+                                    <item AppInfo="Xiandao" ConceptLink="http://cdb.iso.org/lg/CDB-00136585-001">xia</item>
+                                    <item AppInfo="Iberian" ConceptLink="http://cdb.iso.org/lg/CDB-00138459-001">xib</item>
+                                    <item AppInfo="Xiri" ConceptLink="http://cdb.iso.org/lg/CDB-00136586-001">xii</item>
+                                    <item AppInfo="Illyrian" ConceptLink="http://cdb.iso.org/lg/CDB-00138379-001">xil</item>
+                                    <item AppInfo="Xinca" ConceptLink="http://cdb.iso.org/lg/CDB-00138239-001">xin</item>
+                                    <item AppInfo="XipinÃ¡wa" ConceptLink="http://cdb.iso.org/lg/CDB-00138238-001">xip</item>
+                                    <item AppInfo="XiriÃ¢na" ConceptLink="http://cdb.iso.org/lg/CDB-00136599-001">xir</item>
+                                    <item AppInfo="Indus Valley Language" ConceptLink="http://cdb.iso.org/lg/CDB-00138398-001">xiv</item>
+                                    <item AppInfo="Xipaya" ConceptLink="http://cdb.iso.org/lg/CDB-00136588-001">xiy</item>
+                                    <item AppInfo="Kalkoti" ConceptLink="http://cdb.iso.org/lg/CDB-00136577-001">xka</item>
+                                    <item AppInfo="Manigri-KambolÃ© Ede Nago" ConceptLink="http://cdb.iso.org/lg/CDB-00136590-001">xkb</item>
+                                    <item AppInfo="Kho'ini" ConceptLink="http://cdb.iso.org/lg/CDB-00136591-001">xkc</item>
+                                    <item AppInfo="Mendalam Kayan" ConceptLink="http://cdb.iso.org/lg/CDB-00136592-001">xkd</item>
+                                    <item AppInfo="Kereho" ConceptLink="http://cdb.iso.org/lg/CDB-00136593-001">xke</item>
+                                    <item AppInfo="Khengkha" ConceptLink="http://cdb.iso.org/lg/CDB-00136594-001">xkf</item>
+                                    <item AppInfo="Kagoro" ConceptLink="http://cdb.iso.org/lg/CDB-00136595-001">xkg</item>
+                                    <item AppInfo="Karahawyana" ConceptLink="http://cdb.iso.org/lg/CDB-00136596-001">xkh</item>
+                                    <item AppInfo="Kenyan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136597-001">xki</item>
+                                    <item AppInfo="Kajali" ConceptLink="http://cdb.iso.org/lg/CDB-00136509-001">xkj</item>
+                                    <item AppInfo="Kaco'" ConceptLink="http://cdb.iso.org/lg/CDB-00136612-001">xkk</item>
+                                    <item AppInfo="Mainstream Kenyah" ConceptLink="http://cdb.iso.org/lg/CDB-00136552-001">xkl</item>
+                                    <item AppInfo="Kayan River Kayan" ConceptLink="http://cdb.iso.org/lg/CDB-00136463-001">xkn</item>
+                                    <item AppInfo="Kiorr" ConceptLink="http://cdb.iso.org/lg/CDB-00136464-001">xko</item>
+                                    <item AppInfo="Kabatei" ConceptLink="http://cdb.iso.org/lg/CDB-00136465-001">xkp</item>
+                                    <item AppInfo="Koroni" ConceptLink="http://cdb.iso.org/lg/CDB-00136466-001">xkq</item>
+                                    <item AppInfo="XakriabÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138187-001">xkr</item>
+                                    <item AppInfo="Kumbewaha" ConceptLink="http://cdb.iso.org/lg/CDB-00136467-001">xks</item>
+                                    <item AppInfo="Kantosi" ConceptLink="http://cdb.iso.org/lg/CDB-00136468-001">xkt</item>
+                                    <item AppInfo="Kaamba" ConceptLink="http://cdb.iso.org/lg/CDB-00136469-001">xku</item>
+                                    <item AppInfo="Kgalagadi" ConceptLink="http://cdb.iso.org/lg/CDB-00136470-001">xkv</item>
+                                    <item AppInfo="Kembra" ConceptLink="http://cdb.iso.org/lg/CDB-00136471-001">xkw</item>
+                                    <item AppInfo="Karore" ConceptLink="http://cdb.iso.org/lg/CDB-00136484-001">xkx</item>
+                                    <item AppInfo="Uma' Lasan" ConceptLink="http://cdb.iso.org/lg/CDB-00136473-001">xky</item>
+                                    <item AppInfo="Kurtokha" ConceptLink="http://cdb.iso.org/lg/CDB-00136462-001">xkz</item>
+                                    <item AppInfo="Kamula" ConceptLink="http://cdb.iso.org/lg/CDB-00136475-001">xla</item>
+                                    <item AppInfo="Loup B" ConceptLink="http://cdb.iso.org/lg/CDB-00138145-001">xlb</item>
+                                    <item AppInfo="Lycian" ConceptLink="http://cdb.iso.org/lg/CDB-00138424-001">xlc</item>
+                                    <item AppInfo="Lydian" ConceptLink="http://cdb.iso.org/lg/CDB-00138407-001">xld</item>
+                                    <item AppInfo="Lemnian" ConceptLink="http://cdb.iso.org/lg/CDB-00138416-001">xle</item>
+                                    <item AppInfo="Ligurian (Ancient)" ConceptLink="http://cdb.iso.org/lg/CDB-00138414-001">xlg</item>
+                                    <item AppInfo="Liburnian" ConceptLink="http://cdb.iso.org/lg/CDB-00138409-001">xli</item>
+                                    <item AppInfo="Alanic" ConceptLink="http://cdb.iso.org/lg/CDB-00138429-001">xln</item>
+                                    <item AppInfo="Loup A" ConceptLink="http://cdb.iso.org/lg/CDB-00138139-001">xlo</item>
+                                    <item AppInfo="Lepontic" ConceptLink="http://cdb.iso.org/lg/CDB-00138430-001">xlp</item>
+                                    <item AppInfo="Lusitanian" ConceptLink="http://cdb.iso.org/lg/CDB-00138382-001">xls</item>
+                                    <item AppInfo="Cuneiform Luwian" ConceptLink="http://cdb.iso.org/lg/CDB-00138403-001">xlu</item>
+                                    <item AppInfo="Elymian" ConceptLink="http://cdb.iso.org/lg/CDB-00138405-001">xly</item>
+                                    <item AppInfo="Mushungulu" ConceptLink="http://cdb.iso.org/lg/CDB-00136476-001">xma</item>
+                                    <item AppInfo="Mbonga" ConceptLink="http://cdb.iso.org/lg/CDB-00136477-001">xmb</item>
+                                    <item AppInfo="Makhuwa-Marrevone" ConceptLink="http://cdb.iso.org/lg/CDB-00136478-001">xmc</item>
+                                    <item AppInfo="Mbedam" ConceptLink="http://cdb.iso.org/lg/CDB-00136479-001">xmd</item>
+                                    <item AppInfo="Median" ConceptLink="http://cdb.iso.org/lg/CDB-00138445-001">xme</item>
+                                    <item AppInfo="Mingrelian" ConceptLink="http://cdb.iso.org/lg/CDB-00136480-001">xmf</item>
+                                    <item AppInfo="Mengaka" ConceptLink="http://cdb.iso.org/lg/CDB-00136481-001">xmg</item>
+                                    <item AppInfo="Kuku-Muminh" ConceptLink="http://cdb.iso.org/lg/CDB-00136482-001">xmh</item>
+                                    <item AppInfo="Majera" ConceptLink="http://cdb.iso.org/lg/CDB-00136451-001">xmj</item>
+                                    <item AppInfo="Ancient Macedonian" ConceptLink="http://cdb.iso.org/lg/CDB-00138461-001">xmk</item>
+                                    <item AppInfo="Malaysian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136474-001">xml</item>
+                                    <item AppInfo="Manado Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00136472-001">xmm</item>
+                                    <item AppInfo="Manichaean Middle Persian" ConceptLink="http://cdb.iso.org/lg/CDB-00137879-001">xmn</item>
+                                    <item AppInfo="Morerebi" ConceptLink="http://cdb.iso.org/lg/CDB-00136441-001">xmo</item>
+                                    <item AppInfo="Kuku-Mu'inh" ConceptLink="http://cdb.iso.org/lg/CDB-00136442-001">xmp</item>
+                                    <item AppInfo="Kuku-Mangk" ConceptLink="http://cdb.iso.org/lg/CDB-00136443-001">xmq</item>
+                                    <item AppInfo="Meroitic" ConceptLink="http://cdb.iso.org/lg/CDB-00138455-001">xmr</item>
+                                    <item AppInfo="Moroccan Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136444-001">xms</item>
+                                    <item AppInfo="Matbat" ConceptLink="http://cdb.iso.org/lg/CDB-00136445-001">xmt</item>
+                                    <item AppInfo="Kamu" ConceptLink="http://cdb.iso.org/lg/CDB-00136446-001">xmu</item>
+                                    <item AppInfo="Antankarana Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00136447-001">xmv</item>
+                                    <item AppInfo="Tsimihety Malagasy" ConceptLink="http://cdb.iso.org/lg/CDB-00136448-001">xmw</item>
+                                    <item AppInfo="Maden" ConceptLink="http://cdb.iso.org/lg/CDB-00136461-001">xmx</item>
+                                    <item AppInfo="Mayaguduna" ConceptLink="http://cdb.iso.org/lg/CDB-00136450-001">xmy</item>
+                                    <item AppInfo="Mori Bawah" ConceptLink="http://cdb.iso.org/lg/CDB-00136440-001">xmz</item>
+                                    <item AppInfo="Ancient North Arabian" ConceptLink="http://cdb.iso.org/lg/CDB-00138446-001">xna</item>
+                                    <item AppInfo="Kanakanabu" ConceptLink="http://cdb.iso.org/lg/CDB-00136452-001">xnb</item>
+                                    <item AppInfo="Middle Mongolian" ConceptLink="http://cdb.iso.org/lg/CDB-00137877-001">xng</item>
+                                    <item AppInfo="Kuanhua" ConceptLink="http://cdb.iso.org/lg/CDB-00136453-001">xnh</item>
+                                    <item AppInfo="Northern Kankanay" ConceptLink="http://cdb.iso.org/lg/CDB-00136454-001">xnn</item>
+                                    <item AppInfo="Anglo-Norman" ConceptLink="http://cdb.iso.org/lg/CDB-00137876-001">xno</item>
+                                    <item AppInfo="Kangri" ConceptLink="http://cdb.iso.org/lg/CDB-00136455-001">xnr</item>
+                                    <item AppInfo="Kanashi" ConceptLink="http://cdb.iso.org/lg/CDB-00136456-001">xns</item>
+                                    <item AppInfo="O'chi'chi'" ConceptLink="http://cdb.iso.org/lg/CDB-00138264-001">xoc</item>
+                                    <item AppInfo="Kokoda" ConceptLink="http://cdb.iso.org/lg/CDB-00136457-001">xod</item>
+                                    <item AppInfo="Soga" ConceptLink="http://cdb.iso.org/lg/CDB-00136458-001">xog</item>
+                                    <item AppInfo="Kominimung" ConceptLink="http://cdb.iso.org/lg/CDB-00136459-001">xoi</item>
+                                    <item AppInfo="Xokleng" ConceptLink="http://cdb.iso.org/lg/CDB-00136460-001">xok</item>
+                                    <item AppInfo="Komo" ConceptLink="http://cdb.iso.org/lg/CDB-00136486-001">xom</item>
+                                    <item AppInfo="Konkomba" ConceptLink="http://cdb.iso.org/lg/CDB-00136520-001">xon</item>
+                                    <item AppInfo="XukurÃº" ConceptLink="http://cdb.iso.org/lg/CDB-00138266-001">xoo</item>
+                                    <item AppInfo="Kopar" ConceptLink="http://cdb.iso.org/lg/CDB-00136483-001">xop</item>
+                                    <item AppInfo="Korubo" ConceptLink="http://cdb.iso.org/lg/CDB-00136510-001">xor</item>
+                                    <item AppInfo="Kowaki" ConceptLink="http://cdb.iso.org/lg/CDB-00136511-001">xow</item>
+                                    <item AppInfo="Pecheneg" ConceptLink="http://cdb.iso.org/lg/CDB-00138327-001">xpc</item>
+                                    <item AppInfo="Liberia Kpelle" ConceptLink="http://cdb.iso.org/lg/CDB-00136512-001">xpe</item>
+                                    <item AppInfo="Phrygian" ConceptLink="http://cdb.iso.org/lg/CDB-00138387-001">xpg</item>
+                                    <item AppInfo="Pictish" ConceptLink="http://cdb.iso.org/lg/CDB-00138324-001">xpi</item>
+                                    <item AppInfo="Kulina Pano" ConceptLink="http://cdb.iso.org/lg/CDB-00136513-001">xpk</item>
+                                    <item AppInfo="Pumpokol" ConceptLink="http://cdb.iso.org/lg/CDB-00138322-001">xpm</item>
+                                    <item AppInfo="KapinawÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00138321-001">xpn</item>
+                                    <item AppInfo="Pochutec" ConceptLink="http://cdb.iso.org/lg/CDB-00138319-001">xpo</item>
+                                    <item AppInfo="Puyo-Paekche" ConceptLink="http://cdb.iso.org/lg/CDB-00138318-001">xpp</item>
+                                    <item AppInfo="Parthian" ConceptLink="http://cdb.iso.org/lg/CDB-00138383-001">xpr</item>
+                                    <item AppInfo="Pisidian" ConceptLink="http://cdb.iso.org/lg/CDB-00138316-001">xps</item>
+                                    <item AppInfo="Punic" ConceptLink="http://cdb.iso.org/lg/CDB-00138380-001">xpu</item>
+                                    <item AppInfo="Puyo" ConceptLink="http://cdb.iso.org/lg/CDB-00138314-001">xpy</item>
+                                    <item AppInfo="Karakhanid" ConceptLink="http://cdb.iso.org/lg/CDB-00137872-001">xqa</item>
+                                    <item AppInfo="Qatabanian" ConceptLink="http://cdb.iso.org/lg/CDB-00138420-001">xqt</item>
+                                    <item AppInfo="KrahÃŽ" ConceptLink="http://cdb.iso.org/lg/CDB-00136514-001">xra</item>
+                                    <item AppInfo="Eastern Karaboro" ConceptLink="http://cdb.iso.org/lg/CDB-00136515-001">xrb</item>
+                                    <item AppInfo="Kreye" ConceptLink="http://cdb.iso.org/lg/CDB-00136516-001">xre</item>
+                                    <item AppInfo="Krikati-Timbira" ConceptLink="http://cdb.iso.org/lg/CDB-00136517-001">xri</item>
+                                    <item AppInfo="Armazic" ConceptLink="http://cdb.iso.org/lg/CDB-00138307-001">xrm</item>
+                                    <item AppInfo="Arin" ConceptLink="http://cdb.iso.org/lg/CDB-00138306-001">xrn</item>
+                                    <item AppInfo="Raetic" ConceptLink="http://cdb.iso.org/lg/CDB-00138391-001">xrr</item>
+                                    <item AppInfo="Aranama-Tamique" ConceptLink="http://cdb.iso.org/lg/CDB-00138317-001">xrt</item>
+                                    <item AppInfo="Marriammu" ConceptLink="http://cdb.iso.org/lg/CDB-00136530-001">xru</item>
+                                    <item AppInfo="Karawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136519-001">xrw</item>
+                                    <item AppInfo="Sabaean" ConceptLink="http://cdb.iso.org/lg/CDB-00138431-001">xsa</item>
+                                    <item AppInfo="TinÃ  Sambal" ConceptLink="http://cdb.iso.org/lg/CDB-00136508-001">xsb</item>
+                                    <item AppInfo="Scythian" ConceptLink="http://cdb.iso.org/lg/CDB-00138428-001">xsc</item>
+                                    <item AppInfo="Sidetic" ConceptLink="http://cdb.iso.org/lg/CDB-00138427-001">xsd</item>
+                                    <item AppInfo="Sempan" ConceptLink="http://cdb.iso.org/lg/CDB-00136521-001">xse</item>
+                                    <item AppInfo="Shamang" ConceptLink="http://cdb.iso.org/lg/CDB-00136522-001">xsh</item>
+                                    <item AppInfo="Sio" ConceptLink="http://cdb.iso.org/lg/CDB-00136523-001">xsi</item>
+                                    <item AppInfo="Subi" ConceptLink="http://cdb.iso.org/lg/CDB-00136524-001">xsj</item>
+                                    <item AppInfo="South Slavey" ConceptLink="http://cdb.iso.org/lg/CDB-00136525-001">xsl</item>
+                                    <item AppInfo="Kasem" ConceptLink="http://cdb.iso.org/lg/CDB-00136526-001">xsm</item>
+                                    <item AppInfo="Sanga" ConceptLink="http://cdb.iso.org/lg/CDB-00136527-001">xsn</item>
+                                    <item AppInfo="Solano" ConceptLink="http://cdb.iso.org/lg/CDB-00138336-001">xso</item>
+                                    <item AppInfo="Silopi" ConceptLink="http://cdb.iso.org/lg/CDB-00136528-001">xsp</item>
+                                    <item AppInfo="Makhuwa-Saka" ConceptLink="http://cdb.iso.org/lg/CDB-00136529-001">xsq</item>
+                                    <item AppInfo="Sherpa" ConceptLink="http://cdb.iso.org/lg/CDB-00136497-001">xsr</item>
+                                    <item AppInfo="Assan" ConceptLink="http://cdb.iso.org/lg/CDB-00138333-001">xss</item>
+                                    <item AppInfo="SanumÃ¡" ConceptLink="http://cdb.iso.org/lg/CDB-00136495-001">xsu</item>
+                                    <item AppInfo="Sudovian" ConceptLink="http://cdb.iso.org/lg/CDB-00138332-001">xsv</item>
+                                    <item AppInfo="Saisiyat" ConceptLink="http://cdb.iso.org/lg/CDB-00136518-001">xsy</item>
+                                    <item AppInfo="Alcozauca Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136487-001">xta</item>
+                                    <item AppInfo="Chazumba Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136488-001">xtb</item>
+                                    <item AppInfo="Katcha-Kadugli-Miri" ConceptLink="http://cdb.iso.org/lg/CDB-00136489-001">xtc</item>
+                                    <item AppInfo="Diuxi-Tilantongo Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136490-001">xtd</item>
+                                    <item AppInfo="Ketengban" ConceptLink="http://cdb.iso.org/lg/CDB-00136491-001">xte</item>
+                                    <item AppInfo="Transalpine Gaulish" ConceptLink="http://cdb.iso.org/lg/CDB-00138411-001">xtg</item>
+                                    <item AppInfo="Sinicahua Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136492-001">xti</item>
+                                    <item AppInfo="San Juan Teita Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136493-001">xtj</item>
+                                    <item AppInfo="Tijaltepec Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136494-001">xtl</item>
+                                    <item AppInfo="Magdalena PeÅasco Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136507-001">xtm</item>
+                                    <item AppInfo="Northern Tlaxiaco Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136496-001">xtn</item>
+                                    <item AppInfo="Tokharian A" ConceptLink="http://cdb.iso.org/lg/CDB-00138395-001">xto</item>
+                                    <item AppInfo="San Miguel Piedras Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136485-001">xtp</item>
+                                    <item AppInfo="Tumshuqese" ConceptLink="http://cdb.iso.org/lg/CDB-00137865-001">xtq</item>
+                                    <item AppInfo="Early Tripuri" ConceptLink="http://cdb.iso.org/lg/CDB-00138410-001">xtr</item>
+                                    <item AppInfo="Sindihui Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136498-001">xts</item>
+                                    <item AppInfo="Tacahua Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136499-001">xtt</item>
+                                    <item AppInfo="Cuyamecalco Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136500-001">xtu</item>
+                                    <item AppInfo="TawandÄ" ConceptLink="http://cdb.iso.org/lg/CDB-00136501-001">xtw</item>
+                                    <item AppInfo="Yoloxochitl Mixtec" ConceptLink="http://cdb.iso.org/lg/CDB-00136502-001">xty</item>
+                                    <item AppInfo="Tasmanian" ConceptLink="http://cdb.iso.org/lg/CDB-00138256-001">xtz</item>
+                                    <item AppInfo="Alu Kurumba" ConceptLink="http://cdb.iso.org/lg/CDB-00136503-001">xua</item>
+                                    <item AppInfo="Betta Kurumba" ConceptLink="http://cdb.iso.org/lg/CDB-00136504-001">xub</item>
+                                    <item AppInfo="Kunigami" ConceptLink="http://cdb.iso.org/lg/CDB-00136505-001">xug</item>
+                                    <item AppInfo="Jennu Kurumba" ConceptLink="http://cdb.iso.org/lg/CDB-00136506-001">xuj</item>
+                                    <item AppInfo="Umbrian" ConceptLink="http://cdb.iso.org/lg/CDB-00138412-001">xum</item>
+                                    <item AppInfo="Kuo" ConceptLink="http://cdb.iso.org/lg/CDB-00136232-001">xuo</item>
+                                    <item AppInfo="Upper Umpqua" ConceptLink="http://cdb.iso.org/lg/CDB-00138250-001">xup</item>
+                                    <item AppInfo="Urartian" ConceptLink="http://cdb.iso.org/lg/CDB-00138413-001">xur</item>
+                                    <item AppInfo="Kuthant" ConceptLink="http://cdb.iso.org/lg/CDB-00135957-001">xut</item>
+                                    <item AppInfo="Kxoe" ConceptLink="http://cdb.iso.org/lg/CDB-00136323-001">xuu</item>
+                                    <item AppInfo="Venetic" ConceptLink="http://cdb.iso.org/lg/CDB-00138417-001">xve</item>
+                                    <item AppInfo="Kamviri" ConceptLink="http://cdb.iso.org/lg/CDB-00136007-001">xvi</item>
+                                    <item AppInfo="Vandalic" ConceptLink="http://cdb.iso.org/lg/CDB-00138419-001">xvn</item>
+                                    <item AppInfo="Volscian" ConceptLink="http://cdb.iso.org/lg/CDB-00138435-001">xvo</item>
+                                    <item AppInfo="Vestinian" ConceptLink="http://cdb.iso.org/lg/CDB-00138421-001">xvs</item>
+                                    <item AppInfo="Kwaza" ConceptLink="http://cdb.iso.org/lg/CDB-00136008-001">xwa</item>
+                                    <item AppInfo="Woccon" ConceptLink="http://cdb.iso.org/lg/CDB-00138299-001">xwc</item>
+                                    <item AppInfo="Xwela Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00136009-001">xwe</item>
+                                    <item AppInfo="Kwegu" ConceptLink="http://cdb.iso.org/lg/CDB-00136010-001">xwg</item>
+                                    <item AppInfo="Western Xwla Gbe" ConceptLink="http://cdb.iso.org/lg/CDB-00136011-001">xwl</item>
+                                    <item AppInfo="Written Oirat" ConceptLink="http://cdb.iso.org/lg/CDB-00138295-001">xwo</item>
+                                    <item AppInfo="Kwerba Mamberamo" ConceptLink="http://cdb.iso.org/lg/CDB-00136012-001">xwr</item>
+                                    <item AppInfo="Boro" ConceptLink="http://cdb.iso.org/lg/CDB-00138293-001">xxb</item>
+                                    <item AppInfo="Ke'o" ConceptLink="http://cdb.iso.org/lg/CDB-00136013-001">xxk</item>
+                                    <item AppInfo="KoropÃ³" ConceptLink="http://cdb.iso.org/lg/CDB-00138291-001">xxr</item>
+                                    <item AppInfo="Tambora" ConceptLink="http://cdb.iso.org/lg/CDB-00138290-001">xxt</item>
+                                    <item AppInfo="Yalakalore" ConceptLink="http://cdb.iso.org/lg/CDB-00138289-001">xyl</item>
+                                    <item AppInfo="Zhang-Zhung" ConceptLink="http://cdb.iso.org/lg/CDB-00138423-001">xzh</item>
+                                    <item AppInfo="Zemgalian" ConceptLink="http://cdb.iso.org/lg/CDB-00138274-001">xzm</item>
+                                    <item AppInfo="Ancient Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00137861-001">xzp</item>
+                                    <item AppInfo="Yaminahua" ConceptLink="http://cdb.iso.org/lg/CDB-00136014-001">yaa</item>
+                                    <item AppInfo="Yuhup" ConceptLink="http://cdb.iso.org/lg/CDB-00136027-001">yab</item>
+                                    <item AppInfo="Pass Valley Yali" ConceptLink="http://cdb.iso.org/lg/CDB-00136016-001">yac</item>
+                                    <item AppInfo="Yagua" ConceptLink="http://cdb.iso.org/lg/CDB-00136005-001">yad</item>
+                                    <item AppInfo="PumÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00136018-001">yae</item>
+                                    <item AppInfo="Yaka" ConceptLink="http://cdb.iso.org/lg/CDB-00136019-001">yaf</item>
+                                    <item AppInfo="YÃ¡mana" ConceptLink="http://cdb.iso.org/lg/CDB-00136020-001">yag</item>
+                                    <item AppInfo="Yazgulyam" ConceptLink="http://cdb.iso.org/lg/CDB-00136021-001">yah</item>
+                                    <item AppInfo="Yagnobi" ConceptLink="http://cdb.iso.org/lg/CDB-00136022-001">yai</item>
+                                    <item AppInfo="Banda-Yangere" ConceptLink="http://cdb.iso.org/lg/CDB-00136023-001">yaj</item>
+                                    <item AppInfo="Yakima" ConceptLink="http://cdb.iso.org/lg/CDB-00136024-001">yak</item>
+                                    <item AppInfo="Yalunka" ConceptLink="http://cdb.iso.org/lg/CDB-00136025-001">yal</item>
+                                    <item AppInfo="Yamba" ConceptLink="http://cdb.iso.org/lg/CDB-00136026-001">yam</item>
+                                    <item AppInfo="Yao" ConceptLink="http://cdb.iso.org/lg/CDB-00135994-001">yao</item>
+                                    <item AppInfo="Yapese" ConceptLink="http://cdb.iso.org/lg/CDB-00135992-001">yap</item>
+                                    <item AppInfo="Yaqui" ConceptLink="http://cdb.iso.org/lg/CDB-00136015-001">yaq</item>
+                                    <item AppInfo="Yabarana" ConceptLink="http://cdb.iso.org/lg/CDB-00135984-001">yar</item>
+                                    <item AppInfo="Nugunu" ConceptLink="http://cdb.iso.org/lg/CDB-00135985-001">yas</item>
+                                    <item AppInfo="Yambeta" ConceptLink="http://cdb.iso.org/lg/CDB-00135986-001">yat</item>
+                                    <item AppInfo="Yuwana" ConceptLink="http://cdb.iso.org/lg/CDB-00135987-001">yau</item>
+                                    <item AppInfo="Yangben" ConceptLink="http://cdb.iso.org/lg/CDB-00135988-001">yav</item>
+                                    <item AppInfo="YawalapitÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00137975-001">yaw</item>
+                                    <item AppInfo="Yauma" ConceptLink="http://cdb.iso.org/lg/CDB-00135989-001">yax</item>
+                                    <item AppInfo="Agwagwune" ConceptLink="http://cdb.iso.org/lg/CDB-00135990-001">yay</item>
+                                    <item AppInfo="Lokaa" ConceptLink="http://cdb.iso.org/lg/CDB-00135991-001">yaz</item>
+                                    <item AppInfo="Yala" ConceptLink="http://cdb.iso.org/lg/CDB-00136004-001">yba</item>
+                                    <item AppInfo="Yemba" ConceptLink="http://cdb.iso.org/lg/CDB-00135993-001">ybb</item>
+                                    <item AppInfo="Yangbye" ConceptLink="http://cdb.iso.org/lg/CDB-00135982-001">ybd</item>
+                                    <item AppInfo="West Yugur" ConceptLink="http://cdb.iso.org/lg/CDB-00135995-001">ybe</item>
+                                    <item AppInfo="Yakha" ConceptLink="http://cdb.iso.org/lg/CDB-00135996-001">ybh</item>
+                                    <item AppInfo="Yamphu" ConceptLink="http://cdb.iso.org/lg/CDB-00135997-001">ybi</item>
+                                    <item AppInfo="Hasha" ConceptLink="http://cdb.iso.org/lg/CDB-00135998-001">ybj</item>
+                                    <item AppInfo="Bokha" ConceptLink="http://cdb.iso.org/lg/CDB-00135999-001">ybk</item>
+                                    <item AppInfo="Yukuben" ConceptLink="http://cdb.iso.org/lg/CDB-00136000-001">ybl</item>
+                                    <item AppInfo="Yaben" ConceptLink="http://cdb.iso.org/lg/CDB-00136001-001">ybm</item>
+                                    <item AppInfo="YabaÃ¢na" ConceptLink="http://cdb.iso.org/lg/CDB-00137962-001">ybn</item>
+                                    <item AppInfo="Yabong" ConceptLink="http://cdb.iso.org/lg/CDB-00136002-001">ybo</item>
+                                    <item AppInfo="Yawiyo" ConceptLink="http://cdb.iso.org/lg/CDB-00136029-001">ybx</item>
+                                    <item AppInfo="Yaweyuha" ConceptLink="http://cdb.iso.org/lg/CDB-00135983-001">yby</item>
+                                    <item AppInfo="Chesu" ConceptLink="http://cdb.iso.org/lg/CDB-00136017-001">ych</item>
+                                    <item AppInfo="Lolopo" ConceptLink="http://cdb.iso.org/lg/CDB-00136052-001">ycl</item>
+                                    <item AppInfo="Yucuna" ConceptLink="http://cdb.iso.org/lg/CDB-00136053-001">ycn</item>
+                                    <item AppInfo="Chepya" ConceptLink="http://cdb.iso.org/lg/CDB-00136054-001">ycp</item>
+                                    <item AppInfo="Eastern Yiddish" ConceptLink="http://cdb.iso.org/lg/CDB-00136055-001">ydd</item>
+                                    <item AppInfo="Yangum Dey" ConceptLink="http://cdb.iso.org/lg/CDB-00136056-001">yde</item>
+                                    <item AppInfo="Yidgha" ConceptLink="http://cdb.iso.org/lg/CDB-00136057-001">ydg</item>
+                                    <item AppInfo="Yoidik" ConceptLink="http://cdb.iso.org/lg/CDB-00136058-001">ydk</item>
+                                    <item AppInfo="Yiddish Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136059-001">yds</item>
+                                    <item AppInfo="Ravula" ConceptLink="http://cdb.iso.org/lg/CDB-00136060-001">yea</item>
+                                    <item AppInfo="Yeniche" ConceptLink="http://cdb.iso.org/lg/CDB-00136073-001">yec</item>
+                                    <item AppInfo="Yimas" ConceptLink="http://cdb.iso.org/lg/CDB-00136062-001">yee</item>
+                                    <item AppInfo="Yeni" ConceptLink="http://cdb.iso.org/lg/CDB-00138004-001">yei</item>
+                                    <item AppInfo="Yevanic" ConceptLink="http://cdb.iso.org/lg/CDB-00136051-001">yej</item>
+                                    <item AppInfo="Yela" ConceptLink="http://cdb.iso.org/lg/CDB-00136064-001">yel</item>
+                                    <item AppInfo="Yendang" ConceptLink="http://cdb.iso.org/lg/CDB-00136065-001">yen</item>
+                                    <item AppInfo="Tarok" ConceptLink="http://cdb.iso.org/lg/CDB-00136066-001">yer</item>
+                                    <item AppInfo="Yeskwa" ConceptLink="http://cdb.iso.org/lg/CDB-00136067-001">yes</item>
+                                    <item AppInfo="Yetfa" ConceptLink="http://cdb.iso.org/lg/CDB-00136068-001">yet</item>
+                                    <item AppInfo="Yerukula" ConceptLink="http://cdb.iso.org/lg/CDB-00136069-001">yeu</item>
+                                    <item AppInfo="Yapunda" ConceptLink="http://cdb.iso.org/lg/CDB-00136070-001">yev</item>
+                                    <item AppInfo="Yeyi" ConceptLink="http://cdb.iso.org/lg/CDB-00136071-001">yey</item>
+                                    <item AppInfo="Yangum Gel" ConceptLink="http://cdb.iso.org/lg/CDB-00136072-001">ygl</item>
+                                    <item AppInfo="Yagomi" ConceptLink="http://cdb.iso.org/lg/CDB-00136040-001">ygm</item>
+                                    <item AppInfo="Gepo" ConceptLink="http://cdb.iso.org/lg/CDB-00136038-001">ygp</item>
+                                    <item AppInfo="Yagaria" ConceptLink="http://cdb.iso.org/lg/CDB-00136061-001">ygr</item>
+                                    <item AppInfo="Yagwoia" ConceptLink="http://cdb.iso.org/lg/CDB-00136030-001">ygw</item>
+                                    <item AppInfo="Baha Buyang" ConceptLink="http://cdb.iso.org/lg/CDB-00136031-001">yha</item>
+                                    <item AppInfo="Judeo-Iraqi Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00136032-001">yhd</item>
+                                    <item AppInfo="Hlepho Phowa" ConceptLink="http://cdb.iso.org/lg/CDB-00136033-001">yhl</item>
+                                    <item AppInfo="Yinggarda" ConceptLink="http://cdb.iso.org/lg/CDB-00136034-001">yia</item>
+                                    <item AppInfo="Yiddish" ConceptLink="http://cdb.iso.org/lg/CDB-00138645-001">yid</item>
+                                    <item AppInfo="Ache" ConceptLink="http://cdb.iso.org/lg/CDB-00136035-001">yif</item>
+                                    <item AppInfo="Wusa Nasu" ConceptLink="http://cdb.iso.org/lg/CDB-00136036-001">yig</item>
+                                    <item AppInfo="Western Yiddish" ConceptLink="http://cdb.iso.org/lg/CDB-00136037-001">yih</item>
+                                    <item AppInfo="Yidiny" ConceptLink="http://cdb.iso.org/lg/CDB-00136050-001">yii</item>
+                                    <item AppInfo="Yindjibarndi" ConceptLink="http://cdb.iso.org/lg/CDB-00136039-001">yij</item>
+                                    <item AppInfo="Dongshanba Lalo" ConceptLink="http://cdb.iso.org/lg/CDB-00136028-001">yik</item>
+                                    <item AppInfo="Yindjilandji" ConceptLink="http://cdb.iso.org/lg/CDB-00136041-001">yil</item>
+                                    <item AppInfo="Yimchungru Naga" ConceptLink="http://cdb.iso.org/lg/CDB-00136042-001">yim</item>
+                                    <item AppInfo="Yinchia" ConceptLink="http://cdb.iso.org/lg/CDB-00136043-001">yin</item>
+                                    <item AppInfo="Pholo" ConceptLink="http://cdb.iso.org/lg/CDB-00136044-001">yip</item>
+                                    <item AppInfo="Miqie" ConceptLink="http://cdb.iso.org/lg/CDB-00136045-001">yiq</item>
+                                    <item AppInfo="North Awyu" ConceptLink="http://cdb.iso.org/lg/CDB-00136046-001">yir</item>
+                                    <item AppInfo="Yis" ConceptLink="http://cdb.iso.org/lg/CDB-00136047-001">yis</item>
+                                    <item AppInfo="Eastern Lalu" ConceptLink="http://cdb.iso.org/lg/CDB-00136048-001">yit</item>
+                                    <item AppInfo="Awu" ConceptLink="http://cdb.iso.org/lg/CDB-00135960-001">yiu</item>
+                                    <item AppInfo="Northern Nisu" ConceptLink="http://cdb.iso.org/lg/CDB-00136063-001">yiv</item>
+                                    <item AppInfo="Axi Yi" ConceptLink="http://cdb.iso.org/lg/CDB-00136003-001">yix</item>
+                                    <item AppInfo="Yir Yoront" ConceptLink="http://cdb.iso.org/lg/CDB-00135914-001">yiy</item>
+                                    <item AppInfo="Azhe" ConceptLink="http://cdb.iso.org/lg/CDB-00135915-001">yiz</item>
+                                    <item AppInfo="Yakan" ConceptLink="http://cdb.iso.org/lg/CDB-00135916-001">yka</item>
+                                    <item AppInfo="Northern Yukaghir" ConceptLink="http://cdb.iso.org/lg/CDB-00135917-001">ykg</item>
+                                    <item AppInfo="Yoke" ConceptLink="http://cdb.iso.org/lg/CDB-00135918-001">yki</item>
+                                    <item AppInfo="Yakaikeke" ConceptLink="http://cdb.iso.org/lg/CDB-00135919-001">ykk</item>
+                                    <item AppInfo="Khlula" ConceptLink="http://cdb.iso.org/lg/CDB-00135920-001">ykl</item>
+                                    <item AppInfo="Kap" ConceptLink="http://cdb.iso.org/lg/CDB-00135921-001">ykm</item>
+                                    <item AppInfo="Yasa" ConceptLink="http://cdb.iso.org/lg/CDB-00135922-001">yko</item>
+                                    <item AppInfo="Yekora" ConceptLink="http://cdb.iso.org/lg/CDB-00135935-001">ykr</item>
+                                    <item AppInfo="Kathu" ConceptLink="http://cdb.iso.org/lg/CDB-00135924-001">ykt</item>
+                                    <item AppInfo="Yakoma" ConceptLink="http://cdb.iso.org/lg/CDB-00135913-001">yky</item>
+                                    <item AppInfo="Yaul" ConceptLink="http://cdb.iso.org/lg/CDB-00135926-001">yla</item>
+                                    <item AppInfo="Yele" ConceptLink="http://cdb.iso.org/lg/CDB-00135927-001">yle</item>
+                                    <item AppInfo="Yelogu" ConceptLink="http://cdb.iso.org/lg/CDB-00135928-001">ylg</item>
+                                    <item AppInfo="Angguruk Yali" ConceptLink="http://cdb.iso.org/lg/CDB-00135929-001">yli</item>
+                                    <item AppInfo="Yil" ConceptLink="http://cdb.iso.org/lg/CDB-00135930-001">yll</item>
+                                    <item AppInfo="Limi" ConceptLink="http://cdb.iso.org/lg/CDB-00135931-001">ylm</item>
+                                    <item AppInfo="Langnian Buyang" ConceptLink="http://cdb.iso.org/lg/CDB-00135932-001">yln</item>
+                                    <item AppInfo="Naluo Yi" ConceptLink="http://cdb.iso.org/lg/CDB-00135933-001">ylo</item>
+                                    <item AppInfo="Yalarnnga" ConceptLink="http://cdb.iso.org/lg/CDB-00137934-001">ylr</item>
+                                    <item AppInfo="Aribwaung" ConceptLink="http://cdb.iso.org/lg/CDB-00135902-001">ylu</item>
+                                    <item AppInfo="NyÃ¢layu" ConceptLink="http://cdb.iso.org/lg/CDB-00135925-001">yly</item>
+                                    <item AppInfo="Yamphe" ConceptLink="http://cdb.iso.org/lg/CDB-00135923-001">yma</item>
+                                    <item AppInfo="Yambes" ConceptLink="http://cdb.iso.org/lg/CDB-00135892-001">ymb</item>
+                                    <item AppInfo="Southern Muji" ConceptLink="http://cdb.iso.org/lg/CDB-00135893-001">ymc</item>
+                                    <item AppInfo="Muda" ConceptLink="http://cdb.iso.org/lg/CDB-00135894-001">ymd</item>
+                                    <item AppInfo="Yameo" ConceptLink="http://cdb.iso.org/lg/CDB-00138099-001">yme</item>
+                                    <item AppInfo="Yamongeri" ConceptLink="http://cdb.iso.org/lg/CDB-00135895-001">ymg</item>
+                                    <item AppInfo="Mili" ConceptLink="http://cdb.iso.org/lg/CDB-00135896-001">ymh</item>
+                                    <item AppInfo="Moji" ConceptLink="http://cdb.iso.org/lg/CDB-00135897-001">ymi</item>
+                                    <item AppInfo="Makwe" ConceptLink="http://cdb.iso.org/lg/CDB-00135898-001">ymk</item>
+                                    <item AppInfo="Iamalele" ConceptLink="http://cdb.iso.org/lg/CDB-00135899-001">yml</item>
+                                    <item AppInfo="Maay" ConceptLink="http://cdb.iso.org/lg/CDB-00135912-001">ymm</item>
+                                    <item AppInfo="Yamna" ConceptLink="http://cdb.iso.org/lg/CDB-00135901-001">ymn</item>
+                                    <item AppInfo="Yangum Mon" ConceptLink="http://cdb.iso.org/lg/CDB-00135891-001">ymo</item>
+                                    <item AppInfo="Yamap" ConceptLink="http://cdb.iso.org/lg/CDB-00135903-001">ymp</item>
+                                    <item AppInfo="Qila Muji" ConceptLink="http://cdb.iso.org/lg/CDB-00135904-001">ymq</item>
+                                    <item AppInfo="Malasar" ConceptLink="http://cdb.iso.org/lg/CDB-00135905-001">ymr</item>
+                                    <item AppInfo="Mysian" ConceptLink="http://cdb.iso.org/lg/CDB-00138463-001">yms</item>
+                                    <item AppInfo="Mator-Taygi-Karagas" ConceptLink="http://cdb.iso.org/lg/CDB-00138085-001">ymt</item>
+                                    <item AppInfo="Northern Muji" ConceptLink="http://cdb.iso.org/lg/CDB-00135906-001">ymx</item>
+                                    <item AppInfo="Muzi" ConceptLink="http://cdb.iso.org/lg/CDB-00135907-001">ymz</item>
+                                    <item AppInfo="Aluo" ConceptLink="http://cdb.iso.org/lg/CDB-00135908-001">yna</item>
+                                    <item AppInfo="Yandruwandha" ConceptLink="http://cdb.iso.org/lg/CDB-00135909-001">ynd</item>
+                                    <item AppInfo="Lang'e" ConceptLink="http://cdb.iso.org/lg/CDB-00135910-001">yne</item>
+                                    <item AppInfo="Yango" ConceptLink="http://cdb.iso.org/lg/CDB-00135911-001">yng</item>
+                                    <item AppInfo="Yangho" ConceptLink="http://cdb.iso.org/lg/CDB-00135937-001">ynh</item>
+                                    <item AppInfo="Naukan Yupik" ConceptLink="http://cdb.iso.org/lg/CDB-00135971-001">ynk</item>
+                                    <item AppInfo="Yangulam" ConceptLink="http://cdb.iso.org/lg/CDB-00135934-001">ynl</item>
+                                    <item AppInfo="Yana" ConceptLink="http://cdb.iso.org/lg/CDB-00138075-001">ynn</item>
+                                    <item AppInfo="Yong" ConceptLink="http://cdb.iso.org/lg/CDB-00135961-001">yno</item>
+                                    <item AppInfo="Yansi" ConceptLink="http://cdb.iso.org/lg/CDB-00135962-001">yns</item>
+                                    <item AppInfo="Yahuna" ConceptLink="http://cdb.iso.org/lg/CDB-00138072-001">ynu</item>
+                                    <item AppInfo="Yoba" ConceptLink="http://cdb.iso.org/lg/CDB-00138071-001">yob</item>
+                                    <item AppInfo="Yogad" ConceptLink="http://cdb.iso.org/lg/CDB-00135963-001">yog</item>
+                                    <item AppInfo="Yonaguni" ConceptLink="http://cdb.iso.org/lg/CDB-00135964-001">yoi</item>
+                                    <item AppInfo="Yokuts" ConceptLink="http://cdb.iso.org/lg/CDB-00135965-001">yok</item>
+                                    <item AppInfo="Yola" ConceptLink="http://cdb.iso.org/lg/CDB-00138125-001">yol</item>
+                                    <item AppInfo="Yombe" ConceptLink="http://cdb.iso.org/lg/CDB-00135966-001">yom</item>
+                                    <item AppInfo="Yonggom" ConceptLink="http://cdb.iso.org/lg/CDB-00135967-001">yon</item>
+                                    <item AppInfo="Yoruba" ConceptLink="http://cdb.iso.org/lg/CDB-00138646-001">yor</item>
+                                    <item AppInfo="Yos" ConceptLink="http://cdb.iso.org/lg/CDB-00135968-001">yos</item>
+                                    <item AppInfo="Yoron" ConceptLink="http://cdb.iso.org/lg/CDB-00135981-001">yox</item>
+                                    <item AppInfo="Yoy" ConceptLink="http://cdb.iso.org/lg/CDB-00135970-001">yoy</item>
+                                    <item AppInfo="Phala" ConceptLink="http://cdb.iso.org/lg/CDB-00135959-001">ypa</item>
+                                    <item AppInfo="Labo Phowa" ConceptLink="http://cdb.iso.org/lg/CDB-00135972-001">ypb</item>
+                                    <item AppInfo="Phola" ConceptLink="http://cdb.iso.org/lg/CDB-00135973-001">ypg</item>
+                                    <item AppInfo="Phupha" ConceptLink="http://cdb.iso.org/lg/CDB-00135974-001">yph</item>
+                                    <item AppInfo="Phuma" ConceptLink="http://cdb.iso.org/lg/CDB-00135975-001">ypm</item>
+                                    <item AppInfo="Ani Phowa" ConceptLink="http://cdb.iso.org/lg/CDB-00135976-001">ypn</item>
+                                    <item AppInfo="Alo Phola" ConceptLink="http://cdb.iso.org/lg/CDB-00135977-001">ypo</item>
+                                    <item AppInfo="Phupa" ConceptLink="http://cdb.iso.org/lg/CDB-00135978-001">ypp</item>
+                                    <item AppInfo="Phuza" ConceptLink="http://cdb.iso.org/lg/CDB-00135979-001">ypz</item>
+                                    <item AppInfo="Yerakai" ConceptLink="http://cdb.iso.org/lg/CDB-00135980-001">yra</item>
+                                    <item AppInfo="Yareba" ConceptLink="http://cdb.iso.org/lg/CDB-00135948-001">yrb</item>
+                                    <item AppInfo="YaourÃ©" ConceptLink="http://cdb.iso.org/lg/CDB-00135946-001">yre</item>
+                                    <item AppInfo="YarÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00135969-001">yri</item>
+                                    <item AppInfo="Nenets" ConceptLink="http://cdb.iso.org/lg/CDB-00135938-001">yrk</item>
+                                    <item AppInfo="Nhengatu" ConceptLink="http://cdb.iso.org/lg/CDB-00135939-001">yrl</item>
+                                    <item AppInfo="Yerong" ConceptLink="http://cdb.iso.org/lg/CDB-00135940-001">yrn</item>
+                                    <item AppInfo="Yarsun" ConceptLink="http://cdb.iso.org/lg/CDB-00135941-001">yrs</item>
+                                    <item AppInfo="Yarawata" ConceptLink="http://cdb.iso.org/lg/CDB-00135942-001">yrw</item>
+                                    <item AppInfo="Yassic" ConceptLink="http://cdb.iso.org/lg/CDB-00138102-001">ysc</item>
+                                    <item AppInfo="Samatao" ConceptLink="http://cdb.iso.org/lg/CDB-00135943-001">ysd</item>
+                                    <item AppInfo="Yugoslavian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00135944-001">ysl</item>
+                                    <item AppInfo="Sani" ConceptLink="http://cdb.iso.org/lg/CDB-00135945-001">ysn</item>
+                                    <item AppInfo="Nisi" ConceptLink="http://cdb.iso.org/lg/CDB-00135958-001">yso</item>
+                                    <item AppInfo="Southern Lolopo" ConceptLink="http://cdb.iso.org/lg/CDB-00135947-001">ysp</item>
+                                    <item AppInfo="Sirenik Yupik" ConceptLink="http://cdb.iso.org/lg/CDB-00138038-001">ysr</item>
+                                    <item AppInfo="Yessan-Mayo" ConceptLink="http://cdb.iso.org/lg/CDB-00135936-001">yss</item>
+                                    <item AppInfo="Sanie" ConceptLink="http://cdb.iso.org/lg/CDB-00135949-001">ysy</item>
+                                    <item AppInfo="Talu" ConceptLink="http://cdb.iso.org/lg/CDB-00135950-001">yta</item>
+                                    <item AppInfo="Tanglang" ConceptLink="http://cdb.iso.org/lg/CDB-00135951-001">ytl</item>
+                                    <item AppInfo="Thopho" ConceptLink="http://cdb.iso.org/lg/CDB-00135952-001">ytp</item>
+                                    <item AppInfo="Yucateco" ConceptLink="http://cdb.iso.org/lg/CDB-00135953-001">yua</item>
+                                    <item AppInfo="Yugambal" ConceptLink="http://cdb.iso.org/lg/CDB-00138032-001">yub</item>
+                                    <item AppInfo="Yuchi" ConceptLink="http://cdb.iso.org/lg/CDB-00135954-001">yuc</item>
+                                    <item AppInfo="Judeo-Tripolitanian Arabic" ConceptLink="http://cdb.iso.org/lg/CDB-00135955-001">yud</item>
+                                    <item AppInfo="Yue Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00135956-001">yue</item>
+                                    <item AppInfo="Havasupai-Walapai-Yavapai" ConceptLink="http://cdb.iso.org/lg/CDB-00136083-001">yuf</item>
+                                    <item AppInfo="Yug" ConceptLink="http://cdb.iso.org/lg/CDB-00138029-001">yug</item>
+                                    <item AppInfo="YurutÃ­" ConceptLink="http://cdb.iso.org/lg/CDB-00135900-001">yui</item>
+                                    <item AppInfo="Karkar-Yuri" ConceptLink="http://cdb.iso.org/lg/CDB-00136049-001">yuj</item>
+                                    <item AppInfo="Yuki" ConceptLink="http://cdb.iso.org/lg/CDB-00138012-001">yuk</item>
+                                    <item AppInfo="Yulu" ConceptLink="http://cdb.iso.org/lg/CDB-00136189-001">yul</item>
+                                    <item AppInfo="Quechan" ConceptLink="http://cdb.iso.org/lg/CDB-00136190-001">yum</item>
+                                    <item AppInfo="Bena" ConceptLink="http://cdb.iso.org/lg/CDB-00136191-001">yun</item>
+                                    <item AppInfo="Yukpa" ConceptLink="http://cdb.iso.org/lg/CDB-00136192-001">yup</item>
+                                    <item AppInfo="Yuqui" ConceptLink="http://cdb.iso.org/lg/CDB-00136193-001">yuq</item>
+                                    <item AppInfo="Yurok" ConceptLink="http://cdb.iso.org/lg/CDB-00136194-001">yur</item>
+                                    <item AppInfo="Yopno" ConceptLink="http://cdb.iso.org/lg/CDB-00136195-001">yut</item>
+                                    <item AppInfo="Yugh" ConceptLink="http://cdb.iso.org/lg/CDB-00136196-001">yuu</item>
+                                    <item AppInfo="Yau" ConceptLink="http://cdb.iso.org/lg/CDB-00136197-001">yuw</item>
+                                    <item AppInfo="Southern Yukaghir" ConceptLink="http://cdb.iso.org/lg/CDB-00136210-001">yux</item>
+                                    <item AppInfo="East Yugur" ConceptLink="http://cdb.iso.org/lg/CDB-00136199-001">yuy</item>
+                                    <item AppInfo="Yuracare" ConceptLink="http://cdb.iso.org/lg/CDB-00136188-001">yuz</item>
+                                    <item AppInfo="Yawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136201-001">yva</item>
+                                    <item AppInfo="Yavitero" ConceptLink="http://cdb.iso.org/lg/CDB-00138014-001">yvt</item>
+                                    <item AppInfo="Kalou" ConceptLink="http://cdb.iso.org/lg/CDB-00136202-001">ywa</item>
+                                    <item AppInfo="Western Lalu" ConceptLink="http://cdb.iso.org/lg/CDB-00136203-001">ywl</item>
+                                    <item AppInfo="Yawanawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136204-001">ywn</item>
+                                    <item AppInfo="Wuding-Luquan Yi" ConceptLink="http://cdb.iso.org/lg/CDB-00136205-001">ywq</item>
+                                    <item AppInfo="Yawuru" ConceptLink="http://cdb.iso.org/lg/CDB-00136206-001">ywr</item>
+                                    <item AppInfo="Xishanba Lalo" ConceptLink="http://cdb.iso.org/lg/CDB-00136207-001">ywt</item>
+                                    <item AppInfo="Wumeng Nasu" ConceptLink="http://cdb.iso.org/lg/CDB-00136208-001">ywu</item>
+                                    <item AppInfo="Yawarawarga" ConceptLink="http://cdb.iso.org/lg/CDB-00136209-001">yww</item>
+                                    <item AppInfo="Yau" ConceptLink="http://cdb.iso.org/lg/CDB-00136177-001">yyu</item>
+                                    <item AppInfo="Ayizi" ConceptLink="http://cdb.iso.org/lg/CDB-00136175-001">yyz</item>
+                                    <item AppInfo="E'ma Buyang" ConceptLink="http://cdb.iso.org/lg/CDB-00136198-001">yzg</item>
+                                    <item AppInfo="Zokhuo" ConceptLink="http://cdb.iso.org/lg/CDB-00136167-001">yzk</item>
+                                    <item AppInfo="Sierra de JuÃ¡rez Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136168-001">zaa</item>
+                                    <item AppInfo="San Juan GuelavÃ­a Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136169-001">zab</item>
+                                    <item AppInfo="OcotlÃ¡n Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136170-001">zac</item>
+                                    <item AppInfo="Cajonos Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136171-001">zad</item>
+                                    <item AppInfo="Yareni Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136172-001">zae</item>
+                                    <item AppInfo="Ayoquesco Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136173-001">zaf</item>
+                                    <item AppInfo="Zaghawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136174-001">zag</item>
+                                    <item AppInfo="Zangwal" ConceptLink="http://cdb.iso.org/lg/CDB-00136187-001">zah</item>
+                                    <item AppInfo="Isthmus Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136176-001">zai</item>
+                                    <item AppInfo="Zaramo" ConceptLink="http://cdb.iso.org/lg/CDB-00136165-001">zaj</item>
+                                    <item AppInfo="Zanaki" ConceptLink="http://cdb.iso.org/lg/CDB-00136178-001">zak</item>
+                                    <item AppInfo="Zauzou" ConceptLink="http://cdb.iso.org/lg/CDB-00136179-001">zal</item>
+                                    <item AppInfo="MiahuatlÃ¡n Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136180-001">zam</item>
+                                    <item AppInfo="Ozolotepec Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136181-001">zao</item>
+                                    <item AppInfo="Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00130978-001">zap</item>
+                                    <item AppInfo="AloÃ¡pam Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136182-001">zaq</item>
+                                    <item AppInfo="RincÃ³n Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136183-001">zar</item>
+                                    <item AppInfo="Santo Domingo Albarradas Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136184-001">zas</item>
+                                    <item AppInfo="Tabaa Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136185-001">zat</item>
+                                    <item AppInfo="Zangskari" ConceptLink="http://cdb.iso.org/lg/CDB-00136212-001">zau</item>
+                                    <item AppInfo="Yatzachi Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136166-001">zav</item>
+                                    <item AppInfo="Mitla Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136200-001">zaw</item>
+                                    <item AppInfo="Xadani Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136235-001">zax</item>
+                                    <item AppInfo="Zayse-Zergulla" ConceptLink="http://cdb.iso.org/lg/CDB-00136236-001">zay</item>
+                                    <item AppInfo="Zari" ConceptLink="http://cdb.iso.org/lg/CDB-00136237-001">zaz</item>
+                                    <item AppInfo="Central Berawan" ConceptLink="http://cdb.iso.org/lg/CDB-00136238-001">zbc</item>
+                                    <item AppInfo="East Berawan" ConceptLink="http://cdb.iso.org/lg/CDB-00136239-001">zbe</item>
+                                    <item AppInfo="Blissymbols; Blissymbolics; Bliss" ConceptLink="http://cdb.iso.org/lg/CDB-00138349-001">zbl</item>
+                                    <item AppInfo="Batui" ConceptLink="http://cdb.iso.org/lg/CDB-00136240-001">zbt</item>
+                                    <item AppInfo="West Berawan" ConceptLink="http://cdb.iso.org/lg/CDB-00136241-001">zbw</item>
+                                    <item AppInfo="Coatecas Altas Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136242-001">zca</item>
+                                    <item AppInfo="Central Hongshuihe Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136243-001">zch</item>
+                                    <item AppInfo="Ngazidja Comorian" ConceptLink="http://cdb.iso.org/lg/CDB-00136256-001">zdj</item>
+                                    <item AppInfo="Zeeuws" ConceptLink="http://cdb.iso.org/lg/CDB-00136245-001">zea</item>
+                                    <item AppInfo="Zenag" ConceptLink="http://cdb.iso.org/lg/CDB-00136234-001">zeg</item>
+                                    <item AppInfo="Eastern Hongshuihe Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136247-001">zeh</item>
+                                    <item AppInfo="Zenaga" ConceptLink="http://cdb.iso.org/lg/CDB-00136248-001">zen</item>
+                                    <item AppInfo="Kinga" ConceptLink="http://cdb.iso.org/lg/CDB-00136249-001">zga</item>
+                                    <item AppInfo="Guibei Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136250-001">zgb</item>
+                                    <item AppInfo="Minz Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136251-001">zgm</item>
+                                    <item AppInfo="Guibian Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136252-001">zgn</item>
+                                    <item AppInfo="Magori" ConceptLink="http://cdb.iso.org/lg/CDB-00136253-001">zgr</item>
+                                    <item AppInfo="Zhuang; Chuang" ConceptLink="http://cdb.iso.org/lg/CDB-00138647-001">zha</item>
+                                    <item AppInfo="Zhaba" ConceptLink="http://cdb.iso.org/lg/CDB-00136254-001">zhb</item>
+                                    <item AppInfo="Dai Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136255-001">zhd</item>
+                                    <item AppInfo="Zhire" ConceptLink="http://cdb.iso.org/lg/CDB-00136223-001">zhi</item>
+                                    <item AppInfo="Nong Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136221-001">zhn</item>
+                                    <item AppInfo="Chinese" ConceptLink="http://cdb.iso.org/lg/CDB-00138648-001">zho</item>
+                                    <item AppInfo="Zhoa" ConceptLink="http://cdb.iso.org/lg/CDB-00136244-001">zhw</item>
+                                    <item AppInfo="Zia" ConceptLink="http://cdb.iso.org/lg/CDB-00136213-001">zia</item>
+                                    <item AppInfo="Zimbabwe Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136214-001">zib</item>
+                                    <item AppInfo="Zimakani" ConceptLink="http://cdb.iso.org/lg/CDB-00136215-001">zik</item>
+                                    <item AppInfo="Mesme" ConceptLink="http://cdb.iso.org/lg/CDB-00136216-001">zim</item>
+                                    <item AppInfo="Zinza" ConceptLink="http://cdb.iso.org/lg/CDB-00136217-001">zin</item>
+                                    <item AppInfo="Ziriya" ConceptLink="http://cdb.iso.org/lg/CDB-00136218-001">zir</item>
+                                    <item AppInfo="Zigula" ConceptLink="http://cdb.iso.org/lg/CDB-00136219-001">ziw</item>
+                                    <item AppInfo="Zizilivakan" ConceptLink="http://cdb.iso.org/lg/CDB-00136220-001">ziz</item>
+                                    <item AppInfo="Kaimbulawa" ConceptLink="http://cdb.iso.org/lg/CDB-00136233-001">zka</item>
+                                    <item AppInfo="Koibal" ConceptLink="http://cdb.iso.org/lg/CDB-00138109-001">zkb</item>
+                                    <item AppInfo="Koguryo" ConceptLink="http://cdb.iso.org/lg/CDB-00138110-001">zkg</item>
+                                    <item AppInfo="Khorezmian" ConceptLink="http://cdb.iso.org/lg/CDB-00138098-001">zkh</item>
+                                    <item AppInfo="Karankawa" ConceptLink="http://cdb.iso.org/lg/CDB-00138114-001">zkk</item>
+                                    <item AppInfo="Kott" ConceptLink="http://cdb.iso.org/lg/CDB-00138117-001">zko</item>
+                                    <item AppInfo="SÃ£o Paulo KaingÃ¡ng" ConceptLink="http://cdb.iso.org/lg/CDB-00138119-001">zkp</item>
+                                    <item AppInfo="Zakhring" ConceptLink="http://cdb.iso.org/lg/CDB-00136222-001">zkr</item>
+                                    <item AppInfo="Kitan" ConceptLink="http://cdb.iso.org/lg/CDB-00138122-001">zkt</item>
+                                    <item AppInfo="Kaurna" ConceptLink="http://cdb.iso.org/lg/CDB-00138123-001">zku</item>
+                                    <item AppInfo="Krevinian" ConceptLink="http://cdb.iso.org/lg/CDB-00138084-001">zkv</item>
+                                    <item AppInfo="Khazar" ConceptLink="http://cdb.iso.org/lg/CDB-00138076-001">zkz</item>
+                                    <item AppInfo="Liujiang Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136211-001">zlj</item>
+                                    <item AppInfo="Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00136224-001">zlm</item>
+                                    <item AppInfo="Lianshan Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136225-001">zln</item>
+                                    <item AppInfo="Liuqian Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136226-001">zlq</item>
+                                    <item AppInfo="Manda" ConceptLink="http://cdb.iso.org/lg/CDB-00136227-001">zma</item>
+                                    <item AppInfo="Zimba" ConceptLink="http://cdb.iso.org/lg/CDB-00136228-001">zmb</item>
+                                    <item AppInfo="Margany" ConceptLink="http://cdb.iso.org/lg/CDB-00136229-001">zmc</item>
+                                    <item AppInfo="Maridan" ConceptLink="http://cdb.iso.org/lg/CDB-00136230-001">zmd</item>
+                                    <item AppInfo="Mangerr" ConceptLink="http://cdb.iso.org/lg/CDB-00136231-001">zme</item>
+                                    <item AppInfo="Mfinu" ConceptLink="http://cdb.iso.org/lg/CDB-00136143-001">zmf</item>
+                                    <item AppInfo="Marti Ke" ConceptLink="http://cdb.iso.org/lg/CDB-00136246-001">zmg</item>
+                                    <item AppInfo="Makolkol" ConceptLink="http://cdb.iso.org/lg/CDB-00136186-001">zmh</item>
+                                    <item AppInfo="Negeri Sembilan Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00136097-001">zmi</item>
+                                    <item AppInfo="Maridjabin" ConceptLink="http://cdb.iso.org/lg/CDB-00136098-001">zmj</item>
+                                    <item AppInfo="Mandandanyi" ConceptLink="http://cdb.iso.org/lg/CDB-00136099-001">zmk</item>
+                                    <item AppInfo="Madngele" ConceptLink="http://cdb.iso.org/lg/CDB-00136100-001">zml</item>
+                                    <item AppInfo="Marimanindji" ConceptLink="http://cdb.iso.org/lg/CDB-00136101-001">zmm</item>
+                                    <item AppInfo="Mbangwe" ConceptLink="http://cdb.iso.org/lg/CDB-00136102-001">zmn</item>
+                                    <item AppInfo="Molo" ConceptLink="http://cdb.iso.org/lg/CDB-00136103-001">zmo</item>
+                                    <item AppInfo="Mpuono" ConceptLink="http://cdb.iso.org/lg/CDB-00136104-001">zmp</item>
+                                    <item AppInfo="Mituku" ConceptLink="http://cdb.iso.org/lg/CDB-00136105-001">zmq</item>
+                                    <item AppInfo="Maranunggu" ConceptLink="http://cdb.iso.org/lg/CDB-00136118-001">zmr</item>
+                                    <item AppInfo="Mbesa" ConceptLink="http://cdb.iso.org/lg/CDB-00136107-001">zms</item>
+                                    <item AppInfo="Maringarr" ConceptLink="http://cdb.iso.org/lg/CDB-00136096-001">zmt</item>
+                                    <item AppInfo="Muruwari" ConceptLink="http://cdb.iso.org/lg/CDB-00136109-001">zmu</item>
+                                    <item AppInfo="Mbariman-Gudhinma" ConceptLink="http://cdb.iso.org/lg/CDB-00136110-001">zmv</item>
+                                    <item AppInfo="Mbo" ConceptLink="http://cdb.iso.org/lg/CDB-00136111-001">zmw</item>
+                                    <item AppInfo="Bomitaba" ConceptLink="http://cdb.iso.org/lg/CDB-00136112-001">zmx</item>
+                                    <item AppInfo="Mariyedi" ConceptLink="http://cdb.iso.org/lg/CDB-00136113-001">zmy</item>
+                                    <item AppInfo="Mbandja" ConceptLink="http://cdb.iso.org/lg/CDB-00136114-001">zmz</item>
+                                    <item AppInfo="Zan Gula" ConceptLink="http://cdb.iso.org/lg/CDB-00136115-001">zna</item>
+                                    <item AppInfo="Zande" ConceptLink="http://cdb.iso.org/lg/CDB-00136116-001">zne</item>
+                                    <item AppInfo="Mang" ConceptLink="http://cdb.iso.org/lg/CDB-00136085-001">zng</item>
+                                    <item AppInfo="Manangkari" ConceptLink="http://cdb.iso.org/lg/CDB-00138001-001">znk</item>
+                                    <item AppInfo="Mangas" ConceptLink="http://cdb.iso.org/lg/CDB-00136108-001">zns</item>
+                                    <item AppInfo="CopainalÃ¡ Zoque" ConceptLink="http://cdb.iso.org/lg/CDB-00136106-001">zoc</item>
+                                    <item AppInfo="Chimalapa Zoque" ConceptLink="http://cdb.iso.org/lg/CDB-00136075-001">zoh</item>
+                                    <item AppInfo="Zou" ConceptLink="http://cdb.iso.org/lg/CDB-00136076-001">zom</item>
+                                    <item AppInfo="AsunciÃ³n Mixtepec Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136077-001">zoo</item>
+                                    <item AppInfo="Tabasco Zoque" ConceptLink="http://cdb.iso.org/lg/CDB-00136078-001">zoq</item>
+                                    <item AppInfo="RayÃ³n Zoque" ConceptLink="http://cdb.iso.org/lg/CDB-00136079-001">zor</item>
+                                    <item AppInfo="Francisco LeÃ³n Zoque" ConceptLink="http://cdb.iso.org/lg/CDB-00136080-001">zos</item>
+                                    <item AppInfo="Lachiguiri Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136081-001">zpa</item>
+                                    <item AppInfo="Yautepec Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136082-001">zpb</item>
+                                    <item AppInfo="Choapan Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136095-001">zpc</item>
+                                    <item AppInfo="Southeastern IxtlÃ¡n Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136084-001">zpd</item>
+                                    <item AppInfo="Petapa Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136074-001">zpe</item>
+                                    <item AppInfo="San Pedro Quiatoni Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136086-001">zpf</item>
+                                    <item AppInfo="Guevea De Humboldt Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136087-001">zpg</item>
+                                    <item AppInfo="Totomachapan Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136088-001">zph</item>
+                                    <item AppInfo="Santa MarÃ­a Quiegolani Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136089-001">zpi</item>
+                                    <item AppInfo="Quiavicuzas Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136090-001">zpj</item>
+                                    <item AppInfo="Tlacolulita Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136091-001">zpk</item>
+                                    <item AppInfo="LachixÃ­o Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136092-001">zpl</item>
+                                    <item AppInfo="Mixtepec Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136093-001">zpm</item>
+                                    <item AppInfo="Santa InÃ©s Yatzechi Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136094-001">zpn</item>
+                                    <item AppInfo="AmatlÃ¡n Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136120-001">zpo</item>
+                                    <item AppInfo="El Alto Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136154-001">zpp</item>
+                                    <item AppInfo="Zoogocho Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136117-001">zpq</item>
+                                    <item AppInfo="Santiago Xanica Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136144-001">zpr</item>
+                                    <item AppInfo="CoatlÃ¡n Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136145-001">zps</item>
+                                    <item AppInfo="San Vicente CoatlÃ¡n Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136146-001">zpt</item>
+                                    <item AppInfo="YalÃ¡lag Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136147-001">zpu</item>
+                                    <item AppInfo="Chichicapan Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136148-001">zpv</item>
+                                    <item AppInfo="Zaniza Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136149-001">zpw</item>
+                                    <item AppInfo="San Baltazar Loxicha Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136150-001">zpx</item>
+                                    <item AppInfo="Mazaltepec Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136151-001">zpy</item>
+                                    <item AppInfo="Texmelucan Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136164-001">zpz</item>
+                                    <item AppInfo="Qiubei Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136153-001">zqe</item>
+                                    <item AppInfo="Kara" ConceptLink="http://cdb.iso.org/lg/CDB-00137978-001">zra</item>
+                                    <item AppInfo="Mirgan" ConceptLink="http://cdb.iso.org/lg/CDB-00136142-001">zrg</item>
+                                    <item AppInfo="Zirenkel" ConceptLink="http://cdb.iso.org/lg/CDB-00136155-001">zrn</item>
+                                    <item AppInfo="ZÃ¡paro" ConceptLink="http://cdb.iso.org/lg/CDB-00136156-001">zro</item>
+                                    <item AppInfo="Zarphatic" ConceptLink="http://cdb.iso.org/lg/CDB-00138283-001">zrp</item>
+                                    <item AppInfo="Mairasi" ConceptLink="http://cdb.iso.org/lg/CDB-00136157-001">zrs</item>
+                                    <item AppInfo="Sarasira" ConceptLink="http://cdb.iso.org/lg/CDB-00136158-001">zsa</item>
+                                    <item AppInfo="Kaskean" ConceptLink="http://cdb.iso.org/lg/CDB-00138369-001">zsk</item>
+                                    <item AppInfo="Zambian Sign Language" ConceptLink="http://cdb.iso.org/lg/CDB-00136159-001">zsl</item>
+                                    <item AppInfo="Standard Malay" ConceptLink="http://cdb.iso.org/lg/CDB-00136160-001">zsm</item>
+                                    <item AppInfo="Southern Rincon Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136161-001">zsr</item>
+                                    <item AppInfo="Sukurum" ConceptLink="http://cdb.iso.org/lg/CDB-00136162-001">zsu</item>
+                                    <item AppInfo="Elotepec Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136163-001">zte</item>
+                                    <item AppInfo="XanaguÃ­a Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136131-001">ztg</item>
+                                    <item AppInfo="LapaguÃ­a-Guivini Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136129-001">ztl</item>
+                                    <item AppInfo="San AgustÃ­n Mixtepec Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136152-001">ztm</item>
+                                    <item AppInfo="Santa Catarina Albarradas Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136121-001">ztn</item>
+                                    <item AppInfo="Loxicha Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136122-001">ztp</item>
+                                    <item AppInfo="Quioquitani-QuierÃ­ Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136123-001">ztq</item>
+                                    <item AppInfo="Tilquiapan Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136124-001">zts</item>
+                                    <item AppInfo="Tejalapan Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136125-001">ztt</item>
+                                    <item AppInfo="GÃŒilÃ¡ Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136126-001">ztu</item>
+                                    <item AppInfo="Zaachila Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136127-001">ztx</item>
+                                    <item AppInfo="Yatee Zapotec" ConceptLink="http://cdb.iso.org/lg/CDB-00136128-001">zty</item>
+                                    <item AppInfo="Zeem" ConceptLink="http://cdb.iso.org/lg/CDB-00136141-001">zua</item>
+                                    <item AppInfo="Tokano" ConceptLink="http://cdb.iso.org/lg/CDB-00136130-001">zuh</item>
+                                    <item AppInfo="Zulu" ConceptLink="http://cdb.iso.org/lg/CDB-00138649-001">zul</item>
+                                    <item AppInfo="Kumzari" ConceptLink="http://cdb.iso.org/lg/CDB-00136119-001">zum</item>
+                                    <item AppInfo="Zuni" ConceptLink="http://cdb.iso.org/lg/CDB-00136132-001">zun</item>
+                                    <item AppInfo="Zumaya" ConceptLink="http://cdb.iso.org/lg/CDB-00136133-001">zuy</item>
+                                    <item AppInfo="Zay" ConceptLink="http://cdb.iso.org/lg/CDB-00136134-001">zwa</item>
+                                    <item AppInfo="no linguistic content" ConceptLink="http://cdb.iso.org/lg/CDB-00130973-001">zxx</item>
+                                    <item AppInfo="Yongbei Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136135-001">zyb</item>
+                                    <item AppInfo="Yang Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136136-001">zyg</item>
+                                    <item AppInfo="Youjiang Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136137-001">zyj</item>
+                                    <item AppInfo="Yongnan Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136138-001">zyn</item>
+                                    <item AppInfo="Zyphe" ConceptLink="http://cdb.iso.org/lg/CDB-00136139-001">zyp</item>
+                                    <item AppInfo="Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki" ConceptLink="http://cdb.iso.org/lg/CDB-00131000-001">zza</item>
+                                    <item AppInfo="Zuojiang Zhuang" ConceptLink="http://cdb.iso.org/lg/CDB-00136140-001">zzj</item>
+                                </enumeration>
+                            </ValueScheme>
+                        </CMD_Element>
+                    </CMD_Component>
+                </CMD_Component>
+            </CMD_Component>
+        </CMD_Component>
+    </CMD_Component>
+</CMD_ComponentSpec>
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/INSTALL
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/INSTALL	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/INSTALL	(revision 5961)
@@ -0,0 +1,68 @@
+INSTALLING THE COMPONENT REGISTRY REST SERVICE AND FLEX UI
+
+Important to know
+-----------------
+The Component Registry REST service depends on a PostgreSQL database to
+store its data. It is packaged as a servlet and has been tested to work with
+Tomcat. 
+
+The package includes a Flex based client that runs client-side in the
+user's browser. It is wrapped by an index.jsp page that embeds it and passes
+some parameters; it is located in the root of the application directory. 
+
+The web application uses the Spring framework and in the current version it
+is partly configured through Spring (see below).
+
+Setting up the database
+-----------------------
+- Create a new PostgreSQL database and configure users and roles
+- Run the create script 'create.sql' under the appropriate permissions
+
+Configuring Tomcat
+------------------
+By default, the application assumes a named (JNDI) datasource 
+jdbc/ComponentRegistry that provides access to the ComponentRegistry
+database. Set it up for the database described above in the Tomcat 
+configuration.
+    
+For more information, or configuring a custom datasource Spring bean,
+see WEB-INF/spring-config/datasource-jdbc.xml
+
+If you keep the context parameters in a per-application context fragment,
+make sure it is up-to-date with the one in the META-INF directory of the
+war package. If not, make sure all context parameters defined in this file
+are present in your global context configuration.
+
+Deploying the application
+-------------------------
+Deploy the ComponentRegistry.war file to the Tomcat instance.
+
+Configuring the application
+---------------------------
+Some aspects require additional configuration depending on the context:
+
+- Shibboleth authentication. ComponentRegistry uses the SHHAA filter, which
+  is configured in WEB-INF/shhaa.xml. Make sure SSO and SLO URL's are correct.
+  
+- Admin users. The application expects a context parameter
+  'componentRegistryAdminUsers' to be set as a white-space separated list of
+  users that should be granted access to the administration interface. So,
+  make sure the following is set in the relevant context fragment:
+
+    <Parameter 
+        name="eu.clarin.cmdi.componentregistry.adminUsers" 
+		value="joe.admin@mpi.nl someone.else@clarin.eu"/>
+
+- Documentation url: The application expects a context parameter 
+  'eu.clarin.cmdi.componentregistry.documentationUrl' to be set. The application
+  redirects to this page when the user browses to /documentation.jsp or clicks
+  the 'help' link in the GUI.
+
+- Location parameters: a number of context parameters define locations of
+  schema and XSLT locations. Usually the defaults should be fine. The concerning
+  parameters are:
+  	* eu.clarin.cmdi.componentregistry.documentationUrl
+  	* eu.clarin.cmdi.componentregistry.generalComponentSchemaUrl
+  	* eu.clarin.cmdi.componentregistry.component2SchemaXslUrl
+  	* eu.clarin.cmdi.componentregistry.componentSpecSchemaLocation
+  	* eu.clarin.cmdi.componentregistry.ccrRestUrl
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/README
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/README	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/README	(revision 5961)
@@ -0,0 +1,120 @@
+CLARIN COMPONENT REGISTRY
+=========================
+
+What is it?
+-----------
+The Component Registry stores CMDI metadata components and profiles and
+offers a service to list and retrieve them. The BrowserGui is a web
+application displaying available components in the component registry in the
+correct context: application domain, creator, creation date, version, etc.
+The registry offers a hierarchical structure for browsing the components. 
+
+The componentRegistry is set up as a Flex Gui frontend communicating with a
+Java based backend (REST service).
+
+The ComponentRegistry is a central software component to the Clarin MetaData
+Infrastructure (CMDI). For more information on CMDI, see
+<http://www.clarin.eu/cmdi>.
+
+Documentation
+-------------
+- A set of TRAC pages for developers has been setup on the Clarin.eu TRAC at
+<http://trac.clarin.eu/wiki/ComponentRegistryAndEditor>. You will need a
+login to access these pages. To request one, contact <clarin@clarin.eu>.
+
+- The REST interface is documented at <http://www.clarin.eu/node/3248>.
+
+- Documentation for users is available at <http://www.clarin.eu/node/3223>.
+
+- Information on internally managing the application can be found at
+<https://trac.clarin.eu/wiki/ComponentRegistryAndEditor#Management>.
+
+Project structure
+-----
+This project contains two modules:
+
+- 'ComponentRegistry', a Java project that implements the Component Registry
+  REST service, administration pages and a web container for a client UI.
+- 'ComponentBrowserGui', a Flex project that implements a client for the
+  Component Registry REST service.
+
+How to set up for development/building from source
+--------------------------------------------------
+* Creating initial setup files:
+
+ - in ComponentBrowserGui: `mvn buildnumber:create flexmojos:flexbuilder` 
+	- This generates project files for Flash Builder. Open in FB using 
+	  File > Import Flex Project and use the 'Project Folder' option.
+ - in ComponentRegistry: `mvn eclipse:eclipse`  
+	- Generates eclipse configuration
+	- For NetBeans, simply open the POM as a project
+
+When using FlashBuilder to develop the ComponentBrowserGui, create a porject by 
+"Import a Flex project from an FXP, ZIP, or project folder".
+
+When using FlashBuilder to develop, make sure to configure the correct Flex SDK. It should
+be version 3.6, which you can download for free at <http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3sdk>.
+In addition, you should configure the project to build for Flash player 10.0.0 (instead of default minimum version
+provided by SDK).
+
+* Creating war artifact for local deployment:
+
+ - in ComponentBrowserGui: mvn install
+ - in ComponentRegistry: mvn package
+ 
+The ComponentRegistry war will include the flex swf file needed to start the application. 
+So deploying the resulting war will be enough to start the application.
+
+* Building for specific deployment environment
+By default the application is set to work when deployed on localhost. If you want to change that 
+change the serverRootUrl property in the pom.xml of ComponentRegistry. There are already build
+profiles for lux16.mpi.nl and catalog.clarin.eu that set these correctly. You can trigger
+these by providing the -Plux16 or -Pclarin options to mvn respectively.
+
+The rest service relies on a Component Registry database, for which a create script can be found in 
+the src/sql directory. For configuration instructions, see the comments in context.xml.
+
+* NOTE on generating java classes from general-component-schema.xsd.
+The ComponentRegistry needs the general-component-schema.xsd, which should be found at:
+1) ComponentRegistry/src/main/binding/ -> that directory has a svn:externals property pointing to the schema.
+Do a 'svn propget svn:externals' to see the property. Results in: 'http://svn.clarin.eu/metadata/trunk/toolkit/general-component-schema.xsd general-component-schema.xsd'
+
+* Missing some artifacts for Maven?:
+The ComponentBrowserGui project needs some swf files which are not in any maven repository I could find. 
+So install them manually: go to ComponentBrowserGui/libs/ and run the commands in maveninstalllib.txt
+
+* Developing and Debugging "ComponentRegistry" back-end. 
+ 
+Select the 'development' Maven profile (Netbeans has a dropdown menu for this) to get 
+logging output on the console.
+
+If, when trying to run the backend, you're getting errors from Spring stating that
+  "Name [ComponentRegistry] is not bound in this Context. Unable to find [ComponentRegistry]"
+it means that you do not have a JNDI resource for the database connection set up correctly.
+See the installation instructions for more information.
+ 
+* Developing and Debugging "ComponentBrowserGui". 
+
+Always make sure that ComponentRegistry-war grabbed the newest version of the Flex GUI. 
+For this you do "mvn install" in ComponentBrowserGui, and 
+then compile the backend in ComponentRegistry. Second of all, you should know that you can run and 
+debug the Gui from FlashBuilder.  For this you need to edit "Run/Debug" in the project properties.
+For instance,  if a bug to fix appears when fuilfilling the request 
+http://localhost:8080/ComponentRegistry/?item=clarin.eu:cr1:c_1288172614011&browserview=comments
+you need to make this uri an "URI to launch". To do this, you duplicate one of the existing 
+scenarios in Run/debug menu, and then EDIT the duplicated version by changing its "name" 
+and  "URI or path to launch" in the corresponding way.
+
+Make sure to download and install the DEBUG version of the Adobe Flash Player plugin from
+	<https://www.adobe.com/support/flashplayer/downloads.html>
+If you are using Chrome, make sure to also disable the built-in Flash player. See:
+	<https://support.google.com/chrome/answer/108086>
+
+ 
+Installation
+------------
+Please see the file called INSTALL
+
+Upgrading
+---------
+Please see the file called UPDATE
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/UPDATE
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/UPDATE	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/UPDATE	(revision 5961)
@@ -0,0 +1,99 @@
+UPDATING THE COMPONENT REGISTRY REST SERVICE AND FLEX UI
+
+Procedure for updating
+----------------------
+
+- When upgrading to a new version of the ComponentRegistry, check if there are
+  updates to the schema of the PostgreSQL database. These will be named 
+  upgrade-x.yy.sql, e.g. upgrade-1.10.sql for version 1.10.
+
+- If the database needs upgrading, first make a backup (dump) of the existing
+  database. Stop the application before doing so
+
+- Execute the upgrade script. When upgrading over multiple minor versions, 
+  execute the upgrade scripts incrementally
+
+- Make sure to grant all required rights (GRANT ALL unless specified
+  otherwise) to the component registry database user (usually compreg) on
+  any newly added tables, views, and sequences.
+
+- Then redeploy the WAR and start the application
+
+Version specific update instructions
+-------------------------------------
+
+=== 1.14.5 ===
+
+The context parameter eu.clarin.cmdi.componentregistry.isocatRestUrl has been replaced
+with the new parameter eu.clarin.cmdi.componentregistry.ccrRestUrl. An example 
+configuration with the default value for the new parameter is:
+
+
+  <Parameter 
+  		name="eu.clarin.cmdi.componentregistry.ccrRestUrl" 
+  		value="https://openskos.meertens.knaw.nl/ccr/api/"/>
+
+=== 1.14.2 ===
+
+No additional steps required.
+
+=== 1.14.1 ===
+
+No additional steps required.
+
+=== 1.14.0 ===
+
+- Execute DB update script upgrade-1.14.sql
+
+- Add the following context parameter (default values given):
+
+  <Parameter 
+	  name="eu.clarin.cmdi.componentregistry.jpaDialect" 
+	  value="org.hibernate.dialect.PostgreSQLDialect"/> 
+
+=== 1.13 ===
+
+- The following context fragment have been renamed, and should be updated
+  in the context fragment for the Component Registry:
+  
+  componentRegistryServiceRootUrl -> eu.clarin.cmdi.componentregistry.serviceRootUrl
+  componentRegistryAdminUsers -> eu.clarin.cmdi.componentregistry.adminUsers
+  
+  The results should look something like:
+  <Parameter 
+  		name="eu.clarin.cmdi.componentregistry.serviceRootUrl" 
+  		value="http://catalog.clarin.eu/ds/ComponentRegistry" /> 
+  <Parameter 
+  		name="eu.clarin.cmdi.componentregistry.adminUsers" 
+  		value="admin1@clarin.eu admin2@clarin.eu" />
+
+- The following should be added to the context fragment for the Component
+  Registry:
+
+	<Parameter
+			name="eu.clarin.cmdi.componentregistry.documentationUrl" 
+			value="http://www.clarin.eu/cmdi" /> 
+	<Parameter 
+			name="eu.clarin.cmdi.componentregistry.generalComponentSchemaUrl" 
+			value="https://infra.clarin.eu/cmd/general-component-schema.xsd" /> 
+	<Parameter 
+			name="eu.clarin.cmdi.componentregistry.component2SchemaXslUrl" 
+			value="https://infra.clarin.eu/cmd/xslt/comp2schema-v2/comp2schema.xsl" /> 
+	<Parameter 
+			name="eu.clarin.cmdi.componentregistry.componentSpecSchemaLocation" 
+			value="http://www.clarin.eu/cmd https://infra.clarin.eu/cmd/general-component-schema.xsd" /> 
+	<Parameter 
+			name="eu.clarin.cmdi.componentregistry.isocatRestUrl" 
+			value="https://catalog.clarin.eu/isocat/rest/" /> 
+			
+=== 1.11 ==
+
+- The following should be added to the context fragment for the Component
+  Registry:
+    <Parameter
+	name="componentRegistryAdminUsers"
+	value="space-separated-list-of-admin-eppns"/>
+
+- Added to database schema:
+	* comments
+	* comments_id_seq
Index: ComponentRegistry/tags/ComponentRegistry-1.14.5/pom.xml
===================================================================
--- ComponentRegistry/tags/ComponentRegistry-1.14.5/pom.xml	(revision 5961)
+++ ComponentRegistry/tags/ComponentRegistry-1.14.5/pom.xml	(revision 5961)
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>clarin.cmdi</groupId>
+  <artifactId>componentRegistry.parent</artifactId>
+  <name>componentRegistry_parent</name>
+  <packaging>pom</packaging>
+  <version>1.0</version>
+  <description>Parent pom for ComponentRegistry, see www.clarin.eu/cmdi.</description>
+  <modules>
+    <module>ComponentBrowserGui</module>
+    <module>ComponentRegistry</module>
+  </modules>
+
+  <scm>
+     <developerConnection>scm:svn:http://svn.clarin.eu/ComponentRegistry/trunk</developerConnection>
+  </scm>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <ComponentBrowserGui.version>1.14.5</ComponentBrowserGui.version>
+    <ComponentRegistry.version>1.14.5</ComponentRegistry.version>
+  </properties>
+  
+  <repositories>
+	<repository>
+		<id>cmdi.clarin.repository</id>
+		<name>Clarin Repository</name>
+		<url>http://catalog.clarin.eu/ds/nexus/content/groups/public/</url> 
+	</repository> 
+	
+ </repositories>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+        <version>2.7.2</version>
+        <configuration>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jxr-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>javancss-maven-plugin</artifactId>
+      </plugin>
+	  <plugin>
+		<groupId>org.codehaus.mojo</groupId>
+		<artifactId>cobertura-maven-plugin</artifactId>
+		<version>2.5.1</version>
+	    <configuration>
+          <formats>
+          	<format>xml</format>
+          </formats>
+		</configuration>
+	  </plugin>
+    </plugins>
+  </reporting>
+</project>
